안드로이드 앱에서 Retrofit 사용 방법

  • Retrofit 소개: Retrofit은 안드로이드에서 HTTP API를 호출하기 위한 타입 안전한 클라이언트 라이브러리로, Square에서 개발되었습니다. RESTful API를 자바 또는 코틀린 인터페이스로 변환하여 간단하게 네트워크 요청을 처리할 수 있습니다. 연구에 따르면, Retrofit은 성능이 우수하고 코드가 간결해 안드로이드 개발자들 사이에서 인기 있지만, 복잡한 API의 경우 추가 설정이 필요할 수 있습니다.
  • 설치 및 설정: Gradle에 Retrofit 의존성을 추가하세요. 예: implementation 'com.squareup.retrofit2:retrofit:2.9.0'. 이는 최소 Java 8 또는 Android API 21을 요구하며, 컨버터(예: Gson)를 함께 사용하면 JSON 파싱이 용이합니다.
  • 기본 사용: API 인터페이스를 정의하고, Retrofit 인스턴스를 생성한 후 서비스를 만들어 호출합니다. GET, POST 등의 어노테이션을 사용해 요청을 지정하며, 비동기 호출을 위해 Call이나 코루틴을 활용하세요.
  • 장점과 주의점: 빠른 성능과 간단한 구현이 장점이나, 에러 처리와 인증은 개발자가 직접 구현해야 합니다. 논쟁적인 부분으로는 OkHttp와의 통합이 필수적이라는 점이 있으며, 일부 개발자는 Volley나 다른 라이브러리를 선호할 수 있습니다.

Retrofit 설치 방법

Gradle 파일(build.gradle.kts)에 다음 의존성을 추가하세요:

  • Retrofit: implementation("com.squareup.retrofit2:retrofit:2.9.0")
  • Gson 컨버터: implementation("com.squareup.retrofit2:converter-gson:2.9.0")
  • 인터넷 권한: AndroidManifest.xml에 <uses-permission android:name="android.permission.INTERNET" /> 추가.

프로젝트를 동기화한 후 Retrofit을 사용할 수 있습니다.

기본 API 호출 예시

API 인터페이스를 정의하세요:

interface ApiService {
    @GET("users")
    fun getUsers(): Call<List<User>>
}

Retrofit 인스턴스 생성:

val retrofit = Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()
val service = retrofit.create(ApiService::class.java)

호출:

service.getUsers().enqueue(object : Callback<List<User>> {
    override fun onResponse(call: Call<List<User>>, response: Response<List<User>>) {
        if (response.isSuccessful) {
            // 성공 처리
        }
    }
    override fun onFailure(call: Call<List<User>>, t: Throwable) {
        // 실패 처리
    }
})

에러 처리

IOException 등의 예외를 try-catch로 처리하세요. ViewModel에서 코루틴을 사용하면 더 안전합니다.


Retrofit은 안드로이드 앱에서 네트워크 API를 호출하는 데 특화된 라이브러리로, Square에서 개발된 오픈소스 프로젝트입니다. 이는 HTTP 클라이언트로서 타입 안전성을 강조하며, REST API를 자바나 코틀린 인터페이스로 변환하여 사용합니다. 공식 문서에 따르면, Retrofit은 최소 Java 8+ 또는 Android API 21+를 요구하며, OkHttp를 네트워킹 레이어로 사용합니다. 이 라이브러리는 빠른 성능과 간결한 코드로 인해 안드로이드 개발 커뮤니티에서 널리 사용되지만, 복잡한 인증이나 파일 업로드 시 추가 설정이 필요할 수 있습니다. 일부 개발자들은 Volley나 Ktor 같은 대안을 고려하지만, Retrofit의 안정성과 확장성이 우수하다는 의견이 지배적입니다.

Retrofit의 주요 구성 요소

Retrofit을 사용하려면 다음 세 가지 클래스가 핵심입니다:

  1. API 인터페이스: HTTP 요청을 정의하는 인터페이스. 어노테이션(@GET, @POST 등)을 사용해 메서드를 지정합니다.
  2. Retrofit 인스턴스: Builder를 통해 baseUrl과 컨버터를 설정합니다.
  3. 모델 클래스: JSON 응답을 매핑하는 POJO 클래스. Gson이나 Moshi 같은 라이브러리를 사용해 직렬화합니다.
구성 요소설명예시
API 인터페이스요청 메서드 정의@GET("path") fun getData(): Call<Response>
Retrofit Builder인스턴스 생성.baseUrl("https://api.com").build()
모델 클래스데이터 매핑data class User(val id: Int, val name: String)

설치 및 의존성 추가

안드로이드 스튜디오에서 module-level build.gradle.kts 파일을 열고 dependencies 섹션에 다음을 추가합니다:

implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")  // JSON 파싱을 위한 Gson 컨버터
implementation("com.squareup.retrofit2:converter-scalars:2.9.0")  // 문자열 응답을 위한 옵션

OkHttp 로깅을 위해:

implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")

AndroidManifest.xml에 인터넷 권한을 추가:

<uses-permission android:name="android.permission.INTERNET" />

프로젝트를 Sync Now로 동기화하세요. 이는 Retrofit 2.x 버전을 기반으로 하며, 이전 버전과의 호환성을 확인하세요.

API 인터페이스 정의

새 패키지(예: network)에 Kotlin 파일(예: ApiService.kt)을 생성합니다. baseUrl 상수를 정의하고 Retrofit 빌더를 설정:

private const val BASE_URL = "https://api.example.com/"
private val retrofit = Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
    .baseUrl(BASE_URL)
    .build()

interface ApiService {
    @GET("photos")
    suspend fun getPhotos(): String  // 코루틴을 위한 suspend
}

object Api {
    val service: ApiService by lazy {
        retrofit.create(ApiService::class.java)
    }
}

HTTP 메서드 어노테이션:

  • @GET: 데이터 조회
  • @POST: 데이터 생성, @Body로 객체 전송
  • @PUT/@DELETE: 업데이트/삭제
  • @Query: 쿼리 파라미터, @Path: URL 경로 치환
  • @FormUrlEncoded와 @Field: 폼 데이터 전송
  • @Multipart와 @Part: 파일 업로드

Retrofit 인스턴스 생성 및 서비스 구현

싱글톤 객체를 사용해 서비스를 노출:

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

클라이언트 커스터마이징:

val okHttpClient = OkHttpClient.Builder()
    .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
    .build()

val retrofit = Retrofit.Builder()
    .client(okHttpClient)
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .build()

네트워크 요청 만들기

ViewModel에서 코루틴을 사용해 호출:

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch

class MyViewModel : ViewModel() {
    private fun getData() {
        viewModelScope.launch {
            try {
                val result = Api.service.getPhotos()
                // 결과 처리
            } catch (e: IOException) {
                // 에러 처리
            }
        }
    }
}

동기 호출: execute(), 비동기: enqueue(Callback)

응답 처리 및 에러 핸들링

응답은 Response 객체로 받으며, isSuccessful로 성공 여부 확인:

override fun onResponse(call: Call<MyResponse>, response: Response<MyResponse>) {
    if (response.isSuccessful) {
        val body = response.body()
        // UI 업데이트
    } else {
        // 에러 코드 처리 (response.code())
    }
}

에러: onFailure에서 Throwable 처리. 코루틴에서는 try-catch 사용. 공통 에러: IOException(네트워크 오류), HttpException(서버 오류).

컨버터와 어댑터

  • 컨버터: JSON(Gson), XML(Simple XML), Protobuf 등. addConverterFactory로 추가.
  • 어댑터: RxJava, Coroutines 지원. 예: addCallAdapterFactory(CoroutineCallAdapterFactory())
  • 고급: 인터셉터로 인증 토큰 추가, 캐싱 설정.

모델 클래스 생성

JSON 응답에 맞춰 데이터 클래스 정의:

data class User(
    val id: Int,
    val name: String,
    val email: String
)

@SerializedName으로 필드 매핑.

고급 기능

  • 파일 업로드: @Multipart @POST, MultipartBody.Part 사용.
  • 쿼리 파라미터: @QueryMap으로 맵 전송.
  • 헤더: @Headers 또는 동적 @Header.
  • 코루틴 통합: suspend 함수로 비동기 처리.
  • Jetpack Compose 통합: ViewModel에서 상태 업데이트, UI에서 Flow나 LiveData 관찰.

예제 프로젝트

간단한 사용자 목록 API 호출 예시:

  1. 인터페이스: @GET("users") suspend fun getUsers(): List
  2. Repository: API 호출 래핑.
  3. ViewModel: 데이터 로드 및 UI 상태 관리.
  4. Activity/Fragment: 결과 표시.
HTTP 메서드사용 예응답 처리
GET데이터 조회List 또는 객체 파싱
POST데이터 생성생성된 ID 반환
PUT업데이트성공 코드 확인
DELETE삭제빈 응답 처리

Retrofit은 안드로이드 네트워킹의 표준으로 자리 잡았으나, Ktor나 Fuel 같은 대안도 존재합니다. 복잡한 프로젝트에서는 Hilt나 Dagger로 의존성 주입을 추천합니다. 추가로, 보안 측면에서 HTTPS 사용과 API 키 관리를 유의하세요.

Key Citations

댓글 쓰기

0 댓글