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 |