Back-End/그 외

[Android] Android 와 Spring 연동

HMHA 2023. 2. 9. 13:33
300x250
반응형

Android, Spring(웹) 연동

 

 

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

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

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

 

 

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

 

Spring 프로젝트 생성

 

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

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

 

    @RequestMapping("/android3")
    public void androidTestWithRequest(HttpServletRequest request){
        System.out.println(request.getParameter("title"));
        System.out.println(request.getParameter("memo"));
    }​

 

 

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

 

최소버전은 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에 추가한다.

 

컨트롤러의 메소드를 

 

    @RequestMapping("/android3")
    @ResponseBody
    public Map<String, String> androidTestWithRequestAndResponse(HttpServletRequest request){
        System.out.println(request.getParameter("title"));
        System.out.println(request.getParameter("memo"));
        
        Map<String, String> result = new HashMap<String, String>();
        result.put("data1", "메모에요");
        result.put("data2", "두번째 메모입니다.");
        
        return result;
    }​

 

 

이와같이 수정한다.

 

 

안드로이드 스튜디오에서 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());
}

 

 

 

 

 


출처 : https://best421.tistory.com/86

 

[Android] Android 와 Spring 연동

Android, Spring(웹) 연동 안드로이드와 웹을 연동하는 실습을 하기위해 메모장을 만들어보기로 했다. 안드로이드 어플에서 Web으로 요청을 하면 Web에서 DB를 통해 데이터를 가져와 Android로 보낸다.

best421.tistory.com

 

300x250
반응형