이번에는 안드로이드에서 스프링 프로젝트로 요청시 JSON으로 서버에서 제공하는 데이터를 가져오는 방식을 다루어 보겠습니다.
1. 먼저, 스프링 프로젝트에서 pom.xml에 라이브러리를 추가합니다.
1) jackson-databind 추가
: @ResponseBody로 반환시 필요
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
2) jason-simple 추가
: JSONObject와 같은 json 객체 생성시 필요
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
2. 다음으로 스프링 컨트롤러 부분을 작성합니다. 스프링 컨트롤러에서 다음의 코드를 입력합니다.
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 | <span style= "font-size: 12pt;" > @RequestMapping (value= "json.do" ,produces= "application/json;charset=utf-8" ) public @ResponseBody JSONObject json(){ // json-simple 라이브러리 추가 필요(JSON 객체 생성) JSONObject jsonMain = new JSONObject(); // json 객체 // {변수명:값, 변수명:값} // {sendData:[{변수명:값},{변수명:값},...]} List<BookDTO> items = bookService.bookList(); JSONArray jArray = new JSONArray(); // json배열 for ( int i= 0 ; i<items.size(); i++){ BookDTO dto = items.get(i); JSONObject row = new JSONObject(); // json객체.put("변수명",값) row.put( "book_code" , dto.getBook_code()); row.put( "book_name" , dto.getBook_name()); row.put( "press" , dto.getPress()); row.put( "price" , dto.getPrice()); row.put( "amount" , dto.getAmount()); // 배열에 추가 // json배열.add(인덱스,json객체) jArray.add(i,row); } // json객체에 배열을 넣음 jsonMain.put( "sendData" , jArray); return jsonMain; } </span> |
여기 Android일 땐 보이지 않지만
Project로 변경시 app/libs 폴더가 보입니다. 그러면 이 폴더에 다운받은 2개의 라이브러리를 집어 넣습니다.
다음으로, android 형식으로 보기를 다시 누르고, Gradle Scripts 의 build.gradle 부분에 들어가서
dependency 부분에
다음의 2줄을 추가해줍니다.
compile files('libs/httpclient-4.2.2.jar')
compile files('libs/httpcore-4.2.2.jar')
그리고 Sync Now 선택해주면 적용이 된 것입니다.
3. 이제 안드로이드에서 코드를 작성합니다.
역시 네트워크 작업임으로 이전에서 했던 3가지 사항을 준수합니다.
1) 인터넷 사용 권한 설정(manifest에)
<!-- 인터넷 접속 권한 추가 -->
<uses-permission android:name="android.permission.INTERNET" />
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 | package com.example.kscs.androidspringconnection1; import android.graphics.Bitmap; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import com.example.kscs.androidspringconnection1.dto.BookDTO; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; public class JsonActivity extends AppCompatActivity implements Runnable{ // 1. 변수 선언 ListView listView1; List<BookDTO> items; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_json); // 2. 위젯 연결 listView1 = (ListView)findViewById(R.id.listView1); items = new ArrayList<>(); // 3. 백그라운드 스래드 생성 Thread th = new Thread( this ); th.start(); } // 네트워크 작업임으로 백그라운드 스레드로 동작시키기 위함(의무) @Override public void run() { try { // httpclient-4.2.2.jar와 httpcore-4.2.2.jar를 mvnrepository에서 찾아 Files에 Download jars를 해 받음 // app/libs에 추가 // 이때, android상태에서는 libs가 안보임으로 project로 변경해서 // lib에 받은 jar파일 2개를 넣어준다. // http client 객체 HttpClient http = new DefaultHttpClient(); // post 방식으로 전송하는 객체 // http클라이언트.execute(httppost객체) : 웬서버에 데이터를 전달 // 결과(json)가 response로 넘어옴 HttpResponse response = http.execute(httpPost); // body에 json 스트링이 넘어옴 String body = EntityUtils.toString(response.getEntity()); // string을 JSONObject로 변환 JSONObject jsonObj = new JSONObject(body); // json객체.get("변수명") JSONArray jArray = (JSONArray)jsonObj.get( "sendData" ); for ( int i= 0 ; i<jArray.length();i++){ // json배열.getJSONObject(인덱스) JSONObject row = jArray.getJSONObject(i); BookDTO dto = new BookDTO(); dto.setAmount(row.getInt( "amount" )); dto.setBook_code(row.getInt( "book_code" )); dto.setBook_name(row.getString( "book_name" )); dto.setPress(row.getString( "press" )); dto.setPrice(row.getInt( "price" )); dto.setAmount(row.getInt( "amount" )); // ArrayList에 add items.add(dto); } // 핸들러에게 메시지를 요청 handler.sendEmptyMessage( 0 ); } catch (Exception e){ e.printStackTrace(); } } // 핸들러 Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super .handleMessage(msg); // 어댑터 생성 String[] str = new String[items.size()]; for ( int i= 0 ; i<str.length; i++){ BookDTO dto = items.get(i); str[i] = dto.getBook_name() + "(" + dto.getPress() + ")" ; } ArrayAdapter<String> adapter = new ArrayAdapter<String>(JsonActivity. this ,android.R.layout.simple_list_item_1,str); // adapter와 data 바인딩 listView1.setAdapter(adapter); } }; } |
// NameValuePair : 변수명과 값을 함께 저장하는 객체로 제공되는 객체이다.
ArrayList<NameValuePair> postData = new ArrayList<>();
// post 방식으로 전달할 값들을 postData 객체에 집어 넣는다.
postData.add(new BasicNameValuePair("id","아이디"));
postData.add(new BasicNameValuePair("pw","패스워드"));
// url encoding이 필요한 값들(한글, 특수문자) : 한글은 인코딩안해주면 깨짐으로 인코딩을 한다.
UrlEncodedFormEntity request = new UrlEncodedFormEntity(postData,"utf-8");
HttpPost httpPost = new HttpPost(url);
// post 방식으로 전달할 데이터 설정
httpPost.setEntity(request);
// post 방식으로 전송, 응답결과는 response로 넘어옴
HttpResponse response = http.execute(httpPost);
// response text를 스트링으로 변환
String body = EntityUtils.toString(response.getEntity());
// 스트링을 json으로 변환한다.
JSONObject obj = new JSONObject(body);// 스프링 컨트롤러에서 리턴해줄 때 저장했던 값을 꺼냄
String message = obj.getString("message");
과 같이 작성하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // NameValuePair : 변수명과 값을 함께 저장하는 객체로 제공되는 객체이다. ArrayList<NameValuePair> postData = new ArrayList<>(); // post 방식으로 전달할 값들을 postData 객체에 집어 넣는다. postData.add( new BasicNameValuePair( "id" , "아이디" )); postData.add( new BasicNameValuePair( "pw" , "패스워드" )); // url encoding이 필요한 값들(한글, 특수문자) : 한글은 인코딩안해주면 깨짐으로 인코딩을 한다. UrlEncodedFormEntity request = new UrlEncodedFormEntity(postData, "utf-8" ); HttpPost httpPost = new HttpPost(url); // post 방식으로 전달할 데이터 설정 httpPost.setEntity(request); // post 방식으로 전송, 응답결과는 response로 넘어옴 HttpResponse response = http.execute(httpPost); // response text를 스트링으로 변환 String body = EntityUtils.toString(response.getEntity()); // 스트링을 json으로 변환한다. JSONObject obj = new JSONObject(body); // 스프링 컨트롤러에서 리턴해줄 때 저장했던 값을 꺼냄 String message = obj.getString( "message" ); |