Rest API Definition
REST(Representational State Transfer) API 란 REST 아키텍처의 제약 조건을 준수하는 어플리케이션 프로그래밍 인터페이스를 뜻한다.
Rest API Feature
1. Server 와 Client의 구조
-> 좀 더 편하게 생각해 본다면, DB를 통신할 수 있는 서버와 앱
2. Socket 통신과 다르게 양방향이 아닌 단방향 통신
3. Request와 Response로 이루어짐
4. Get, Post, Put, Delete 등의 메소드를 사용한다.
결국, 클라이언트 즉 앱에서 서버에 원하는 것을 요청하면 서버는 그에 맞는 원하는 것을 주는 구조이다.
Rest API를 사용하는 라이브러리는 다음과 같다.
1. HttpURLConnection, HttpsURLConnection
2. OKHttp
3. Retrofit1, 2
1. HttpURLConnection
보통 안드로이드 스튜디오 내에서 AsyncTask를 사용하지만 deprecated되었다..
그래서 다음 예제는 Coroutine을 사용하여 비동기 처리작업을 하였다.
여기서 잠깐, 코루틴을 왜쓰느냐...?
-> 코루틴은 장기 테스크를 백그라운드 스레드에서 관리할 수 있도록 비동기로 처리할 수 있게 해준다.
좀더 디테일 하게 얘기해보면
CPU 집약적 작업, 네트워크 요청, DISK IO와 같은 장기 테스크는 메인스레드에서 실행하면 안된다.
메인 스레드에서 이러한 작업을 실행하면 UI 상호 작용이 차단될 수 있다.
또한, 메인 스레드에서 네트워크 요청을 실행하는 것은 Android SDK에 의해 방지되고 Exception Throw를 한다.
이는 Android Docs에도 나와 있는 설명이다.
HTTP GET Request
1. 네트워크 작동의 가장 간단한 예는 HTTP get 요청이다.
2. 생성자에 url 문자열을 전달하여 새로운 URL 객체를 생성.
3. URL 객체는 HttpURLConnection을 생성하기 위해 사용된다.
4. 그 후, 실행한 뒤 InputStream으로 response를 받는다.
5. 마지막으로, heplper 메소드를 사용해 inputStream -> string으로 변환한다.
private fun httpGet(myURL: String?): String {
val inputStream:InputStream
val result:String
// URL 생성
val url:URL = URL(myURL)
// HttpURLConnection 생성
val conn:HttpURLConnection = url.openConnection() as HttpURLConnection
// 주어진 URL로 get을 요청
conn.connect()
// inputStream으로 response를 받기
inputStream = conn.inputStream
// inputStream을 String으로 변환
if(inputStream != null)
result = convertInputStreamToString(inputStream)
else
result = "잉!? 안되잖아!"
return result
}
Perform Network Operations on a Seperate Thread Using AsyncTask
1. 네트워크 작동은 UI가 멈추는 것을 막기 위해 메인이 아닌 백그라운드 쓰레드에서 사용한다.
2. AsyncTask 클래스는 UI Thread(메인)로부터 분리시킬 수 있는 가장 간단한 방법 중 하나이다.
3. AsncTask를 확장한 innerClass 하나 만들어주자.
4. 그 후, doInBackground() & onPostExecute를 오버라이딩 하자.
inner class HTTPAsyncTask : AsyncTask<String, Void, String>() {
override fun doInBackground(vararg urls: String?): String {
return HttpGet(urls[0])
}
override fun onPostExecute(result: String?) {
tvResult.setText(result)
}
}
이제, HTTP request를 다음과 같이 사용할 수 있다!
HTTPAsyncTask().execute("http://hmkcode-api.appspot.com/rest/api/hello/Android")
Perform Network Operations on a Seperate Thread Using Coroutine
suspend 함수를 사용해 보자.
suspend로 표시된 함수는 결과가 반환될 때까지 실행을 일시 중단한다는 특징을 갖는다.
결과값을 기다리는 동안, 다른 함수나 코루틴이 실행될 수 있도록 실행 중인 차단을 해제한다.
private suspend fun httpGet(myURL: String?): String? {...}
Dispatcher
Dispatcher는 코루틴 내에서 어떤 쓰레드를 돌릴지 결정한다.
Dispatcher에는 Default, IO, Main이 있다.
지금은 HTTP request 예제이기 때문에 withContext(Dispatchers.IO)를 통해 IO Thread를 사용한다.
private suspend fun httpGet(myURL: String?): String? {
val result = withContext(Dispatchers.IO) {
// HTTP GET request code...
}
return result
}
Coroutine Scope
Coroutine은 CoroutineScope에서 작동한다.
Scope는 Coroutine의 생명주기를 관리한다.
또한, GlobalScope를 사용하여 코루틴을 시작할 수 있다.
GlobalScope는 백그라운드에서 작업을 실행하기 좋지만, 비추천한다.
GlobalScope.launch(Dispatchers.Main) {
val result = httpGet("http://hmkcode-api.appspot.com/rest/api/hello/Android")
tvResult.setText(result)
}
또한, GlobalScope를 LifecycleScope로 대체할 수 있다.
LifecycleScope는 KTX 확장에 포함된 AAC의 세가지 기본 제공 코루틴 scope중 하나이다.
자 이제 설명은 끝났으니 변경해보자
lifecycleScope.launch {
val result = httpGet("http://hmkcode-api.appspot.com/rest/api/hello/Android")
tvResult.setText(result)
}
'Computer engineering > Android Programming' 카테고리의 다른 글
Coroutine_Flow (0) | 2022.07.14 |
---|---|
AAC_ViewModel2 (0) | 2022.07.12 |
AAC_ViewModel_1 (0) | 2022.07.12 |
MVVM with Clean Architecture (0) | 2022.07.11 |
4. Architecture Component UI Layer Data Binding_3 (1) | 2022.07.10 |