웹 서비스나 앱을 운영하다 보면 로그 파일에서 가장 흔하게 마주하는 에러 중 하나가 바로 java.net.SocketTimeoutException: Read timed out입니다. 요청은 서버에 잘 전달되었으나, 서버가 응답을 주는 과정에서 시간이 너무 오래 걸려 연결이 끊겨버린 상황이죠.

1. 클라이언트 타임아웃(Read Timeout) 설정 조정
가장 즉각적인 해결책은 클라이언트 측에서 서버의 응답을 기다려주는 '인내심'을 늘려주는 것입니다. 대용량 파일을 다운로드하거나 복잡한 연산을 처리하는 API라면 기본 설정값(보통 5~10초)으로는 부족할 수 있습니다.
주요 프레임워크별 설정 예시:
// 1. OkHttp (Android/Java)
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(30, TimeUnit.SECONDS) // 읽기 타임아웃을 30초로 설정
.build();
// 2. Spring RestTemplate
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(5000); // 5초
RestTemplate restTemplate = new RestTemplate(factory);
*주의: 타임아웃 시간을 무한정 늘리는 것은 사용자 경험(UX)을 해칠 수 있으므로 신중해야 합니다.
2. 데이터베이스 쿼리 최적화 및 인덱스 점검
Read timed out의 가장 흔한 '범인'은 느린 DB 쿼리입니다. 서버는 요청을 받았지만, DB에서 데이터를 추출하는 데 시간이 너무 오래 걸려 응답을 제때 보내지 못하는 경우입니다.
- Slow Query 분석: 실행 시간이 긴 쿼리를 추출하여
EXPLAIN명령어로 실행 계획을 확인하세요. - 인덱스(Index) 재정비: Full Table Scan이 일어나고 있지 않은지, 검색 조건에 적절한 인덱스가 걸려 있는지 확인해야 합니다.
- N+1 문제 해결: JPA 등을 사용할 때 연관 관계 데이터를 가져오기 위해 너무 많은 쿼리가 실행되고 있지는 않은지 점검하세요.
3. 서버 자원(Resource) 및 아키텍처 점검
네트워크 장비나 서버 자체의 부하가 원인일 수 있습니다. 특히 트래픽이 몰리는 시간대에만 발생한다면 하드웨어 리소스를 살펴봐야 합니다.
| 점검 항목 | 설명 및 해결책 |
|---|---|
| Connection Pool | 커넥션 풀이 가득 차서 새로운 연결을 맺지 못하는 경우. 풀 사이즈 확대. |
| Garbage Collection | Java 서버의 경우 Stop-the-world GC가 발생하여 서버가 일시 정지된 상태. |
| Firewall/Proxy | 방화벽이나 로드밸런서(L4/L7)에서 특정 시간 이후 세션을 강제로 끊는 설정 확인. |
4. 대안적 접근: 비동기 처리 도입
만약 처리해야 할 데이터가 너무 많아 물리적으로 응답 시간이 길 수밖에 없다면, 동기식(Synchronous) 요청 방식을 버려야 합니다.
사용자에게는 "요청이 접수되었습니다"라는 메시지를 즉시 반환하고, 실제 작업은 Message Queue(Kafka, RabbitMQ)를 이용해 백그라운드에서 비동기로 처리한 뒤, 완료 시 푸시 알림이나 소켓으로 결과를 알려주는 방식이 훨씬 안정적입니다.
📝 Read timed out 오류 해결 체크리스트
- Timeout 설정 확인: 클라이언트와 서버, 프록시의 타임아웃 설정값이 적절한지 대조합니다.
- DB 부하 모니터링: 에러 발생 시점의 DB CPU 사용량과 Slow Query 로그를 대조합니다.
- 네트워크 경로 확인: 중간에 위치한 로드밸런서나 방화벽의 유효 시간을 확인합니다.
- 페이징 처리: 한 번에 너무 많은 데이터를 조회하고 있다면
Pagination을 적용해 데이터 양을 줄입니다.
결국 Read timed out은 시스템의 어디에선가 '병목 현상'이 발생하고 있다는 경고입니다. 설정을 바꾸기에 앞서 정확한 지점을 모니터링하는 것이 가장 중요합니다.
'오류 > 안드로이드' 카테고리의 다른 글
| MultiDex keep file missing 오류 해결 방법 [안드로이드 스튜디오] (0) | 2026.02.18 |
|---|---|
| SSLHandshakeException 오류 해결 방법 (0) | 2026.02.14 |
| Execution failed for D8 오류 해결 방법 [안드로이드 스튜디오] (0) | 2026.01.29 |
| Could not find method compile() 오류 해결 방법 [안드로이드 스튜디오] (0) | 2026.01.28 |
| Program type already present 오류 해결 방법 (안드로이드 스튜디오) (0) | 2026.01.11 |