본문 바로가기

Android

[라이브러리] Retrofit2(3)

반응형

Retrofit2를 활용한 Android 앱 개발

공통 모듈

1. ApiService 인터페이스

ApiService 은 안드로이드 앱에서 서버와 통신하기 위한 엔드포인트 및 HTTP 메서드를 정의하고 있습니다. 이를 통해 각 API 엔드포인트에 대한 요청을 간단하게 정의할 수 있습니다.

1-1 requestGET

interface ApiService {
    @GET("/{id}")
    suspend fun requestGET(
        @Path("id") groupId: String,
        @QueryMap options: Map<String, String>? = null
    ): Response<Any?>
}

기능: GET 메서드를 사용하여 데이터를 요청합니다.
파라미터:
- groupId: API에서 사용할 그룹 ID.
- options: 쿼리 매개변수로 사용할 맵.

1-2 requestPOST

interface ApiService {
    @FormUrlEncoded
    @POST("/{id}")
    suspend fun requestPOST(
        @Path("id") groupId: String,
        @FieldMap options: Map<String, String>? = null
    ): Response<Any?>

    @POST("/{id}")
    suspend fun requestPOST(
        @Path("id") groupId: String,
        @Body body: RequestData? = null
    ): Response<Any?>
}

기능: POST 메서드를 사용하여 데이터를 요청합니다. 두 가지 방법으로 요청을 보낼 수 있습니다.
파라미터:
- groupId: API에서 사용할 그룹 ID.
- options: 폼 필드 매개변수로 사용할 맵 또는 요청 본문으로 사용할 데이터.

1-3 requestPUT

interface ApiService {
    @FormUrlEncoded
    @PUT("/{id}")
    suspend fun requestPUT(
        @Path("id") groupId: String,
        @FieldMap fieldMap: Map<String, String>? = null
    ): Response<Any?>

    @PUT("/{id}")
    suspend fun requestPUT(
        @Path("id") groupId: String,
        @Body body: RequestData? = null
    ): Response<Any?>
}

기능: PUT 메서드를 사용하여 데이터를 업데이트 요청합니다. 두 가지 방법으로 요청을 보낼 수 있습니다.
파라미터:
- groupId: API에서 사용할 그룹 ID.
- fieldMap: 폼 필드 매개변수로 사용할 맵 또는 요청 본문으로 사용할 데이터.

1-4 requestDELETE

interface ApiService {
    @DELETE("/{id}")
    suspend fun requestDELETE(
        @Path("id") groupId: String,
        @Body body: RequestData? = null
    ): Response<Any?>
}

기능: DELETE 메서드를 사용하여 데이터를 삭제 요청합니다.
파라미터:
- groupId: API에서 사용할 그룹 ID.
- body: 요청 본문으로 사용할 데이터.

2. RetrofitNetwork

RetrofitNetwork 는 네트워크 통신을 관리하기 위한 핵심 클래스로, Retrofit 라이브러리를 사용하여 API 호출을 수행합니다. 여기서는 네트워크 요청의 설정 및 처리를 담당하며, Retrofit을 초기화하고 API 호출을 담당하는 객체를 생성합니다.

2-1 필드

필드는 클래스의 속성을 나타냅니다. onNetworkListener는 네트워크 리스너를, baseUrl은 기본 URL을 나타냅니다. coroutineScope는 IO 스레드에서 작업을 수행하기 위한 CoroutineScope입니다.

private val onNetworkListener: OnNetworkListener
private lateinit var baseUrl: String
private val coroutineScope = CoroutineScope(Dispatchers.IO)

2-2 okHttpClient

okHttpClient는 네트워크 통신을 수행하는 핵심 클래스인 OkHttpClient의 설정을 담고 있습니다. OkHttpClient는 네트워크 통신을 수행하는 데에 사용됩니다.

private val okHttpClient: OkHttpClient by lazy {
   OkHttpClient.Builder()
            .addInterceptor(header)
            .addInterceptor(logger)
            .connectTimeout(30000, TimeUnit.MILLISECONDS)
            .readTimeout(30000, TimeUnit.MILLISECONDS)
            .writeTimeout(30000, TimeUnit.MILLISECONDS)
            .cookieJar(JavaNetCookieJar(networkCookieManager))
            .build()
}

