유혁의 개발 스토리

[Android] 안드로이드 <-> Servlet <-> Mysql 연동 (3) - Android, Servlet 연동 본문

Android

[Android] 안드로이드 <-> Servlet <-> Mysql 연동 (3) - Android, Servlet 연동

유혁. 2017. 7. 13. 15:56

 

 

지난시간에는 서버와 데이터베이스를 연동하였는데

 

확인하는 방법이 없었습니다.

 

제이유닛 사용하면 확인은 가능하겠으나

 

우리는 어짜피 안드로이드와 연동이 목적이므로

 

안드로이드와 서버를 연동하겠습니다.

 

 

 

 

이제부터 안드로이드 스튜디오에서 작업합니다.

 

프로젝트를 생성합니다. 저는 DBconn이라는 이름으로 생성하겠습니다.

 

 

안드로이드와 서버의 HTTP 통신 방식이 안드로이드 6.0 버전 이상부터 달라진거로

 

알고있습니다.

 

HttpURLConnection 을 사용하여야합니다.

 

SDK버전이 높은환경에서 연동하시려면 다른 방법을 사용해야합니다.

 

(HttpURLConnection을 사용한 방법은

아래에 따로 설명합니다.)

 

 

프로젝트 생성 후 gradle(Module:app) 의 정보부터 수정하고

 

컴파일 SDK 버전부터 맞춰주고 시작하겠습니다.

 

 저는 컴파일 SDK 버전을 19로 맞추고 시작하겠습니다.

 

 

 

 

gradle(Module:app)

apply plugin: 'com.android.application'

android {
compileSdkVersion 19
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.jy.dbconn"
minSdkVersion 15
targetSdkVersion 22
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

}

dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.google.zxing:core:3.2.0'
compile 'com.google.code.gson:gson:2.4'
compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
compile 'commons-net:commons-net:3.3'
compile 'com.android.support:multidex:1.0.1'
testCompile 'junit:junit:4.12'
}

이 상태로 해주시고 동기화 시켜줍니다.

 

 

 

 

 

 

MainActivity를 작성합니다.

 

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import java.util.ArrayList;

public class MainActivity extends Activity {
private ProgressDialog pDialog;


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

getList a = new getList();
a.execute();
}



class getList extends AsyncTask<Void, String, Void> {
String LoadData;
@Override
protected void onPreExecute() {
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("검색중입니다..");
pDialog.setCancelable(false);
pDialog.show();
super.onPreExecute();
}

@Override
protected Void doInBackground(Void... param) {
// TODO Auto-generated method stub

try {
HttpParams httpParameters = new BasicHttpParams();
HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);

HttpClient client = new DefaultHttpClient(httpParameters);

HttpConnectionParams.setConnectionTimeout(httpParameters, 7000);
HttpConnectionParams.setSoTimeout(httpParameters, 7000);
HttpConnectionParams.setTcpNoDelay(httpParameters, true);

// 주소
String postURL = "http://210.105.203.225:8080/yoohyeok/DBConnection";

HttpPost post = new HttpPost(postURL);
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();

// params.add(new BasicNameValuePair("ProjectID", PID));
// params.add(new BasicNameValuePair("Itemleft", IL));
// params.add(new BasicNameValuePair("Itemright", IR));

UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, HTTP.UTF_8);
post.setEntity(ent);

long startTime = System.currentTimeMillis();

HttpResponse responsePOST = client.execute(post);

long elapsedTime = System.currentTimeMillis() - startTime;
Log.v("debugging", elapsedTime + " ");

HttpEntity resEntity = responsePOST.getEntity();
if (resEntity != null) {
LoadData = EntityUtils.toString(resEntity, HTTP.UTF_8);
}

} catch (Exception e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
pDialog.dismiss();

}
}

}

postURL은 서버의 IP를 입력해줍니다.

 

 

210.105.203.225 <- 이부분만 수정하면 됩니다. (프로잭트 생성 이름이 저와 같다면 IP만 변경)

 

 

레이아웃은 아직 필요는 없고 MainActivity에서 시작과 동시에

 

getList라는 객체를 excute()하기에

 

지난시간에 만들어둔 서버로 접근하게 됩니다.

 

 

 

 

AVD로 테스트 해봅시다!

 

 

 

AVD를 실행하면 자동으로 어플리케이션이 실행됩니다.

 

XML을 꾸민게 없기에 기본 페이지가 나오는게 맞습니다.

 

 

 

 

 

 

 

서버에서 확인해볼까요?

 

