오늘이라도

[Android] 29. 안드로이드 & DB & 서버(스프링) 연동 ① : 회원가입, 로그인 구현 본문

취업성공패키지 SW 개발자 교육/Android

[Android] 29. 안드로이드 & DB & 서버(스프링) 연동 ① : 회원가입, 로그인 구현

upcake_ 2020. 6. 17. 14:05
반응형

 

https://github.com/upcake/Class_Examples

교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다. 

gif 파일은 클릭해서 보는 것이 정확합니다.


 - 안드로이드 & DB & 서버(스프링) 연동 ① : 회원가입, 로그인 구현 -

○ 스프링 설치

  - https://spring.io/tools 

 

Spring Tools 4 is the next generation of Spring tooling

Largely rebuilt from scratch, Spring Tools 4 provides world-class support for developing Spring-based enterprise applications, whether you prefer Eclipse, Visual Studio Code, or Theia IDE.

spring.io

  - 스프링 공식 홈페이지에서 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를 누른다.

 

▲주어진 Member 테이블

  - 화면 구성시 주어진 테이블을 참고하여 화면을 만든다.

 

<?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

반응형