티스토리 뷰

Android, Spring(웹) 연동



안드로이드와 웹을 연동하는 실습을 하기위해 메모장을 만들어보기로 했다.


안드로이드 어플에서 Web으로 요청을 하면 Web에서 DB를 통해 데이터를 가져와 Android로 보낸다.


안드로이드는 이 데이터를 받아서 SQLite에 저장한다.



  • 안드로이드에서 웹으로 데이터 전송


Spring 프로젝트 생성


STS에 웹프로젝트를 생성한다.


컨트롤러를 생성하고 Map 형태로 파라미터를 주고받는 테스트용 메소드를 생성한다.


1
2
3
4
5
    @RequestMapping("/android3")
    public void androidTestWithRequest(HttpServletRequest request){
        System.out.println(request.getParameter("title"));
        System.out.println(request.getParameter("memo"));
    }
cs



안드로이드 프로젝트 생성, 인터넷 권한


최소버전은 16으로 설정하고 안드로이드 프로젝트를 생성한다.



인터넷 권한을 위해 Android Manifest에 permission을 준다.

<uses-permission android:name="android.permission.INTERNET" />



HttpClient 클래스 생성


package com.ktds.jmj.myremoteweb;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


public class HttpClient {

private static final String WWW_FORM = "application/x-www-form-urlencoded";

private int httpStatusCode;
private String body;

public int getHttpStatusCode() {
return httpStatusCode;
}

public String getBody() {
return body;
}

private Builder builder;

private void setBuilder(Builder builder) {
this.builder = builder;
}

public void request() {
HttpURLConnection conn = getConnection();
setHeader(conn);
setBody(conn);
httpStatusCode = getStatusCode(conn);
body = readStream(conn);
conn.disconnect();
}

private HttpURLConnection getConnection() {
try {
URL url = new URL(builder.getUrl());
return (HttpURLConnection) url.openConnection();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

private void setHeader(HttpURLConnection connection) {
setContentType(connection);
setRequestMethod(connection);

connection.setConnectTimeout(5000);
connection.setDoOutput(true);
connection.setDoInput(true);
}

private void setContentType(HttpURLConnection connection) {
connection.setRequestProperty("Content-Type", WWW_FORM);
}

private void setRequestMethod(HttpURLConnection connection) {
try {
connection.setRequestMethod(builder.getMethod());
} catch (ProtocolException e) {
e.printStackTrace();
}
}

private void setBody(HttpURLConnection connection) {

String parameter = builder.getParameters();
if ( parameter != null && parameter.length() > 0 ) {
OutputStream outputStream = null;
try {
outputStream = connection.getOutputStream();
outputStream.write(parameter.getBytes("UTF-8"));
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if ( outputStream != null )
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

private int getStatusCode(HttpURLConnection connection) {
try {
return connection.getResponseCode();
} catch (IOException e) {
e.printStackTrace();
}

return -10;
}

private String readStream(HttpURLConnection connection) {
String result = "";
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line = null;
while ( (line = reader.readLine()) != null ) {
result += line;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(reader != null)
reader.close();
} catch (IOException e) {}
}

return result;
}

public static class Builder {

private Map<String, String> parameters;
private String method;
private String url;

public String getMethod() {
return method;
}

public String getUrl() {
return url;
}

public Builder(String method, String url) {
if(method == null) {
method = "GET";
}
this.method = method;
this.url = url;
this.parameters = new HashMap<String, String>();
}

public void addOrReplace(String key, String value) {
this.parameters.put(key, value);
}

public void addAllParameters(Map<String, String> param) {
this.parameters.putAll(param);
}

public String getParameters() {
return generateParameters();
}

public String getParameter(String key) {
return this.parameters.get(key);
}

private String generateParameters() {
StringBuffer parameters = new StringBuffer();

Iterator<String> keys = getKeys();

String key = "";
while ( keys.hasNext() ) {
key = keys.next();
parameters.append(String.format("%s=%s", key, this.parameters.get(key)));
parameters.append("&");
}

String params = parameters.toString();
if ( params.length() > 0 ) {
params = params.substring( 0, params.length() - 1 );
}

return params;
}

private Iterator<String> getKeys() {
return this.parameters.keySet().iterator();
}

public HttpClient create() {
HttpClient client = new HttpClient();
client.setBuilder(this);
return client;
}

}

}



NetworkTask 생성 


NetworkTask는 AsyncTask를 상속받는 클래스이다.


AsyncTask 는 추상클래스이고 부모클래스이다.



package com.ktds.jmj.myremoteweb;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.widget.TextView;

import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends ActionBarActivity {

private TextView tvTitle;
private TextView tvMemo;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tvTitle = (TextView) findViewById(R.id.tvTitle);
tvMemo = (TextView) findViewById(R.id.tvMemo);

NetworkTask2 networkTask = new NetworkTask2();

Map<String, String> params = new HashMap<String, String>();
params.put("title", "메모입니다.");
params.put("memo", "메모를 입력했습니다.");

networkTask.execute(params);

}

public class NetworkTask2 extends AsyncTask<Map<String, String>, Integer, String> {
@Override
protected String doInBackground(Map<String, String>... maps) { // 내가 전송하고 싶은 파라미터

// Http 요청 준비 작업
HttpClient.Builder http = new HttpClient.Builder("POST", "http://아이피주소:8080/SpringToAndroid/android3");

// Parameter 를 전송한다.
http.addAllParameters(maps[0]);


//Http 요청 전송
HttpClient post = http.create();
post.request();

// 응답 상태코드 가져오기
int statusCode = post.getHttpStatusCode();

// 응답 본문 가져오기
String body = post.getBody();

return body;
}

@Override
protected void onPostExecute(String s) {

}
}

}


안드로이드를 실행시키면 STS에 안드로이드에서 보낸 데이터가 출력된다. 

params.put("title", "메모입니다.");
params.put("memo", "메모를 입력했습니다.");

메모입니다.

메모를 입력했습니다.


가 출력될 것이다.




  • 웹에서 안드로이드로 데이터전송


STS에 Dependency 추가

웹에서 안드로이드로 데이터를 전송하기 위해서 STS에서 pom.xml에 jackson-databind를 Dependency에 추가한다.


컨트롤러의 메소드를 


1
2
3
4
5
6
7
8
9
10
11
12
    @RequestMapping("/android3")
    @ResponseBody
    public Map<StringString> androidTestWithRequestAndResponse(HttpServletRequest request){
        System.out.println(request.getParameter("title"));
        System.out.println(request.getParameter("memo"));
        
        Map<StringString> result = new HashMap<StringString>();
        result.put("data1""메모에요");
        result.put("data2""두번째 메모입니다.");
        
        return result;
    }
cs



이와같이 수정한다.



안드로이드 스튜디오에서 NetworkTask를 수정


onPostExecute에서 로그를 찍어 받은 데이터를 확인해본다.


public class NetworkTask2 extends AsyncTask<Map<String, String>, Integer, String> {
@Override
protected String doInBackground(Map<String, String>... maps) { // 내가 전송하고 싶은 파라미터

// Http 요청 준비 작업
HttpClient.Builder http = new HttpClient.Builder("POST", "http://10.225.152.179:8080/SpringToAndroid/android3");

// Parameter 를 전송한다.
http.addAllParameters(maps[0]);


//Http 요청 전송
HttpClient post = http.create();
post.request();

// 응답 상태코드 가져오기
int statusCode = post.getHttpStatusCode();

// 응답 본문 가져오기
String body = post.getBody();

return body;
}

@Override
protected void onPostExecute(String s) {
Log.d("JSON_RESULT", s);

}
}


결과적으로 데이터가 성공적으로 넘어올 것이다.



GSON


안드로이드에서는 웹으로부터 데이터를 JSON 형식으로 받게된다.


GSON은 Java Object를 JSON 형식으로 주고 받을 수 있또록 도와준 것으로 구글에서 만든 라이브러리 이다.


안드로이드에서 build.gradle(Module:app)을 열어 Dependencies에 gson을 추가한다.


dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:21.0.0'
compile 'com.google.code.gson:gson:2.7'
}


추가하고 Sync Now를 클릭한다.



Data 자바 클래스 생성


데이터를 받아오기 위해 Data라는 자바 클래스를 생성한다.


package com.ktds.jmj.myremoteweb;

/**
* Created by 206-020 on 2016-06-21.
*/
public class Data {

private String data1;
private String data2;

public String getData1() {
return data1;
}

public void setData1(String data1) {
this.data1 = data1;
}

public String getData2() {
return data2;
}

public void setData2(String data2) {
this.data2 = data2;
}
}



NetworkTask 수정


로그를 찍어 출력했던 onPostExecute 에서 받은 데이터를 Gson을 이용해 Data 형 객체로 만든다.


@Override
protected void onPostExecute(String s) {
Log.d("JSON_RESULT", s);

Gson gson = new Gson();

Data data = gson.fromJson(s, Data.class);
Log.d("JSON_RESULT", data.getData1());
Log.d("JSON_RESULT", data.getData2());

tvTitle.setText(data.getData1());
tvMemo.setText(data.getData2());
}







댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함