네트워크 요청 타임아웃 관리
Android 애플리케이션에서 네트워크 통신 시 타임아웃 설정은 사용자 경험과 시스템 안정성을 위해 필수적입니다. OkHttp 라이브러리를 활용한 효과적인 타임아웃 구성 방법을 설명합니다.
구현 절차
- OkHttp 종속성 추가
- OkHttpClient 인스턴스 생성
- 타임아웃 값 구성
- 네트워크 요청 실행
- 응답 및 오류 처리
상세 구현 방법
1. Gradle 종속성 설정
// 모듈 수준 build.gradle
dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
}
2. 클라이언트 인스턴스 초기화
import okhttp3.OkHttpClient;
OkHttpClient networkClient = new OkHttpClient();
3. 타임아웃 파라미터 설정
import java.util.concurrent.TimeUnit;
OkHttpClient configuredClient = new OkHttpClient.Builder()
.connectionTimeout(25, TimeUnit.SECONDS) // 서버 연결 제한 시간
.socketTimeout(35, TimeUnit.SECONDS) // 데이터 수신 대기 시간
.callTimeout(60, TimeUnit.SECONDS) // 전체 요청 처리 시간
.build();
4. 비동기 요청 실행
import okhttp3.Request;
import okhttp3.Callback;
Request apiRequest = new Request.Builder()
.url("https://api.example.com/data")
.get()
.build();
configuredClient.newCall(apiRequest).enqueue(new Callback() {
@Override
public void onFailure(okhttp3.Call currentCall, IOException error) {
error.printStackTrace();
}
@Override
public void onResponse(okhttp3.Call currentCall, okhttp3.Response serverResponse) {
try (ResponseBody responseBody = serverResponse.body()) {
if (serverResponse.isSuccessful()) {
String result = responseBody.string();
Log.d("NETWORK", "수신 데이터: " + result);
}
}
}
});
5. 오류 처리 패턴
onFailure() 콜백에서는 다음과 같은 예외 처리를 권장합니다:
public void onFailure(Call call, IOException e) {
if (e instanceof SocketTimeoutException) {
Log.w("TIMEOUT", "서버 응답 시간 초과");
} else if (e instanceof ConnectException) {
Log.e("CONNECTION", "네트워크 연결 실패");
}
}
권장 타임아웃 값
| 설정 항목 | 기본값(초) | 권장값(초) |
|---|---|---|
| 연결 타임아웃 | 10 | 15-30 |
| 소켓 타임아웃 | 10 | 20-40 |
| 전체 요청 타임아웃 | 0(무제한) | 30-60 |