- addInterceptor(header): Request 헤더를 설정하는 Interceptor를 추가합니다.
- addInterceptor(logger): 네트워크 로그를 출력하는 Interceptor를 추가합니다.
- connectTimeout, readTimeout, writeTimeout: 연결 및 읽기, 쓰기 제한 시간을 설정합니다.
- cookieJar(JavaNetCookieJar(networkCookieManager)): 쿠키 관리를 위해 JavaNetCookieJar를 설정합니다.

2-3 header Interceptor

header는 Request 헤더를 설정하는 Interceptor입니다. Request의 헤더를 커스터마이징하기 위해 사용됩니다.


private val header = Interceptor { chain ->
    with(chain) {
        setRequestCookie(baseUrl)
        printNetworkCookie(baseUrl)

        val newRequest = request().newBuilder()
            .headers(commHeader!!.toHeaders())
            .build()
        proceed(newRequest)
    }
}

- Interceptor: OkHttpClient에 추가할 Interceptor를 정의합니다. - setRequestCookie(baseUrl): Request에 쿠키를 설정하기 위한 메서드를 호출합니다. - printNetworkCookie(baseUrl): 네트워크 쿠키를 출력하는 메서드를 호출합니다. - newRequest: 현재 Request를 복제하고 새로운 Request를 만듭니다. - headers(commHeader!!.toHeaders()): 커스텀 헤더를 새로운 Request에 추가합니다. - proceed(newRequest): 새로운 Request로 작업을 계속합니다.

2-4 logger Interceptor

logger는 네트워크 로그를 출력하는 Interceptor입니다. 앱 개발 시 디버깅에 유용하게 사용됩니다.


private val logger = HttpLoggingInterceptor().apply {
    level = if (!BuildConfig.DEBUG) {
        HttpLoggingInterceptor.Level.NONE
    } else {
        HttpLoggingInterceptor.Level.BODY
    }
}

- HttpLoggingInterceptor: 네트워크 로그를 출력하기 위한 Interceptor를 생성합니다. - level: 로그 레벨을 설정합니다. 디버그 모드에서는 BODY 레벨로 설정하여 로그를 자세히 기록하고, 릴리스 모드에서는 NONE 레벨로 설정하여 로그를 출력하지 않습니다.

2-5 retrofit

retrofit은 Retrofit 라이브러리를 초기화하고 설정하는 객체입니다. Retrofit은 API 호출을 담당하며, Gson 컨버터 및 기본 URL을 설정합니다.


private val retrofit: Retrofit by lazy {
    Retrofit.Builder()
        .baseUrl(baseUrl)  // 기본 URL 설정
        .client(okHttpClient)  // OkHttpClient 설정
        .addConverterFactory(GsonConverterFactory.create(gson))  // Gson 컨버터 추가
        .build()
}

- baseUrl: API 호출 시 기본 URL을 설정합니다. - client(okHttpClient): OkHttpClient 설정을 Retrofit에 적용합니다. - addConverterFactory(GsonConverterFactory.create(gson)): Gson 컨버터를 추가하여 JSON 데이터를 자바 객체로 변환합니다.

2-6 gson

gson은 JSON 파싱을 위해 Gson 라이브러리를 설정합니다. Gson은 JSON 데이터를 자바 객체로 변환하거나, 자바 객체를 JSON 문자열로 변환하는 데 사용됩니다.

private val gson: Gson = GsonBuilder()
    .setLenient()
    .create()

- setLenient(): JSON 파싱 시 릴렉스 모드를 활성화하여 문법 오류에 더 관대하게 처리합니다.

3. RetrofitNetwork 클래스 활용 예시

val retrofitNetwork = RetrofitNetwork(onNetworkListener)

retrofitNetwork.request(
    requestCode = "your_request_code",
    url = "https://api.example.com/endpoint",
    method = NetworkReqMethod.GET,
    options = mapOf("param1" to "value1", "param2" to "value2")
)

위 예시에서는 RetrofitNetwork 클래스를 생성하고, request 메서드를 사용하여 GET 메서드로 API 요청을 수행하고 있습니다.

반응형

'Android' 카테고리의 다른 글

[라이브러리] Retrofit2(4)  (0) 2023.09.19
[라이브러리] Retrofit2(2)  (0) 2023.08.11
[라이브러리] Retrofit2(1)  (0) 2023.08.11
[디자인패턴] MVVM 패턴(3)  (0) 2023.08.10
[디자인패턴] MVVM 패턴(2)  (0) 2023.08.10