Retrofit
Retrofit이란?
안드로이드와 자바를 위한 타입 안전한 HTTP 클라이언트이다. (서버와 통신할 때 거의 필수)
- API로 정보를 받아오기 때문에 HTTP클라이언트이다.
- 요청 바디 값(Request Body)과 응답 바디 값(Response Body)을 원하는 타입으로 안전하게 바꾸어주기 때문에 타입 안전이다.
- 네트워킹 관련 스레딩, 캐싱, 에러 핸들링, 응답 파싱에 필요한 보일러 플레이트를 줄여주고 개발자가 읽기 편한 코드를 작성할 수 있게 도와준다.
보일러 플레이트(BoilerPlate) 코드란 ?
모든 코드를 작성하기 위해 항상 필요한 부분을 의미한다.
BoilerPlate는 다음 4가지로 구성되어 있다.
- Import : 필요한 코드를 불러들이는 부분
- Component : 현 페이지를 구현하는 코드
- StyleSheet : 페이지의 객체를 꾸미기 위한 style
- Export : 현 Javascript 코드를 타 Javascript에서 접근하기 위한 부분
1. Retrofit을 사용할 경우 3가지 요소
- HTTP 메서드들을 정의한 인터페이스
- 레트로핏 클라이언트 객체를 생성하는 레트로핏 클래스
- JSON 데이터를 담을 데이터 클래스
2. API 테스트 방법
기본 요청을 날려보거나 공식 문서를 확인하면 어떤 응답이 오는지 확인할 수 있다.
API 공식문서
https://api-docs.iqair.com/#intro
- URL 부분 : http://api.airvisual.com/v2/nearest_city
- URL 파라미터 : url 파라미터는 요청 시에 추가 정보를 전달할 수 있게 해 준다.
함수로 치면 함수를 실행할 때 입력하는 인수라고 생각하면 된다.
2-1) PostMan으로 Test 확인 방법
- URL 주소 넣고 → Params 넣고 → [Send] 클릭
- 응답받은
데이터 클래스는 복사한 JSON 구조에 맞추어 직접 작성 해주어야 한다. 그러나 다행히 플러그인을 이용하면 쉽게 JSON을 코틀린 테이터 클래스로 변환할 수 있다.
3. Retrofit 사용 방법
3-1) 라이브러리 추가
plugins {
...
id 'kotlin-kapt' // 1) kotlin-kapt 플러그인 추가
}
android {
...
}
dependencies {
// Retrofit 추가
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}
3-2) 플러그인을 이용한 응답 JSON Data Class 만드는 방법
1) 상단 탭 메뉴 바에서
- AOS : [File] → [Setting…]
- IOS : [Android Studio] → [Preferences…]
- [Plugins] → [Marketplace] → json 검색 → JSON To Kotlin Class 선택 → [Install] → [APPLY]
2) Retrofit 관련 파일만 모아둘 패키지 추가
3) retrofit 패키지 위에서 우클릭 → [New] → [Kotilin data class File from JSON] 클릭
4) 복사한 JSON 데이터를 그대로 넣기
PostMan으로 Test 했던 응답 값을 그대로 넣어준다.
- 복사한 거 붙여 넣기
- 데이터 클래스 이름 설정
- Advanced 클릭
5) Data Class 생성 완료
- [Other] 클릭 → [Enable Inner Class Model] 클릭 → [OK]
- 이렇게 해야 이너 클래스를 활용해 여러 코틀린 파일이 생기는 것을 방지할 수 있습니다.
- 마지막으로 [Generate] 클릭하면 완료됩니다.
3-3) Retrofit 클래스 생성 (RetrofitConnection.kt)
레트로핏 객체를 생성하는 레트로핏 클래스
package com.jaocb.airquality.retrofit
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class RetrofitConnection {
// 객체를 하나만 생성하는 싱글톤 패턴을 적용합니다.
companion object {
// API 서버의 주소가 BASE_URL이 됩니다.
private const val BASE_URL = "https://api.airvisual.com/v2/"
private var INSTANCE: Retrofit? = null
fun getInstance(): Retrofit {
if(INSTANCE == null) { // null인 경우에만 생성
INSTANCE = Retrofit.Builder()
.baseUrl(BASE_URL) // API 베이스 URL 설정
.addConverterFactory(GsonConverterFactory.create()) // 1)
.build()
}
return INSTANCE!!
}
}
}
- 레트로핏 객체를 생성하는 getInstance() 함수가 있는 RetrofitConnection 클래스 작성
- 레트로핏에 컨버터 팩토리를 추가해준다. 컨버터 팩토리는 서버에서 온 JSON응답을 우리가 위에서 만든 데이터 클래스 객체로 변환해 주고, Gson이라는 레트로핏 기본 컨버터 팩토리를 사용한다.
3-4) HTTP 메스드를 정의해 놓은 인터페이스 구현
사용할 API들을 정의한다.
@HTTP메서드와 상대 URL를 사용해 정의하고, Call타입으로 감싸준 후 반환 타입으로 명시해야 한다.
interface ShopService {
@GET("product/category")
fun getCategoryList(): Call<List<Category>>
@GET("product/{id}")
fun getProductDetail(@Path("id") productId: Int) : Call<Product>
}
- 어노테이션은 GET, POST, PUT, DELETE와 같은 HTTP 메스드 종류를 적어주고 상대 URL을 적어준다.
( 인터페이스 구현 예 )
package com.jaocb.airquality.retrofit
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Query
interface AirQualityService {
@GET("nearest_city") // 1)
fun getAirQualityData(@Query("lat") lat: String, @Query("lon") lon: String,
@Query("key") key : String ) : Call<AirQualityResponse>
}
3-5) 인스턴스 생성
// 레트로핏 객체를 이용해 AirQualityService 인터페이스 구현체를 가져올 수 있음
val retrofitAPI = RetrofitConnection.getInstance().create(AirQualityService::class.java)
반응형
'Kotlin' 카테고리의 다른 글
[Kotlin] 스레드(Thread)의 개념 및 runOnUiTread 사용 방법 (0) | 2022.11.16 |
---|---|
[Android] 앱 배포(2) 구글 플레이 스토어 앱 출시 및 애드몹 광고 등록 (0) | 2022.11.15 |
[Android] 앱 배포(1) 앱 번들(App Bundle) release 파일 생성 방법 (0) | 2022.11.09 |
[Kotlin] Null 처리 방법(Nullable, NonNull) (0) | 2022.11.04 |
[Kotlin] Fragment Navigation 화면 전환 방법 (0) | 2022.11.02 |