먼저, 이 작업을 하기 위해서 Spring 프로젝트에서 pom.xml에 3가지 라이브러리를 추가해주어야 한다.
[필요 라이브러리]
1.org.jdom을 mvnrepoisitory에서 검색해 dependency를 pom.xml에 추가한다.
-> 자바 객체를 가지고 xml을 생성해주는 라이브러리
2.json-simple 도 추가
-> json 객체를 생성
3.jackson-databind 추가
-> 스프링 컨트롤러에서 @ResponseBody로 json으로 전송하기 위해 사용
3개의 라이브러리를 pom.xml에 추가했으면 다음으로 스프링 컨트롤러에서
XML로 보낼 데이터를 구성해 전달하는 코드를 작성해 주어야 한다.
(mvnrepository에서 검색해서 추가하자.)
그 다음 아래는 서버쪽 컨트롤러 코드에 대한 부분이다.
bookService.bookList()를 통해서 db에서 BookDTO 객체를 갖는 List를 반환받아서 이 List 정보를 XML 형태로 만들어서
return하는 내용의 코드이다. XML을 구성하는 부분은 주석으로 남겨 놓았다.
List<BookDTO> 를 가지고 구성할 XML 의 구성은 아래와 같다.
<books>
<book>
<book_code>1</book_code>
<book_name>자바</book_name>
<press>출판사</press>
</book>
</books>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | @ResponseBody // 리턴 자료형을 xml or json으로 반환 @RequestMapping(value="xml.do",produces="application/json;charset=utf-8") // json으로 만들고 utf-8 인코딩을 적용(한글깨지는 것 방지) public String xml(){ List<BookDTO> items = bookService.bookList(); // org.jdom2 패키지 // root 노드(태그) Element root = new Element("books"); // xml 문서 객체 Document doc = new Document(root); // xml 문서에 root 노드 설정, detach() : 새로운 문서를 만들기 전에 클리어(초기화)시킴 doc.setRootElement(root.detach()); String result = ""; for(BookDTO dto : items){ // 태그 생성 : <book>텍스트</book> Element data = new Element("book"); Element book_code = new Element("book_code"); book_code.setText(dto.getBook_code()+""); Element book_name = new Element("book_name"); book_name.setText(dto.getBook_name()); Element press = new Element("press"); press.setText(dto.getPress()); Element price = new Element("price"); price.setText(dto.getPrice()); Element amount = new Element("amount"); amount.setText(dto.getAmount()+""); data.addContent(book_code); data.addContent(book_name); data.addContent(press); data.addContent(price); data.addContent(amount); } //Document 타입을 스트링으로 변환 // xml 출력을 위한 객체 XMLOutputter xout = new XMLOutputter(); Format f = xout.getFormat(); // org.jdom2 xml 문서의 포맷설정 f.setEncoding("utf-8"); // 인코딩 방식 설정 f.setIndent("\t"); // 들여쓰기 문자 f.setLineSeparator("\r\n"); // 줄바꿈 문자 f.setTextMode(Format.textMode.TRIM); // 공백제거 xout.setFormat(f); // 문서 포맷 적용 result = xout.outputString(doc); // 문자열로 변환 return result; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | package com.example.kscs.androidspringconnection1.dto;/** * Created by kscs on 2017-06-04. */public class BookDTO { private int book_code; private String book_name; private String press; private int price; private int amount; // getter setter public int getBook_code() { return book_code; } public String getBook_name() { return book_name; } public String getPress() { return press; } public int getPrice() { return price; } public int getAmount() { return amount; } public void setBook_code(int book_code) { this.book_code = book_code; } public void setBook_name(String book_name) { this.book_name = book_name; } public void setPress(String press) { this.press = press; } public void setPrice(int price) { this.price = price; } public void setAmount(int amount) { this.amount = amount; } @Override public String toString() { return "BookDTO{" + "book_code=" + book_code + ", book_name='" + book_name + '\'' + ", press='" + press + '\'' + ", price=" + price + ", amount=" + amount + '}'; }} |
그리고 마지막으로 안드로이드에 관련된 작업이다.
역시 네트워크 작업임으로 앞에서 한 예제에서 주의해야하는 3가지 사항을 지켜주어야 한다.
1. 네트워크 작업임으로 백그라운드 스레드로 동작시켜야한다.
2. 네트워크 접근이 필요함으로 인터넷 권한을 주어야한다.
3. 백그라운드 스레드에서 메인 뷰에 접근할 수 없음으로 핸들러를 통해 처리해야한다.
위 사항을 기반으로해서 XMLPullparser를 이용해 데이터를 끄집어 내 핸들러를 통해 안드로이드에 출력해주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | package com.example.kscs.androidspringconnection1;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.ListViewCompat;import android.widget.ArrayAdapter;import android.widget.ListView;import com.example.kscs.androidspringconnection1.dto.BookDTO;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserFactory;import java.io.InputStream;import java.net.URL;import java.util.ArrayList;import java.util.List;public class XmlActivity extends AppCompatActivity implements Runnable{ // 1. 변수 선언 ListView list1; List<BookDTO> items; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_xml); // 2. 위젯 연결 list1 = (ListView)findViewById(R.id.listView1); items = new ArrayList<>(); // 3. 스레드 객체 생성 Thread th = new Thread(this); th.start(); } // 네트워크 작업임으로 백그라운드 스레드로 동작 @Override public void run() { // 네트워크에 접속, xml 리턴 try{ // 스프링 컨트롤러에서 xml로 만든 json을 리턴하는 RequestMapping url // xml 분석기 객체 생성 XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); // 스트림 생성 InputStream is = url.openStream(); // xml 분석기에 스트림을 입력 parser.setInput(is,"utf-8"); // xml 문서의 이벤트(태그의 시작, 끝 등) int eventType = parser.getEventType(); String tag; BookDTO dto = null; while( eventType != XmlPullParser.END_DOCUMENT ){ switch (eventType){ case XmlPullParser.START_TAG: // 시작 태그 tag = parser.getName(); // 태그의 이름 if ( tag.equals("book_name")){ dto = new BookDTO(); // 태그의 text를 가져와 세팅 dto.setBook_name(parser.nextText()); } // <press>영진</press> if(tag.equals("press")){ dto.setPress(parser.nextText()); } break; // </book> case XmlPullParser.END_TAG: tag = parser.getName(); if(tag.equals("book")){ items.add(dto); dto = null; } break; } eventType = parser.next(); // 다음으로 이동 } // 여기까지 수행하면 xml분석해서 List에 추가가 완료! }catch (Exception e){ e.printStackTrace(); } // 핸들러에게 메시지 호출(리스트뷰 갱신처리) // handlerMessage()가 호출됨 handler.sendEmptyMessage(1); } Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 리스트뷰에 출력 String[] books = new String[items.size()]; for(int i=0; i<books.length; i++){ BookDTO dto = items.get(i); books[i] = dto.getBook_name() + "(" + dto.getPress() + ")"; } // 어댑터 생성 ArrayAdapter<String> adapter = new ArrayAdapter<String>(XmlActivity.this,android.R.layout.simple_list_item_1,books); // 어댑터와 데이터 바인딩 list1.setAdapter(adapter); } };} |