본문 바로가기
Android/Android Core

[Android/Kotlin] Retrofit에서 인터페이스를 활용한 API 요청 처리 원리

by quessr 2025. 3. 12.

 

안드로이드에서 네트워크 요청을 쉽게 처리할 수 있도록 도와주는 대표적인 라이브러리인 Retrofit을 공부하면서, 한 가지 궁금한 점이 생겼습니다.

Retrofit을 사용할 때 interface를 retrofit.create()에 넘겨주기만 하면 네트워크 통신이 자동으로 이루어진다는 점이었습니다.

단순히 메서드를 선언한 인터페이스를 넘겼을 뿐인데, 실제 HTTP 요청이 발생하는 원리가 무엇인지 궁금했습니다.

공부하면서 Retrofit이 인터페이스를 동적으로 구현하고, 내부적으로 HTTP 요청을 처리하는 과정을 이해하게 되었습니다.

이번 글에서는 Retrofit이 API 요청을 어떻게 자동으로 처리하는지 정리해보겠습니다.


Retrofit을 이용한 API 요청 흐름

Retrofit을 사용할 때 interface를 정의하면 Retrofit이 내부적으로 이를 구현해주는 방식으로 동작합니다. 아래 코드를 예제로 살펴보겠습니다.

1. API 요청을 위한 interface 정의

interface MarsApiService {
    @GET("photos")
    suspend fun getPhotos(): String
}

 

이 코드의 역할은 다음과 같습니다.

  • @GET("photos") → "GET /photos" 요청을 보내는 메서드를 정의합니다.
  • suspend fun getPhotos(): String → 네트워크 요청을 suspend 함수로 선언하여 비동기적으로 실행할 수 있게 합니다.
  • 하지만 이 인터페이스 자체는 구현된 코드가 아니라, Retrofit이 내부적으로 구현을 생성합니다.

즉, Retrofit에게 "이런 API 요청을 지원해 달라"는 요청을 하는 것입니다.

2. Retrofit 객체 생성

private const val BASE_URL =
    "https://android-kotlin-fun-mars-server.appspot.com"

private val retrofit = Retrofit.Builder()
    .addConverterFactory(ScalarsConverterFactory.create()) // 응답을 String으로 변환
    .baseUrl(BASE_URL)
    .build()

 

이 코드의 역할은 다음과 같습니다.

  • Retrofit.Builder()를 사용하여 Retrofit 객체를 생성합니다.
  • .baseUrl(BASE_URL) → API의 기본 URL을 설정합니다.
  • .addConverterFactory(ScalarsConverterFactory.create()) → JSON이 아닌 String 그대로 API 응답을 받을 수 있도록 변환합니다.

즉, Retrofit이 API 요청을 보낼 준비가 된 상태입니다.

3. retrofit.create()를 활용한 인터페이스 구현체 생성

object MarsApi {
    val retrofitService: MarsApiService by lazy {
        retrofit.create(MarsApiService::class.java)
    }
}

 

이 코드의 역할은 다음과 같습니다.

  • retrofit.create(MarsApiService::class.java) → Retrofit이 MarsApiService 인터페이스를 구현한 객체를 자동으로 생성합니다.
  • MarsApi.retrofitService를 통해 API 요청을 쉽게 호출할 수 있게 됩니다.

즉, Retrofit이 MarsApiService의 getPhotos()를 내부적으로 구현하고, API 요청을 처리할 수 있게 됩니다.

4. API 호출 및 네트워크 요청 실행

viewModelScope.launch {
    val response = MarsApi.retrofitService.getPhotos() // 실제 API 요청 실행!
    println("응답 데이터: $response")
}

 

실행 과정은 다음과 같습니다.

  1. MarsApi.retrofitService.getPhotos() 호출
  2. Retrofit이 내부적으로 getPhotos() 메서드를 구현한 객체가 실행됩니다.
  3. "GET /photos" 요청을 서버로 보냅니다.
  4. 네트워크 응답을 String 형태로 반환합니다 (ScalarsConverterFactory.create() 덕분).
  5. 코루틴이 응답을 받아서 UI를 업데이트합니다.

즉, 우리가 직접 네트워크 요청을 구현하지 않아도 Retrofit이 자동으로 처리해줍니다.


Retrofit이 인터페이스를 구현하는 원리

retrofit.create(MarsApiService::class.java)의 역할

  • MarsApiService 인터페이스를 Retrofit이 내부적으로 구현합니다.
  • getPhotos()가 호출되면 Retrofit이 자동으로 네트워크 요청을 수행합니다.
  • 응답을 지정한 데이터 타입(String)으로 변환하여 반환합니다.

Retrofit을 사용하면 좋은 점

  • interface만 정의하면 Retrofit이 자동으로 구현을 생성해줍니다.
  • 비동기적으로 네트워크 요청을 실행할 수 있습니다 (suspend fun 활용).
  • retrofit.create()를 통해 API 요청을 간결하게 관리할 수 있습니다.

최종 정리

  • Retrofit은 interface를 기반으로 API 요청을 자동으로 처리하는 라이브러리입니다.
  • retrofit.create(MarsApiService::class.java)가 인터페이스를 구현하는 핵심 역할을 합니다.
  • Retrofit이 getPhotos() 메서드를 내부적으로 구현하여, 우리가 직접 HTTP 요청을 작성하지 않아도 됩니다.
  • 결과적으로 MarsApi.retrofitService.getPhotos()를 호출하면 Retrofit이 자동으로 네트워크 요청을 실행합니다.

즉, Retrofit을 사용하면 API 요청을 쉽게 정의하고, 자동으로 네트워크 요청을 처리할 수 있습니다.

반응형