안드로이드 스튜디오 DB 연동 - andeuloideu seutyudio DB yeondong

Android

45. [SCSC 강의] 안드로이드 - Mysql 연동 / 안드로이드 데이터베이스 연동

2016. 05. 30 추가.

안드로이드 프로그래밍에 대한 기초적인 지식이 없으시면 따라하기 힘들지도 모릅니다.

기본적인 개념들은 저한테 물으시는 것보다 도서관에서 Do It! 안드로이드 프로그래밍 같은 책 하나 빌려서 정독하시는걸 추천드려요..

안드로이드 스튜디오를 사용해 mysql과 연동하는 방법을 설명하려고 한다. 

기존 이클립스 + Java 환경에서는 JDBC 라이브러리를 사용해 직접 Mysql에 접근할 수 있었다. 다음과 같이 사용하면 자바 소스코드 상에서 mysql의 데이터를 직접 꺼내올 수 있었다.

그러나 안드로이드에서는 보안상의 이유로 외부 라이브러리와의 직접 연동을 막아놓았다. 그래서 아래와 같이 중간 매개를 통해 데이터베이스의 데이터를 꺼내와야만 한다.

즉, PHP에서 Mysql의 데이터에 접근해 echo 로 웹페이지에 mysql의 내용을 띄워 주면, 그 내용을 안드로이드에서 읽어오는 것이다. 간단히 그림으로 설명하자면 다음과 같다.

안드로이드에서 http 요청을 통해 아파치 웹서버의 php파일이 출력하고 있는 내용을 읽어오는 것이다. 즉, 위 사진에서 

Seq : 1 Author : Yong...... 등의 내용을 가져온다. 위 웹페이지에서 띄워진 내용들은 모두 echo로 띄운 것이다.

백문이 불여일견이므로 바로 시작..

안드로이드 스튜디오를 켠 다음 왼쪽의 manifest.xml 파일을 수정한다. 외부로의 접근을 위한 인터넷 사용 허가 설정이다.

위에서 밑줄쳐져있는 <uses-permission...></uses-permission> 라인을 추가해주면 된다. 잘 모르겠으면 그냥 똑같이 따라하시길.

다음은 java 폴더에서 사용하는 패키지(Test 말고)를 오른쪽 클릭 - New - Java Class를 선택하고, URLConnector 라는 클래스를 만든다. 

그리고 다음 소스를 집어넣는다.

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

/**

 * Created by alicek on 2015-10-10.

 */

class URLConnector extends Thread {

private String result;

private String URL;

public URLConnector(String url){

URL = url;        

}

@Override

public void run() {

final String output = request(URL);

result = output;

}

public String getResult(){

return result;

}

private String request(String urlStr) {

StringBuilder output = new StringBuilder();

try {

URL url = new URL(urlStr);

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

if (conn != null) {

conn.setConnectTimeout(10000);

conn.setRequestMethod("GET");

conn.setDoInput(true);

conn.setDoOutput(true);

int resCode = conn.getResponseCode();

if (resCode == HttpURLConnection.HTTP_OK) {

BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())) ;

String line = null;

while(true) {

line = reader.readLine();

if (line == null) {

break;

}

output.append(line + "\n");

}

reader.close();

conn.disconnect();

}

}

catch(Exception ex) {

Log.e("SampleHTTP""Exception in processing response.", ex);

ex.printStackTrace();

}

return output.toString();

}

}

cs

필자는 URL이라는 String 변수를 추가한 뒤, URLConnector 객체를 만들 때 세팅하도록 만들었다. 즉, 생성자에서 URL을 설정한다.

또한 http 요청이 끝나서 결과를 가져온 뒤 result 멤버 변수에 저장하고, 그 변수를 getResult로 가져올 수 있도록 했다.

아래는 MainActivity.java에서의 소스코드이다. 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

task = new URLConnector(test);

task.start();

try{

task.join();

System.out.println("waiting... for result");

}

catch(InterruptedException e){

}

String result = task.getResult();

System.out.println(result);

}

cs

주의해야 할 부분은, 위에서 test 변수(URL)을 localhost라고 적었는데,실제 아이피를 적어야만 한다. localhost 말고 아이피를 적으시길.

그리고 깜빡하고 안적었는데, 안드로이드에서 외부로의 call은 메인쓰레드가 아닌 다른 쓰레드를 사용한다. 즉, URLConnector는 Thread 객체이므로 Thread의 작업이 끝날때까지 기다리는 동기화를 위해 task.join() 을 사용했다. 이렇게 하면 쓰레드가 끝날때까지 join에서 머무르게 된다. 

참고로 결과값은 콘솔창에 출력한다(마지막 줄의 System.out.println).

그리고 이제는 php를 만들 차례이다. 

php의 내용을 자바 소스로 가져왔을 때 편하게 다루기 위해서 JSON으로 변환하는 작업을 거쳤다. 조금 귀찮더라도 자바에서 사용하기 쉽게 되므로 JSON으로 변환하는 작업을 하자.....

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

<?php

$conn = mysqli_connect("localhost""root""autoset""simpleboard");

$query = "select seq, author, title, content from board";

if($result = mysqli_query($conn$query)){

$row_num = mysqli_num_rows($result);

echo "{";

echo "\"status\":\"OK\",";

echo "\"rownum\":\"$row_num\",";

echo "\"result\":";

echo "[";

for($i = 0$i < $row_num$i++){

$row = mysqli_fetch_array($result);

echo "{";

echo "\"seq\":\"$row[seq]\", \"author\":\"$row[author]\", \"title\":\"$row[title]\", \"content\":\"$row[content]\"";

echo "}";

if($i<$row_num-1){

echo ",";

}

}

echo "]";

echo "}";

}

else{

echo "failed to get data from database.";

}

?>

cs

mysql 관련한 IP, 계정, 비밀번호, DB, 테이블, 스키마 등은 알아서 적당히 바꾸도록... 하자. 여러분의 사정에 맞게 바꾸자. 데이터를 호출하는 부분도 마찬가지다. 필자는 simpleboard라는 데이터베이스에 board라는 테이블에서 seq, author, title, content 라는 열을 가져왔다.

그럼 위 php 파일을 실행시키면 다음과 같이 출력될 터이다.

그럼 이제 안드로이드 스튜디오에서 위의 내용을 가져올 것이다. 이미 작성해놓은 안드로이드 스튜디오에서 실행을 해보면 콘솔 창에서 출력이 될 것이다(System.out.println 으로 result를 출력했기 때문에)

잘 나오는 것을 확인할 수 있다.

JSON으로 가져왔기 때문에 파싱을 해야겠지만, 그건 다음 포스트에서 다루도록 한다.

2016.2.12 추가 : 첨부파일에 예제 소스코드가 들어있습니다.