- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 등산로조성
- 코딩테스트
- 삼성역량테스트
- 비트마스킹
- 알고리즘
- Higher-Order
- kotiln
- 투포인터
- 코틀린
- #충무로맛집#골목식당#스테이크#
- MVVM
- nullalble
- 백준
- 싸피
- 안드로이드#코틀린#디자인패턴#싱글턴패턴#개발#앱개발
- 삼성청년sw아카데미
- DataBinding
- 자바
- 삼성파우치
- lateinit
- 탐탁삼성파우치
- Kotlin
- 탐탁노트북파우치
- 안드로이드
- ssafy서울
- tomtoc
- 아키텍처패턴
- bitmasking
- Android
- Java
공상하는 개발자
[안드로이드/android] 안드로이드 데이터베이스 연동해서 로그인 기능 구현(웹호스팅 사이트 이용) 본문
안녕하세요.
이번에는 제가 타임라인 프로젝트를 구현 중에 있는데 php를 통해서 어떻게
안드로이드와 연동을 시켰는지 보여드리겠습니다.
일단 저는 학생이기에 금전적인 여유가 많지 않아서 무료 웹 호스팅 사이트를 찾아보았는데요.
이리저리 구글링을 하다가 000webhosting 이라는 외국 호스팅 사이트를 발견했습니다.
이 사이트는 무료로 php 와 mysql을 지원해줍니다. 물론 트래픽 같은 부분에서 유료보다는 당연히 성능이
떨어지긴 하지만 그래도 혼자서 제작하는 프로젝트에서 쓰기에는 부족함이 없어 보입니다.
이 웹호스팅 사이트를 이용해서 간단한 로그인을 구현해보도록 하겠습니다.
1
2
3
4
5
6
7
|
create table user(
id varchar(20),
password varchar(20) not null default null,
nickname varchar(10) not null unique,
sex char(1) not null default 'm',
Api_Token varchar(20) default 'ERYON',
primary key(id,Api_Token));
|
일단 user 테이블을 생성해줍니다.

