문제 상황
회사에서 운영하던 서비스가 데이터가 많이 쌓여서 api return까지 걸리는 시간이 10초를 넘으면서 사용 기록이 많은 사용자들에게 앱에서 연속적으로 timeOut이 발생했습니다. 현재 상황에서 조회에 소요되는 시간은 30초 전후이고, DB 개선이 필요하지만 동시에 timeOut 제한 시간도 수정을 해야할 것 같습니다.
타임 아웃의 종류
설정할 수 있는 값의 범위는부터 0 부터 Integer.MAX_VALUE까지이며, 단위는 밀리초(ms)입니다.
0은 제한 없음(no timeout)을 의미합니다.
타임아웃 종류
SocketTimeOutException이 발생할 수 있는 상황
1. 서버 응답 지연
- 서버가 내부적으로 오래 걸리는 작업을 처리 중일 수 있습니다 (예: 데이터베이스 작업, 외부 API 호출).
- 이 경우에는 readTimeout에 걸려서 타임아웃 발생합니다.
- 저는 이 경우에 해당합니다.
예시: 서버 응답에 28초 소요, readTimeout이 기본 10초 → SocketTimeoutException
2. 네트워크 품질 불량 또는 끊김
- 사용자의 네트워크 상태가 불안정할 경우입니다.
- 패킷 손실 (packet loss)
- 지연 (latency)
- DNS 지연 또는 실패
예시: 지하철에서 약한 LTE 신호로 요청 보냈을 때 응답이 안 오고 timeout 발생
3. 서버가 다운되었거나 연결 자체가 안 되는 경우
- 이건 보통 connectTimeout에 해당합니다.
- 서버가 아예 꺼져 있거나 IP/포트가 잘못되어 연결을 못 하면 타임아웃아 발생합니다.
예시: 잘못된 서버 주소를 넣었거나, 서버가 꺼져 있음 → 연결 자체가 실패
4. 프록시, 방화벽, VPN 등의 중간 장비가 연결을 방해
- 회사 네트워크나 공공 와이파이에서 종종 발생합니다.
- 클라이언트와 서버 사이에 중간 네트워크 장비가 연결을 막거나, 요청을 느리게 처리합니다.
예시: 프록시 서버가 서버 응답을 받아도 클라이언트로 전달 안 해주는 경우
타임아웃 제한 수정 방법
okhttpClient에 아래와 같이 적용했습니다.
val okhttpClient = OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.callTimeout(60, TimeUnit.SECONDS)
.build()
'질문 정리' 카테고리의 다른 글
안드로이드 앱의 기본 빌드 타입을 Release로 변경하는 방법 (0) | 2025.04.22 |
---|---|
baseUrl 설정 과정에서 일부 경로가 호출 URL에 반영되지 않는 문제 (0) | 2025.04.18 |
Firebase Cloud Messageing 수신 기능 구현(Compose) (3) | 2024.08.28 |
안드로이드 앱 난독화 알아보기 (2) | 2024.07.14 |
[Dagger/MissingBinding] UserData cannot be provided without an @Provides-annotated method. (0) | 2024.07.13 |