안드로이드 앱 db 연동 - andeuloideu aeb db yeondong

안드로이드 어플리케이션은 외부 DB에 바로 접근해서 데이터를 불러오지 못합니다.

보안상의 이유때문에 '외부' 데이터베이스에 바로 접근은 하지못합니다.

안드로이드 앱 db 연동 - andeuloideu aeb db yeondong

따라서 위와같은 방식으로

애플리케이션 < -> PHP+아파치서버 <-> db에 통신하여 db를 가져오게된다.

안드로이드 앱 db 연동 - andeuloideu aeb db yeondong

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

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

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

먼저 실습을위해 

Maria DB , 아파치 , PHP 를 설치해야되는데

Maria DB를 설치를 위해서 https://downloads.mariadb.org/mariadb/10.3.17/

MariaDB 10.3.17 Stable - MariaDB

downloads.mariadb.org

안드로이드 앱 db 연동 - andeuloideu aeb db yeondong

본인의 운영체제에 맞게 설치해주시면 되고 

Maria DB가 설치가 완료 되면

시작메뉴를 열어서 Heider SQL을 실행해줍니다

안드로이드 앱 db 연동 - andeuloideu aeb db yeondong

신규를 눌러서 새로운 세션을 만들어주고

세션을 우클릭하여 이름을 변경해주신후 암호를 입력하고 열기를 누르면

test1의 DB가 열리게 됩니다

2. XAMPP 설치

아파치와 PHP는 XAMPP 를 통해 설치해준다. 

XAMPP는 Apache, MariaDB, PHP, Perl의 약자로 설치하려는 소프트웨어를 포함하여 여러가지 기능을 제공하고 있습니다.

XAMPP를 설치하기 위해서 먼저 https://www.apachefriends.org/index.html 링크로 들어갑니다.

들어가셔서 본인의 운영체제에 맞게 설치해주시면 됩니다.

설치가 완료되면 Apache 를 Start 해줍니다.

안드로이드 앱 db 연동 - andeuloideu aeb db yeondong

3. 설치,동작 확인 

C:\xampp\htdocs 폴더로 가셔서 info.php 파일을 만들어주시고

코드를 다음과같이 작성합니다.

안드로이드 앱 db 연동 - andeuloideu aeb db yeondong

<?php

$con=mysqli_connect("localhost","root","비밀번호") or die("MariaDB 접속 실패");

phpinfo();

mysqli_close($con);

?>

cs

이제

localohost/info.php 에 접속하시고

안드로이드 앱 db 연동 - andeuloideu aeb db yeondong

이런 화면이 나온다면  Apache, MariaDB, PHP가 제대로 동작된다고 보시면 됩니다.

참고:https://1d1cblog.tistory.com/

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 추가 : 첨부파일에 예제 소스코드가 들어있습니다.