[라이브러리] 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 요청을 수행하고 있습니다.