Kotlin

[Kotlin] Retrofit 사용한 API 통신 방법

cob 2022. 11. 14. 14:32

 

 

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

Retrofit Test

  • URL 부분 : http://api.airvisual.com/v2/nearest_city 
  • URL 파라미터 :  url 파라미터는 요청 시에 추가 정보를 전달할 수 있게 해 준다.
    함수로 치면 함수를 실행할 때 입력하는 인수라고 생각하면 된다.

 

2-1) PostMan으로 Test 확인 방법

PostMan 요청 보내기

  • 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…]

JSON Data Class 플러그인 설치

  • [Plugins] → [Marketplace] → json 검색 → JSON To Kotlin Class 선택 → [Install] → [APPLY]

 

2) Retrofit 관련 파일만 모아둘 패키지 추가

Retrofit Pakage

 

3) retrofit 패키지 위에서 우클릭 → [New] → [Kotilin data class File from JSON] 클릭

Data Class 플러그인으로 생성

 

4) 복사한 JSON 데이터를 그대로 넣기

PostMan으로 Test 했던 응답 값을 그대로 넣어준다.

JSON 넣기

  • 복사한 거 붙여 넣기
  • 데이터 클래스 이름 설정
  • Advanced 클릭

 

5) Data Class 생성 완료

생성 완료

  • [Other] 클릭 → [Enable Inner Class Model] 클릭 → [OK]
  • 이렇게 해야 이너 클래스를 활용해 여러 코틀린 파일이 생기는 것을 방지할 수 있습니다.
  • 마지막으로 [Generate] 클릭하면 완료됩니다.

 

 

3-3) Retrofit 클래스 생성 (RetrofitConnection.kt)

레트로핏 객체를 생성하는 레트로핏 클래스

Retrofit Class

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)

 

반응형