안드로이드 앱에서 Retrofit과 OkHttp를 사용하여 네트워크 통신을 구축할 때 가장 흔하게 마주치는 문제 중 하나가 바로 공통 헤더의 처리예요. 인증 토큰이나 API 키, 또는 클라이언트 식별 정보와 같은 값들은 거의 모든 요청에 포함되어야 하는데 이를 각 인터페이스 메서드마다 직접 선언하면 코드의 가독성이 떨어지고 중복이 발생하기 마련이거든요. 특히 프로젝트 규모가 커질수록 이러한 반복적인 코드는 유지보수를 어렵게 만드는 요인이 되기도 하더라고요.
class AuthInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
val newRequest = originalRequest.newBuilder()
.header("Authorization", "Bearer ${getAuthToken()}")
.header("Content-Type", "application/json")
.build()
return chain.proceed(newRequest)
}
private fun getAuthToken(): String {
// 실제 환경에서는 로컬 저장소 등에서 토큰을 가져옴
return "your_token_here"
}
}
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(AuthInterceptor())
.build()
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
이 문제를 해결하는 가장 효과적인 방법은 OkHttp의 Interceptor 기능을 활용하는 것이에요. Interceptor는 말 그대로 네트워크 요청이 서버로 출발하기 전이나 응답이 돌아온 직후에 가로채서 특정 로직을 수행하는 도구거든요. 이를 통해 공통 헤더를 추가하는 과정을 단 한 번의 설정으로 모든 API에 적용할 수 있게 돼요. 예를 들어 인증 토큰이 유효한지 확인하고 문제가 있을 때만 갱신하는 로직을 이 단계에서 처리하면 비즈니스 로직과 네트워크 통신 로직을 깔끔하게 분리할 수 있네요.
구현 방식은 OkHttpClient를 빌드할 때 interceptor 메서드를 사용하여 커스텀 인터셉터를 등록하는 형태예요. 이때 ApplicationInterceptor와 NetworkInterceptor의 차이를 인지하고 적절한 위치에 배치하는 것이 중요한데, 보통 공통 헤더 추가나 로깅 같은 작업은 ApplicationInterceptor 단계에서 처리하면 충분히 의도한 대로 동작해요. 이렇게 설정된 클라이언트를 Retrofit builder에 넘겨주기만 하면 되거든요. 이 방식을 사용하면 코드의 중복을 획기적으로 줄일 수 있고, 나중에 헤더 구조가 변경되더라도 인터셉터 클래스 한 곳만 수정하면 모든 통신 로직에 반영된다는 장점이 있어요. 실무에서 확장성을 고려한다면 단순히 개별 요청에 파라미터를 추가하는 것보다 훨씬 체계적이고 안정적인 구조라고 볼 수 있네요.
'develop > android' 카테고리의 다른 글
| Jetpack Compose 2025년 12월 버전 업데이트 및 성능 개선 사항 (0) | 2026.07.23 |
|---|---|
| 세이브드스테이트핸들을 이용한 뷰모델 상태 보존 (안드로이드 엑스 라이브러리) (0) | 2026.07.16 |
| Android ANR 원인과 해결 (입력 이벤트 5초 초과) (0) | 2026.07.16 |
| Android 알림이 안 뜨는 문제와 POST_NOTIFICATIONS 런타임 권한 요청 (Android 13 이상) (0) | 2026.07.12 |
| yanzhenjie:album 라이브러리 android 13대응 (0) | 2023.09.13 |