오늘이라도
[Android] 29. 안드로이드 & DB & 서버(스프링) 연동 ① : 회원가입, 로그인 구현 본문
[Android] 29. 안드로이드 & DB & 서버(스프링) 연동 ① : 회원가입, 로그인 구현
upcake_ 2020. 6. 17. 14:05
https://github.com/upcake/Class_Examples
교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다.
gif 파일은 클릭해서 보는 것이 정확합니다.
- 안드로이드 & DB & 서버(스프링) 연동 ① : 회원가입, 로그인 구현 -
○ 스프링 설치
- 스프링 공식 홈페이지에서 Spring Tools 4 for Eclipse (STS 4)를 다운로드 하고 워크스페이스를 지정한다.
- 기존의 서버를 지우고 새 서버를 추가하는데 AnSpring_App을 Add해준다.
○ 대략적인 회원 가입 통신 과정
1. 매니페스트
권한설정
라이브러리 설정
http 허가 설정
2. 빌드 라이브러리 사용 설정
안드로이드와 통신할 수 있는 버전 가져오기
3. 다 넣고 싱크
4. 조인 화면(XML)을 테이블 참고해서 만듬
취소 = finish
가입버튼 = DB와 연동하기위해 조인인서트만들고 입력받은 데이터를 보냄
5. 조인인서트는 AsyncTask 상속받아서 만듬
비동기 : 내가 한일 던져두고 할일하다가 그쪽에서 끄탠고 보내주는거 받는것이 비동기
생성자로 데이터 받음
멀티파트엔티티빌드 : 문자, 숫자, 사진 등이 입력될 수 있어서 사용
DB에 사진을 저장할때는 사진 자체가 아닌, 서버에 저장된 사진 위치, 이름을 저장
사진은 서버에 저장
톰캣 : 로컬서버
서버에는 어느 공간에 컨테이너란게 있어서 서블릿형태로 저장
서버 가동 후 server.xml에 현재 서버에 돌아가고있는 앱들이 올라옴
path="" << 여기안에 든게 이름 192.168.0.5:8080/app/ 이런 형태
사진을 볼때는 DB의 사진 위치가 적힌 URL을 참조하는 라이브러리를 활용해서 서버의 사진을 본다
빌더에 조인 액티비티에서 받은 데이터와 문자열을 추가함
postURL = ipconfig + /app/anJoin >> anJoin을 찾게끔 지정하고
httpClinet.execute로 서버에 보낸다
아직 유동 IP를 사용하므로 같은 와이파이망에서만 사용가능
6. anJoin은 스프링의 AController.java에서 맵핑한다 (@requestMapping의 value값)
execute로 보낸 리퀘스트에서 파라미터들을 가져옴 (id 패스워드 등)
받은 파라미터들이 제대로 왓는가 sysout으로 확인
모델 : 내부 데이터 저장소 << model에 받은 파라미터들을 다시 집어 넣는다 (MVC의 모델)
모델 안에는 뭐든지 들어갈수 있다
execute로 보냄
7. AJoinCommand에서 모델로 받는다.
모델에서 받은 데이터들을 String에 받는다
DAO는 DB하고 연동하는 메서드를 모아두는 클래스
DAO 객체를 만들고 anJoin 메서드를 만든다
8. DAO에서 컨텍스트에서 설정한 데이터 소스를 찾는다 (team01)
9. anJoin메서드에서 DB에 데이터를 삽입하는 쿼리문을 작성한다 그리고 그 쿼리문을 state에 담아서 넘김
10. 다시 커맨드에서 anJoin메서드로 리턴된 state를 받고 스트링 형태로 바꿔서 모델에 집어넣는다
11. 컨트롤러로 와서 "anJoin"을 리턴한다 여기서 anJoin은 찾는 jsp의 이름에 state를 보낸다는 뜻
jsp를 찾게끔 지정이 되어있다.
안드로이드에 무언가를 보낼때는 jsp로 보낸다
12. anJoin.jsp에서 보낸 state를 받고 출력한다.
DTO, Gson, JsonObject 등의 필요한 Model을 임포트한다
13. JSP에서 출력한 state는 joininsert.java httpResponse에서 받는다
받아서 inputStream에 넣는다
버퍼, 스트링빌더 등을 사용해서 state를 만든다.
만든 state를 리턴한다.
14. joinActivity에서 가입버튼 눌렀을때 joininsert에서 리턴한 state를 받는다
1이면 삽입성공 아니면 삽입실패
15. 크롬키고 주소창에 http://192.168.0.20:8080/app/anJoin?id=aaa&passwd=bbb&name=ccc
실패 -100
성공 1
1이 나왔다면 sql developer에서 제대로 삽입되었는지 확인할 수 있따.
1이 나왔다면 서버에는 이상이 없다는 뜻
소스를 보면 앞뒤로 공백이 많은데 이 공백을 없애고 정확한 데이터를 받기 위해 trim()을 사용한다.
JSON 파싱할때 특히 공백이나, <html>등의 태그가 있는지 주의할것
16. 이제 안드로이드 에뮬레이터 말고 스마트폰에서 제대로 회원가입이 되는지 확인해본다
○ 작동 화면 및 안드로이드 코드
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.my50_project">
<!-- 권한 부여 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity android:name=".Sub1"></activity>
<!-- https가 아니라 http가 와도 허가하는 부분 -->
<!-- JoinActivity를 Intent로 부르기 위한 설정 -->
<activity android:name=".JoinActivity" /> <!-- http 라이브러리 사용 -->
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
▲AndroidManifest.xml
- 매니페스트에서 권한 설정, 라이브러리 설정, HTTP 허가 설정을 한다.
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.example.my50_project"
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
/*http 사용하는 라이브러리*/
useLibrary 'org.apache.http.legacy'
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
/*안드로이드와 통신할 수 있는 버전 가져오기*/
implementation group: 'org.apache.httpcomponents', name: 'httpclient-android', version: '4.3.5.1'
implementation('org.apache.httpcomponents:httpmime:4.3') {
exclude module: "httpclient"
}
}
▲build.gradle (:app)
- HTTP 라이브러리 사용 설정과 안드로이드와 통신할 수 있는 버전을 가져온다.
- 필요한 것을 다 가져왔다면 Sync를 누른다.
- 화면 구성시 주어진 테이블을 참고하여 화면을 만든다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/etId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginStart="99dp"
android:layout_marginLeft="99dp"
android:layout_marginTop="108dp"
android:layout_marginEnd="98dp"
android:layout_marginRight="98dp"
android:ems="10"
android:hint="ID"
android:inputType="textPersonName" />
<EditText
android:id="@+id/etPASSWD"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginStart="101dp"
android:layout_marginLeft="101dp"
android:layout_marginTop="176dp"
android:layout_marginEnd="96dp"
android:layout_marginRight="96dp"
android:ems="10"
android:hint="PASSWORD"
android:inputType="textPersonName" />
<Button
android:id="@+id/btnLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="82dp"
android:layout_marginLeft="82dp"
android:layout_marginTop="275dp"
android:text="로그인" />
<Button
android:id="@+id/btnJoin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="275dp"
android:layout_marginEnd="78dp"
android:layout_marginRight="78dp"
android:text="회원가입" />
</RelativeLayout>
▲activity_main.xml
package com.example.my50_project;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.my50_project.ATask.LoginSelect;
import com.example.my50_project.DTO.MemberDTO;
import java.util.concurrent.ExecutionException;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
// 로그인이 성공하면 static 로그인DTO 변수에 담아서
// 어느곳에서나 접근할 수 있게 한다
public static MemberDTO loginDTO = null;
EditText etID, etPASSWD;
Button btnLogin, btnJoin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkDangerousPermissions();
etID = findViewById(R.id.etId);
etPASSWD = findViewById(R.id.etPASSWD);
btnLogin = findViewById(R.id.btnLogin);
btnJoin = findViewById(R.id.btnJoin);
//로그인 버튼
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(etID.getText().toString().length() != 0 &&
etPASSWD.getText().toString().length() != 0) { //아이디와 비밀번호의 길이가 0이 아니면
String id = etID.getText().toString();
String passwd = etPASSWD.getText().toString();
LoginSelect loginSelect = new LoginSelect(id, passwd);
try {
loginSelect.execute().get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(loginDTO != null) {
Log.d(TAG, "onClick: id:" + loginDTO.getId());
} else { //로그인 정보가 맞지 않으면 토스트창 띄우고 id, pw칸 지우고 id칸에 포커스
Toast.makeText(MainActivity.this, "아이디나 비밀번호가 틀렸습니다.", Toast.LENGTH_SHORT).show();
etID.setText("");
etPASSWD.setText("");
etID.requestFocus();
}
}
}
});
//회원 가입 버튼
btnJoin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), JoinActivity.class);
startActivity(intent);
}
});
}
private void checkDangerousPermissions() {
String[] permissions = {
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_WIFI_STATE
};
int permissionCheck = PackageManager.PERMISSION_GRANTED;
for (int i = 0; i < permissions.length; i++) {
permissionCheck = ContextCompat.checkSelfPermission(this, permissions[i]);
if (permissionCheck == PackageManager.PERMISSION_DENIED) {
break;
}
}
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "권한 있음", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "권한 없음", Toast.LENGTH_LONG).show();
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
Toast.makeText(this, "권한 설명 필요함.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(this, permissions, 1);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == 1) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, permissions[i] + " 권한이 승인됨.", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, permissions[i] + " 권한이 승인되지 않음.", Toast.LENGTH_LONG).show();
}
}
}
}
}
▲MainActivity.java
package com.example.my50_project.ATask;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.util.JsonReader;
import android.util.Log;
import com.example.my50_project.Common.CommonMethod;
import com.example.my50_project.DTO.MemberDTO;
import static com.example.my50_project.Common.CommonMethod.ipConfig;
import static com.example.my50_project.MainActivity.loginDTO;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class LoginSelect extends AsyncTask<Void, Void, String> {
private static final String TAG = "main LoginSelect";
String id, passwd;
// 데이터베이스에 삽입결과 0보다크면 삽입성공, 같거나 작으면 실패
// 필수 부분
//String state = ""; 로그인에서는 state를 안쓰기때문에 필요없다
HttpClient httpClient;
HttpPost httpPost;
HttpResponse httpResponse;
HttpEntity httpEntity;
public LoginSelect(String id, String passwd) {
this.id = id;
this.passwd = passwd;
}
@Override
protected String doInBackground(Void... voids) {
try {
// MultipartEntityBuild 생성
// 필수 부분
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setCharset(Charset.forName("UTF-8"));
// 문자열 및 데이터 추가
builder.addTextBody("id", id, ContentType.create("Multipart/related", "UTF-8"));
builder.addTextBody("passwd", passwd, ContentType.create("Multipart/related", "UTF-8"));
String postURL = ipConfig + "/app/anLogin";
// /app/ 뒤에는 서버의 AController에 적힌 맵핑과 동일하게 적는다.
// 전송
InputStream inputStream = null;
httpClient = AndroidHttpClient.newInstance("Android");
httpPost = new HttpPost(postURL);
httpPost.setEntity(builder.build());
httpResponse = httpClient.execute(httpPost); //여기 라인에서 DB에 보냄
httpEntity = httpResponse.getEntity();
inputStream = httpEntity.getContent();
//응답 : JSON형태로 받음
loginDTO = readMessage(inputStream);
Log.d(TAG, "doInBackground: " + loginDTO.getId());
} catch (Exception e) {
e.printStackTrace();
}finally {
if(httpEntity != null){
httpEntity = null;
}
if(httpResponse != null){
httpResponse = null;
}
if(httpPost != null){
httpPost = null;
}
if(httpClient != null){
httpClient = null;
}
} //try catch finally
return "LoginDTO select complete";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.d(TAG, "onPostExecute: " + result);
}
public MemberDTO readMessage(InputStream inputStream) throws IOException {
JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));
String id = "", name = "", phonenumber = "", address = "";
//비밀번호는 가져올 필요가 없고, 보안을 위해 가져오지 않는다.
reader.beginObject();
while (reader.hasNext()) {
String readStr = reader.nextName();
if (readStr.equals("id")) {
id = reader.nextString();
} else if (readStr.equals("name")) {
name = reader.nextString();
} else if (readStr.equals("phonenumber")) {
phonenumber = reader.nextString();
} else if (readStr.equals("address")) {
address = reader.nextString();
}else {
reader.skipValue();
}
}
reader.endObject();
Log.d(TAG, id + "," + name + "," + phonenumber + "," + address);
return new MemberDTO(id, name, phonenumber, address);
}
}
▲LoginSelect.java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="34dp"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="42dp"
android:layout_marginLeft="42dp"
android:layout_marginTop="78dp"
android:text="ID : "
android:textSize="18sp" />
<EditText
android:id="@+id/etId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="73dp"
android:layout_marginEnd="38dp"
android:layout_marginRight="38dp"
android:ems="10"
android:inputType="textPersonName" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="148dp"
android:text="PASSWORD : " />
<EditText
android:id="@+id/etPasswd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="137dp"
android:layout_marginEnd="38dp"
android:layout_marginRight="38dp"
android:ems="10"
android:inputType="textPersonName" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:layout_marginTop="213dp"
android:text="NAME : " />
<EditText
android:id="@+id/etName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="202dp"
android:layout_marginEnd="38dp"
android:layout_marginRight="38dp"
android:ems="10"
android:inputType="textPersonName" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="17dp"
android:layout_marginLeft="17dp"
android:layout_marginTop="283dp"
android:text="PhoneNumber : " />
<EditText
android:id="@+id/etPhoneNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="271dp"
android:layout_marginEnd="38dp"
android:layout_marginRight="38dp"
android:ems="10"
android:inputType="textPersonName" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerVertical="true"
android:layout_marginStart="19dp"
android:layout_marginLeft="19dp"
android:layout_marginTop="353dp"
android:text="Address : " />
<EditText
android:id="@+id/etAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginTop="345dp"
android:layout_marginEnd="38dp"
android:layout_marginRight="38dp"
android:ems="10"
android:inputType="textPersonName" />
<Button
android:id="@+id/btnJoin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="94dp"
android:layout_marginLeft="94dp"
android:layout_marginTop="438dp"
android:text="가입" />
<Button
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginTop="438dp"
android:layout_marginEnd="89dp"
android:layout_marginRight="89dp"
android:text="취소" />
</RelativeLayout>
▲activity_join.xml
package com.example.my50_project;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.my50_project.ATask.JoinInsert;
import java.util.concurrent.ExecutionException;
public class JoinActivity extends AppCompatActivity {
private static final String TAG = "main JoinActivity";
String state;
EditText etId, etPasswd, etName, etPhoneNum, etAddress;
Button btnJoin, btnCancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_join);
etId = findViewById(R.id.etId);
etPasswd = findViewById(R.id.etPasswd);
etName = findViewById(R.id.etName);
etPhoneNum = findViewById(R.id.etPhoneNum);
etAddress = findViewById(R.id.etAddress);
btnJoin = findViewById(R.id.btnJoin);
btnCancel = findViewById(R.id.btnCancel);
//가입 버튼
btnJoin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String id = etId.getText().toString();
String passwd = etPasswd.getText().toString();
String name = etName.getText().toString();
String phonenumber = etPhoneNum.getText().toString();
String address = etAddress.getText().toString();
JoinInsert joinInsert = new JoinInsert(id, passwd, name, phonenumber, address);
try {
state = joinInsert.execute().get().trim(); //.get() : 데이터가 도착하기 전에 조회하는 것을 방지
Log.d(TAG, "onClick: " + state);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(state.equals("1")) {
Log.d(TAG, "onClick: 삽입 성공");
finish();
} else {
Log.d(TAG, "onClick: 삽입 실패");
finish();
}
}
});
//취소 버튼
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
▲JoinActivity.java
package com.example.my50_project.ATask;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.util.Log;
import com.example.my50_project.Common.CommonMethod;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class JoinInsert extends AsyncTask<Void, Void, String> {
private static final String TAG = "main JoinInsert";
// 데이터베이스에 삽입결과 0보다크면 삽입성공, 같거나 작으면 실패
// 필수 부분
String state = "";
HttpClient httpClient;
HttpPost httpPost;
HttpResponse httpResponse;
HttpEntity httpEntity;
//메인 액티비티의 변수를 받기 위해 변수를 선언하고 생성자를 만든다.
//무언가를 받고자 할때는 대부분 생성자를 이용한다.
String id, passwd, name, phonenumber, address;
public JoinInsert(String id, String passwd, String name, String phonenumber, String address) {
this.id = id;
this.passwd = passwd;
this.name = name;
this.phonenumber = phonenumber;
this.address = address;
}
//기본으로 생성되는 메서드, 지금은 필요 없다
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(Void... voids) {
try {
// MultipartEntityBuild 생성
// 필수 부분
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setCharset(Charset.forName("UTF-8"));
// 문자열 및 데이터 추가
builder.addTextBody("id", id, ContentType.create("Multipart/related", "UTF-8"));
builder.addTextBody("passwd", passwd, ContentType.create("Multipart/related", "UTF-8"));
builder.addTextBody("name", name, ContentType.create("Multipart/related", "UTF-8"));
builder.addTextBody("phonenumber", phonenumber, ContentType.create("Multipart/related", "UTF-8"));
builder.addTextBody("address", address, ContentType.create("Multipart/related", "UTF-8"));
String postURL = CommonMethod.ipConfig + "/app/anJoin";
// 전송
InputStream inputStream = null;
httpClient = AndroidHttpClient.newInstance("Android");
httpPost = new HttpPost(postURL);
httpPost.setEntity(builder.build());
httpResponse = httpClient.execute(httpPost); //여기 라인에서 DB에 보냄
httpEntity = httpResponse.getEntity();
inputStream = httpEntity.getContent();
// 응답
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuilder stringBuilder = new StringBuilder();
String line = null;
while ((line = bufferedReader.readLine()) != null){
stringBuilder.append(line + "\n");
}
state = stringBuilder.toString();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(httpEntity != null){
httpEntity = null;
}
if(httpResponse != null){
httpResponse = null;
}
if(httpPost != null){
httpPost = null;
}
if(httpClient != null){
httpClient = null;
}
}
return state;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.d(TAG, "onPostExecute: " + result);
}
}
▲JoinInsert.java
package com.example.my50_project.Common;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
public class CommonMethod {
/*public static String ipConfig = "http://192.168.200.151:8989";*/
public static String ipConfig = "http://192.168.0.20:8080";
//public static String ipConfig = "http://121.148.239.200:80";
// 네트워크에 연결되어 있는가
public static boolean isNetworkConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService( Context.CONNECTIVITY_SERVICE );
NetworkInfo info = cm.getActiveNetworkInfo();
if(info != null){
if(info.getType() == ConnectivityManager.TYPE_WIFI){
Log.d("isconnected : ", "WIFI 로 설정됨");
}else if(info.getType() == ConnectivityManager.TYPE_MOBILE){
Log.d("isconnected : ", "일반망으로 설정됨");
}
Log.d("isconnected : ", "OK => " + info.isConnected());
return true;
}else {
Log.d("isconnected : ", "False => 데이터 통신 불가!!!" );
return false;
}
}
}
▲CommonMethod.java
'취업성공패키지 SW 개발자 교육 > Android' 카테고리의 다른 글
[Android] 31. 안드로이드 & DB & 서버(스프링) 연동 ③ : 로그인 후 화면 출력, 사진 클릭, 사진 촬영 후 등록, 앨범에 있는 사진 등록 (0) | 2020.06.19 |
---|---|
[Android] 30. 안드로이드 & DB & 서버(스프링) 연동 ② : 로그인 후 서브 화면 구성, 서버 연결 까지 (11) | 2020.06.18 |
[Do it! 안드로이드] 03. 첫 번째 앱 만들기 / 03-1. 첫 프로젝트 만들기 (0) | 2020.06.16 |
[Android] 28. AsyncTask (0) | 2020.06.16 |
[Do it! 안드로이드] I. Hello! 안드로이드 / 01. 안드로이드란? / 01-1. 안드로이드 이해하기 / 01-2. 안드로이드의 흐름 살펴보기 (0) | 2020.06.15 |