코딩하는 해달이

파이썬 - Flask를 이용해서 JSON인코딩한 MySql 데이터를 Android Studio에 보내기 (2) 본문

개인 공부/Android Studio

파이썬 - Flask를 이용해서 JSON인코딩한 MySql 데이터를 Android Studio에 보내기 (2)

코딩하는 해달 2022. 8. 19. 18:38

Version & 참고 링크

더보기

 

저번 포스팅에서 파이썬 flask를 이용해 mysql에 있는 데이터를 url에 json형태로 표시하는 작업을 했습니다.

파이썬 - Flask를 이용해서 JSON인코딩한 MySql 데이터를 Android Studio에 보내기 (1)

 

이제는 url에 있는 데이터를 Android Studio로 받아와서 앱 상에 띄워보도록 하겠습니다.

 

앱은 여러 url에서 데이터를 가져올 수 있게 하기 위해 url을 입력받으면 해당 url의 데이터를 가져오는 방식으로 만들어보도록 하겠습니다.

 

안드로이드 스튜디오에서 DBconnect라는 프로젝트를 생성합니다.

그 후 앱이 인터넷에 접속할 수 있는 권한을 주기위해 매니페스트(Manifest)를 변경합니다.

매니페스트 xml

아래의 두 코드를 사진과 같이 입력하면 됩니다.

<uses-permission android:name="android.permission.INTERNET" />
android:usesCleartextTraffic = "true"

AndroidManifest.xml 코드

그 후에 layout과 MainActivity를 변경해주면 되는데 layout부터 변경해주겠습니다.

아래와 같이 코드를 입력하거나. 팔레트에서 Button 등을 꺼내서 디자인을 만들어줍니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.09"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText"
        app:layout_constraintVertical_bias="0.067" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="출력"
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.809"
        app:layout_constraintStart_toEndOf="@+id/editText"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="278dp"
        android:layout_height="44dp"
        android:layout_marginStart="24dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="링크를 입력해주세요"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

디자인 예시

다음은 MainActivity 입니다. 코드 설명은 아래 코드에 주석으로 달려있으니 확인해보시면 됩니다.

package org.techtown.dbconnect;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.net.HttpURLConnection;
import java.net.URL;


import java.io.BufferedReader;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    EditText editText; // url 주소를 입력받는 텍스트 박스
    TextView textView; // 입력받은 url 에서 가져온 정보를 표시하는 텍스트 박스

    String urlStr; // url 주소 받을 변수

    Handler handler = new Handler();// Thread에서 전달받은 값을 메인으로 가져오기 위한 Handler

    @Override
    protected void onCreate(Bundle savedInstanceState) {// saveInstanceState -> 상태저장
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = findViewById(R.id.editText); // 앱 내에서 위치 확인
        textView = findViewById(R.id.textView); // 앱 내에서 위치 확인

        Button button = findViewById(R.id.button); // 앱 내에서 위치확인
        button.setOnClickListener(new View.OnClickListener() { // 버튼을 눌렀을 때
            @Override
            public void onClick(View v) {
                urlStr = editText.getText().toString();

                RequestThread thread = new RequestThread(); // Thread 생성
                thread.start(); // Thread 시작
            }
        });
    }

    class RequestThread extends Thread { // url을 읽을 때도 앱이 동작할 수 있게 하기 위해 Thread 생성
        @Override
        public void run() { // 이 쓰레드에서 실행 될 메인 코드
            try {
                URL url = new URL(urlStr); // 입력받은 웹서버 URL 저장
                HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // url에 연결
                if(conn != null){ // 만약 연결이 되었을 경우
                    conn.setConnectTimeout(10000); // 10초 동안 기다린 후 응답이 없으면 종료
                    conn.setRequestMethod("POST"); // GET 메소드 : 웹 서버로 부터 리소스를 가져온다.
                    conn.setDoInput(true); // 서버에서 온 데이터를 입력받을 수 있는 상태인가? true
                    conn.setDoOutput(true); // 서버에서 온 데이터를 출력할 수 있는 상태인가? true

                    int resCode = conn.getResponseCode(); // 응답 코드를 리턴 받는다.
                    if(resCode == HttpURLConnection.HTTP_OK){ // 만약 응답 코드가 200(=OK)일 경우
                        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                        // BufferedReader() : 엔터만 경계로 인식하고 받은 데이터를 String 으로 고정, Scanner 에 비해 빠름!
                        // InputStreamReader() : 지정된 문자 집합 내의 문자로 인코딩
                        // getInputStream() : url 에서 데이터를 읽어옴
                        String line = null; // 웹에서 가져올 데이터를 저장하기위한 변수
                        while(true){
                            line = reader.readLine(); // readLine() : 한 줄을 읽어오는 함수
                            if(line == null) // 만약 읽어올 줄이 없으면 break
                                break;
                            println(line); // 출력 *80번째 줄의 함수*
                        }
                        reader.close(); // 입력이 끝남
                    }
                    conn.disconnect(); // DB연결 해제
                }
            } catch (Exception e) { //예외 처리
                e.printStackTrace(); // printStackTrace() : 에러 메세지의 발생 근원지를 찾아서 단계별로 에러를 출력
            }
        }
    }

    public void println(final String data){ // final : 변수의 상수화 => 변수 변경 불가
        handler.post(new Runnable() {
            // post() : 핸들러에서 쓰레드로 ()를 보냄
            // Runnable() : 실행 코드가 담긴 객체
            @Override
            public void run() {
                textView.append(data);
            } // run() : 실행될 코드가 들어있는 메소드
        });
    }
}

실행화면

네이버 모바일 url과 flask로 생성한 url의 데이터를 가져온 모습

이상으로 flask를 이용해서 DB데이터를 android studio에 띄우는 법을 알아보았습니다.

반응형
Comments