이처럼 잘 저장된 것을 볼 수 있습니다.
위처럼 회원가입과 로그인 페이지를 구현해봤습니다. 이제 기능을 구현하겠습니다.
먼저 회원가입 기능을 구현해보겠습니다.
SignupPage.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
private void insertoToDatabase(String Id, String Pw, String Name) {
class InsertData extends AsyncTask<String, Void, String> {
ProgressDialog loading;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
if(s.equalsIgnoreCase("회원가입에 성공하셨습니다.")){
Intent intent = new Intent(SignupPage.this, LoginActivity.class);
startActivity(intent);
finish();
}
else{
AlertDialog.Builder builder=new AlertDialog.Builder(SignupPage.this);
builder.setMessage(s)
.setNegativeButton("retry",null)
.create()
.show();
}
}
@Override
protected String doInBackground(String... params) {
try {
String Id = (String) params[0];
String Pw = (String) params[1];
String Name = (String) params[2];
String link = "https://eryon.000webhostapp.com/on_post.php";
URL url = new URL(link);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while ((line = reader.readLine()) != null) {
break;
}
return sb.toString();
} catch (Exception e) {
return new String("Exception: " + e.getMessage());
}
}
}
InsertData task = new InsertData();
task.execute(Id, Pw, Name);
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
on_post.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
$con = mysqli_connect('localhost', 'id10160302_ghkdua1829', 'gim1855', 'id10160302_eryon');
mysqli_set_charset($con,"utf8");
if (mysqli_connect_errno($con))
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$userid = $_POST['Id'];
$userpw = $_POST['Pw'];
$nickname=$_POST['Name'];
if($userid==null){
echo "아이디를 입력하시오.";
return 0;
}
else if($userpw==null){
echo "비밀번호를 입력하시오.";
return 0;
}
else if($nickname==null){
echo "이름을 입력하시오.";
}
else{
$result = mysqli_query($con,"insert into user (id,password,nickname) values ('$userid','$userpw','$nickname')");
}
if($result){
echo '회원가입에 성공하셨습니다.';
}
else{
echo '동일한 닉네임이 존재합니다.';
}
mysqli_close($con);
?>
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
AsyncTask를 이용해서 데이터를 파라미터 값으로 받아서 php 문으로 보내서 php 문에서 데이터를 삽입하는 과정입니다. 제가 id를 primary key로 지정해 놓았기 때문에 만약 같은 아이디가 있다면 sql문이 수행이 되지 않고 '동일한 닉네임이 존재합니다'라는 문구를 내보내게 됩니다.
그다음으로 로그인 기능 구현입니다.
LoginActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
Response.Listener<String> responseListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonResponse = new JSONObject(response);
boolean success = jsonResponse.getBoolean("success");
//서버에서 보내준 값이 true이면?
if (success) {
Toast.makeText(getApplicationContext(), "로그인에 성공하셨습니다.", Toast.LENGTH_SHORT).show();
String id = jsonResponse.getString("Id");
String nickname = jsonResponse.getString("NickName");
//로그인에 성공했으므로 whatthe로 넘어감
Intent intent = new Intent(LoginActivity.this, whatthe.class);
intent.putExtra("userID", id);
intent.putExtra("userName", nickname);
intent.putExtra("Api", "");
LoginActivity.this.startActivity(intent);
finish();
} else {//로그인 실패시
AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
builder.setMessage("로그인에 실패하셨습니다.")
.setNegativeButton("retry", null)
.create()
.show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
LoginRequest loginRequest = new LoginRequest(idText.getText().toString(), passwordText.getText().toString(), responseListener);
RequestQueue queue = Volley.newRequestQueue(LoginActivity.this);
queue.add(loginRequest);
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
LoginRequest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
public class LoginRequest extends StringRequest {
//현재 안드로이드앱을 에뮬레이터로 돌리므로 에뮬레이터가 설치된 서버에 있는 아파치 서버에 접근하려면
//다음과 같이 10.0.2.2:포트번호 로 접근해야합니다 저는 8080 포트를 써서 다음과 같이 했습니다
private Map<String, String> parameters;
//생성자
public LoginRequest(String userID, String userPassword, Response.Listener<String> listener){
parameters = new HashMap<>();
parameters.put("id", userID);
parameters.put("password", userPassword);
TrustManager[] dummyTrustManager = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
try { //https 접근때문에 SSL 인증서가 필요해서 써놓은것.
SSLContext sc = SSLContext.getInstance("SSL");
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
on_loginReq.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
$con = mysqli_connect('localhost', 'id10160302_ghkdua1829', 'gim1855', 'id10160302_eryon');
$id = $_POST["id"];
$password = $_POST["password"];
$statement = mysqli_prepare($con, "SELECT * FROM user WHERE id = ? AND password = ?");
mysqli_stmt_bind_param($statement, "ss", $id, $password);
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $id, $password, $nickname,$sex,$apitoken );
$response = array();
$response["success"] = false;
while(mysqli_stmt_fetch($statement)){
$response["success"] = true;
$response["Id"] = $id;
$response["NickName"] = $nickname;
$response["Sex"] = $sex;
$response["ApiToken"] = $apitoken;
}
echo json_encode($response);
?>
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
이걸로 로그인 쿼리를 수행하고 그 로그인 정보를 받아서 메인 액티비티로 보낼 수 있습니다.
'개발 > 안드로이드' 카테고리의 다른 글
[안드로이드/android] FCM 푸시알람 구현 (0) | 2019.07.22 |
---|---|
[안드로이드/android] sns 친구맺기 데이터 스트럭쳐 (0) | 2019.07.22 |
[안드로이드/android] SharedPreferences 를 이용한 자동로그인 구현과 포스트이름 나타내기 (0) | 2019.07.22 |
[안드로이드/android] 이미지 호스팅을 통한 url로 이미지 받아오기 (0) | 2019.07.22 |
[안드로이드/android] 카카오톡 API 로그인 자신의 데이터베이스에 연동시키기(php 서버 이용) (0) | 2019.07.22 |