안드로이드가 서블릿에 접속함을 확인하였습니다.

 

 

 

 

주는게 있으면 받는게 있겠죠?

 

안드로이드가 URL을 호출하면

 

서버에서 데이터를 안드로이드에게 전달해줍니다.

 

그냥 데이터를 줄수도 있지만

 

뺴놓을 수 없죠

 

서버에서 json 형식으로 전달하겠습니다.

 

 

 

 

 

 

 

Spring에서 json라이브러리를 다운받아야합니다.

 

우리는 Maven이 있기 때문에 직접 찾아가서 다운로드 하지 않아도 됩니다.

 

자동으로 라이브러리를 관리해주니까요!

 

 

 

메이븐 추가하기전에 서버를 끄고 해주세요!

 

 

 

 

 

pom.xml

 

 

추가해줍니다.

 

 

 

 

이제는 눈감고도 추가 가능하겠죠?

 

 

 

 

 

 

 

 

Servlet

AndroidConnection.java 를 수정합니다.

 

 

 

 

다음과 같이 수정합니다.

 

JSON객체 에러가 나올시 MAVEN 인스톨이 되지않아서 그렇습니다.

 

다시 진행해주세요!

 

서버동작 꼭 끄고 clean 후 install 해줍시다!

 

 

 

안드로이드에서 Log로 데이터가 들어오느지 확인해봅시다!

 

 

 

데이터가 들어오네요!

 

이제 이 데이터를 가지고 파싱하여 사용하시면 됩니다.

 

!!!! 주의 !!!! AVD로 테스트하였을 땐 HTTP에러가 나옵니다..

거절하였다는데

 

정확한이유는 모르겠으나 테스트는 실제 디바이스를 이용해서 하였습니다.

 

AVD로 개발하지 않아서 이런 에러가 발생할 줄 몰랐습니다.

(구글링해서 찾아봐야하나..)

 

SDK 19버전의 HttpClient를 이용한 통신이였습니다.

 

 

--------------------------------------------------------------------------------------------------------------------

 

 

Android 6.0 버전 이상의 HttpURLConnection 입니다.

 

 

gradle(Module: app)

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.jy.dbconn"
minSdkVersion 15
targetSdkVersion 23
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

}

dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.google.zxing:core:3.2.0'
compile 'com.google.code.gson:gson:2.4'
compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
compile 'commons-net:commons-net:3.3'
compile 'com.android.support:multidex:1.0.1'
testCompile 'junit:junit:4.12'
}

 

SDK 버전을 23으로 합니다.

 

 

 

HttpURLConnection 객체 이용

 

MainActivity.class

 


import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public class MainActivity extends Activity {
private ProgressDialog pDialog;
private static final String URL_ADDRESS = "http://210.105.203.225:8080/yoohyeok/DBConnection"; //주소 변경
String LoadData;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getList a = new getList();
a.execute();
}


class getList extends AsyncTask<Void, String, Void> {

@Override
protected void onPreExecute() {
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("검색중입니다..");
pDialog.setCancelable(false);
pDialog.show();
super.onPreExecute();
}

@Override
protected Void doInBackground(Void... param) {
// TODO Auto-generated method stub

try{

URL Url = new URL(URL_ADDRESS); // URL화 한다.
HttpURLConnection conn = (HttpURLConnection) Url.openConnection(); // URL을 연결한 객체 생성.
conn.setRequestMethod("POST"); // get방식 통신
conn.setDoOutput(true); // 쓰기모드 지정
conn.setDoInput(true); // 읽기모드 지정
conn.setUseCaches(false); // 캐싱데이터를 받을지 안받을지
conn.setDefaultUseCaches(false); // 캐싱데이터 디폴트 값 설정

InputStream is = conn.getInputStream(); //input스트림 개방

StringBuilder builder = new StringBuilder(); //문자열을 담기 위한 객체
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8")); //문자열 셋 세팅
String line;

while ((line = reader.readLine()) != null) {
builder.append(line+ "\n");
}

LoadData = builder.toString();
Log.i("LoadData",LoadData);
}catch(MalformedURLException | ProtocolException exception) {
exception.printStackTrace();
}catch(IOException io){
io.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
pDialog.dismiss();
}
}

}

 

이건 AVD로 테스트가 됩니다.

 

아마 AVD SDK 버전 문제였던거 같습니다.

 

AVD SDK 버전은 21입니다.

 

로그확인 잘나옵니다.

 

이상입니다.

 

안되시거나 질문은 댓글 달아주시면 답변해드릴게요!