1. 빌드 절차 개괄 설명
서버통신 라이브러리 설치 - 로그인 화면과 회원가입 화면 구성 및 activtiy 구성 - 호스팅 도메인 준비 및 회원가입 정보를 서버에 저장할 방식 설정 - 각 기능을 정리한 request 파일에 연결 - 로그인 이후 실행할 활동 MainActivity에 정의
2. 세부절차 예시
1) build gradle의 app_level에서 'com.android.volley:volley:1.2.1'(서버 통신과 관련한 라이브러리)를 implementation함
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.android.volley:volley:1.2.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
2) activity_main에 TextView를 이용해 로그인 화면을 설정
3) jave에 RegisterActivity, LoginActivty를 생성(회원가입, 로그인 화면)
package com.example.registerloginexample;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
public class RegisterActivity extends AppCompatActivity {
private EditText et_id, et_pass, et_name, et_age;
private Button btn_register;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) { // 엑티비티 시작 시 처음으로 실행되는 생명주기
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
// 아이디 값 찾아주기
et_id = findViewById(R.id.et_id);
et_pass = findViewById(R.id.et_pass);
et_name = findViewById(R.id.et_name);
et_age = findViewById(R.id.et_age);
// 회원가입 버튼 클릭 시 수행
btn_register = findViewById(R.id.btn_register);
btn_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// EditText에 현재 입력되어있는 값을 가져온다.
String userID = et_id.getText().toString();
String userPass = et_pass.getText().toString();
String userName = et_name.getText().toString();
int userAge = Integer.parseInt(et_id.getText().toString());
Response.Listener<String> responseListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// json object를 활용한 데이터 전송(parsing 포함)
try {
JSONObject jsonObject = new JSONObject(response);
boolean success = jsonObject.getBoolean("success"); // php 키값을 가져올 때 성공여부가 참일 경우 실행
if(success) { // 회원등록에 성공한 경우
Toast.makeText(getApplicationContext(), "회원 등록에 성공하였습니다.", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
} else { // 실패한 경우
Toast.makeText(getApplicationContext(), "회원 등록에 실패하였습니다.", Toast.LENGTH_SHORT).show();
return;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
// 서버로 Volley를 이용해서 요청을 함
RegisterRequest registerRequest = new RegisterRequest(userID, userPass, userName, userAge, responseListener);
RequestQueue queue = Volley.newRequestQueue(RegisterActivity.this);
queue.add(registerRequest);
}
});
}
}
package com.example.registerloginexample;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
public class LoginActivity extends AppCompatActivity {
private EditText et_id, et_pass;
private Button btn_login, btn_register;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
et_id = findViewById(R.id.et_id);
et_pass = findViewById(R.id.et_pass);
btn_login = findViewById(R.id.btn_login);
btn_register = findViewById(R.id.btn_register);
// 회원가입 버튼 클릭 시 수행
btn_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String userID = et_id.getText().toString();
String userPass = et_pass.getText().toString();
Response.Listener<String> responseListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
boolean success = jsonObject.getBoolean("success"); // php 키값을 가져올 때 성공여부가 참일 경우 실행
if(success) { // 로그인에 성공한 경우
String userID = jsonObject.getString("userID");
String userPass = jsonObject.getString("userPassword"); // php 키값이 userPassword임
Toast.makeText(getApplicationContext(), "로그인에 성공하였습니다.", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("userID", userID);
intent.putExtra("userPass", userPass);
} else { // 실패한 경우
Toast.makeText(getApplicationContext(), "로그인에 실패하였습니다.", Toast.LENGTH_SHORT).show();
return;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
LoginRequest loginRequest = new LoginRequest(userID, userPass, responseListener);
RequestQueue queue = Volley.newRequestQueue(LoginActivity.this);
queue.add(loginRequest);
}
});
}
}
4) RegisterActivity 생성과 동시에 자동으로 생성되는 activity_register.xml의 레이아웃 설정(로그인도 마찬가지)
5) manifest에서 인터넷 권한을 선언하고 intent-filter를 login activity 사이에 위치해서 최초 화면이 되도록 함
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET"/> <!--인터넷 권한 선언-->
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.RegisterLoginExample"
tools:targetApi="31">
<activity
android:name=".LoginActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity
android:name=".RegisterActivity"
android:exported="false">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
</application>
</manifest>
6) 호스팅 도메인 준비, FileZilla 설치(무료 FTP 접속 프로그램을 통해 호스트, 사용자명, 비밀번호, 포트번호를 작성하여 연결할 수 있게 만듦 / MySQL이 기본으로 설치 됨, 그리고 서버 스크립트인 php 파일(로그인, 회원가입)을 추가해야함. php구문이 통신 수단이 됨)
7) 도메인 어드민페이지에 들어가서 SQL문으로 데이터베이스 준비(데이터 정렬방식은 utf8 해야 한글 정렬 가능)
8) RegisterRequest, LoginRequest.java를 생성 후 설정
package com.example.registerloginexample;
import androidx.annotation.Nullable;
import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
import java.util.HashMap;
import java.util.Map;
public class RegisterRequest extends StringRequest {
// 서버 URL 설정(php 파일 연동)
final static private String URL = "http://yoonkoog2002.dothome.co.kr/Register.php";
private Map<String, String> map;
public RegisterRequest(String userID, String userPassword, String userName, int userAge, Response.Listener<String>listener){
super(Method.POST, URL, listener, null);
map = new HashMap<>();
map.put("userID", userID);
map.put("userPassword", userPassword);
map.put("userName", userName);
map.put("userAge", userAge + "");
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return map;
}
}
package com.example.registerloginexample;
import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
import java.util.HashMap;
import java.util.Map;
public class LoginRequest extends StringRequest {
// 서버 URL 설정(php 파일 연동)
final static private String URL = "http://yoonkoog2002.dothome.co.kr/Login.php";
private Map<String, String> map;
public LoginRequest(String userID, String userPassword, Response.Listener<String>listener){
super(Method.POST, URL, listener, null);
map = new HashMap<>();
map.put("userID", userID);
map.put("userPassword", userPassword);
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return map;
}
}
9) MainActivty에서 로그인 후 실행할 활동을 선언
package com.example.registerloginexample;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView tv_id, tv_pass;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_id = findViewById(R.id.tv_id);
tv_pass = findViewById(R.id.tv_pass);
Intent intent = getIntent();
String userID = intent.getStringExtra("userID");
String userPass = intent.getStringExtra("userPass");
tv_id.setText(userID);
tv_pass.setText(userPass);
}
}
3. Intent
1) 개념
- 구성요소 간 상호작용하는 데 사용되는 객체
- 데이터 전달, 가져오기, 호출, 실행 등의 기능을 함
- 쉽게 생각해서 앱 내에서 데이터를 intent에 실어 보내고 받아온다고 생각하면 간단
2) vs. Json
- json은 javascript object notation의 약자로 데이터 형식을 말함
- 또한 웹 상에서 서버와 앱 간 소통을 위해 주고 받아지는 데이터로 정의 가능
- json이 사용되는 이유는 문자열로 이루어진 데이터로 파싱이 용이하여 가장 흔하게 사용하는 데이터 형식임
'Development > Android Studio' 카테고리의 다른 글
(Android Studio) Chapter17. Room Database (0) | 2023.03.25 |
---|---|
(Android Studio) Chapter16. Life Cycle (0) | 2023.03.21 |
(Android Studio) Chapter14. Layout (0) | 2023.03.16 |
(Android Studio) Chapter13. ConstraintLayout, BottomNavigation (0) | 2023.03.11 |
(Android Studio) Chapter12. github (loading) (0) | 2023.03.05 |