안드로이드 공부/ Network1

yellow·2021년 6월 6일
0

안드로이드 공부

목록 보기
27/28

Network

❗❗Main Thread에서는 Network 관련 작업을 할 수 없다❗❗

  • retrofit, coroutine 등의 방법 생각하기!

📎 서버와 통신하는 방법

  • 해당 url로 요청한다.
  • 인증 정보를 보낸다.
  • JSON(JavaScript Object Notation) 형식을 사용해서 data를 보낸다.

JSON 형식

  • [ ] -> list
  • { } -> 객체
[
 {
    "id" : 1
    "name" : "choco"
 },
 {
    "id" : 2
    "name" : "banana"
 }
]

📎 JSON Parsing

JSON을 kotlin이나 Java가 이해할 수 있게 변환/해석하는 과정

Serializable (직렬화)

  • Java 시스템 내부에서 사용되는 Object를 외부에서 사용할 수 있도록 byte 형태로 데이터를 바꾸는 것.
  • JSON에 있는 데이터들을 담을 수 있는 Class(kotlin이나 Java가 이해할 수 있는 틀)가 Serializable 인터페이스를 상속받도록 하면 해당 Class의 객체는 직렬화가 가능하다.
  • 예시

📎 JSON 형태로 데이터 받아오기 예제

1. 통신(인터넷 사용)을 하기 위해 권한 부여

manifest 파일에 다음 코드 추가

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

Http url 접근 허용하기

안드로이드에서 API28 이후로 기본적으로 Http 접근을 허용하지 않기 때문에, 불가피하게 Http 접근을 해야한다면 manifest 파일의 application 태그에

android:usesCleartextTraffic="true"

속성을 추가해주어야 한다.


2. url 객체 생성하고 url 연결한 객체 생성하기

// 어디로 요청할 건지 url 설정하기
val urlString: String = "http://mellowcode.org/json/students/" // 강사님이 만들어 놓으신 실습 url
// String 형식의 url로 URL 객체 생성하기
val url: URL = URL(urlString)

// url객체로 connection 설정
val connection: HttpURLConnection = url.openConnection() as HttpURLConnection

URLConnection

  • 사용자 인증, 보안이 설정되어있지 않은 웹서버에 접속하여 파일 등을 다운하는 데에 주로 사용된다.
  • 리소스에 연결하기 전에 구성된다.
  • URLConnection 인스턴스는 재사용이 안된다.

HttpURLConnection

  • 웹을 통해 데이터 통신할 때 사용한다.
  • 데이터 타입, 길이는 거의 제한이 없다.
  • 스트리밍 데이터를 주고받는데 사용된다.
  • HttpURL을 처리하는 추가적인 메소드를 가진다.
  • 개발자가 직접 HttpURLConnection 객체를 생성하지는 못하지만(생성자가 protected), openConnection()이 return하는 URLConnection 객체를 형변환해서 사용

3. Request Type 설정

자주 사용하는 Request Type

  • GET : 정보 요청
  • POST : 정보 추가 요청
  • DELTE : 정보 삭제 요청
  • PUT : 정보 수정 요청
  • 예시
connection.requestMethod = "GET" // GET 방식으로 통신하겠다.
// request의 헤더를 작성
connection.setRequestProperty("Content-Type", "application/json") // Key-Value 형식

4. 데이터 읽어서 버퍼(변수)에 저장

  • BufferedReader : 문자를 하나씩 읽어들이는 것이 아니라, 여러개를 한꺼번에 읽어들여서 읽기를 더 효율적으로 할 수 있도록 해준다.
  • InputStreamReader(읽을 InputStream, 읽을 형식) : InputStream을 지정된 형식으로 받아올 수 있게 해준다.
var buffer = ""
// RequestCode가 200 OK라면, ("GET"이 성공했다면)
if (connection.responseCode == HttpURLConnection.HTTP_OK) {
    val reader = BufferedReader(
        InputStreamReader(
            connection.inputStream,
            "UTF-8"
        )
    )
    buffer = reader.readLine()
}

-> 데이터 통신을 할 때 데이터들은 사람들이 이해할 수 없는 Byte 형식의 Stream으로 들어오는데, 그 Stream을 UTF-8 방식으로 읽게 되면 사람이 이해할 수 있는 형식으로 받을 수 있다.


5. 받아온 JSON에 있는 데이터 Serializable한 class에 넣기

  • 직접 readline()으로 저장한 string을 parsing하는 것을 번거롭기 때문에 Gson 라이브러리를 사용한다.

5 - 1. App단의 Gradle 파일에 의존성 추가

implementation 'com.google.code.gson:gson:2.8.7'

5 - 2. Gson 생성해서 JSON 읽어들이기

// buffer에 있는 string을 json parsing해서 Person객체에 알맞게 데이터를 넣는다.
val data = Gson().fromJson(buffer, Array<Person>::class.java)

❗주의사항 Serializable한 class를 배열(Array)의 형태로 받아오는 걸 잊지 말자!! 왜냐하면 받아온 json에는 객체들이 리스트로 존재할 수 있기 때문!!


profile
할 수 있어! :)

0개의 댓글