오류/안드로이드

Read timed out 오류 해결 방법 [안드로이드 스튜디오]

낄리 2026. 2. 20. 18:00

 

안녕하세요! 웹 개발을 하거나 다양한 서비스를 이용하다 보면 한 번쯤은 "java.net.SocketTimeoutException: Read timed out" 혹은 단순한 "Read timed out" 메시지를 마주하게 됩니다.

이 오류는 요청은 정상적으로 전달되었으나, 상대방(서버)으로부터 응답을 받는 과정에서 설정된 제한 시간을 초과했을 때 발생합니다. 즉, 기다리다 지쳐서 연결을 끊어버리는 현상이죠. 오늘은 이 오류의 근본적인 원인과 환경별(클라이언트, 서버, DB) 해결 방법을 심도 있게 살펴보겠습니다.


1. Read timed out 오류의 핵심 원인 분석

먼저 'Connect Timeout'과 'Read Timeout'의 차이를 이해하는 것이 중요합니다. Connect Timeout은 서버와 연결 자체가 안 되는 경우지만, Read Timeout은 연결은 성공했는데 데이터를 가져오지 못하는 경우입니다.

  • 서버의 처리 지연: 요청받은 데이터량이 너무 많거나 서버 로직이 복잡해 응답 생성에 시간이 오래 걸리는 경우.
  • 네트워크 불안정: 패킷 손실이 발생하거나 망 상태가 좋지 않아 데이터 전송이 중간에 끊기는 경우.
  • 타임아웃 설정 미비: 기본 타임아웃 값이 지나치게 짧게 설정되어 대용량 처리를 감당하지 못하는 경우.
  • DB 병목 현상: 쿼리 실행 속도가 느려 서버가 데이터를 가공하지 못하고 대기 상태에 빠지는 경우.

2. 환경별 해결 방법: 상황에 맞는 처방전

발생 위치에 따라 해결 전략이 달라져야 합니다. 본인의 상황에 맞는 해결책을 적용해 보세요.

가. 클라이언트/API 호출 시 (Java, Python, Retrofit 등)

가장 직접적인 해결책은 클라이언트 측의 Read Timeout 설정을 늘려주는 것입니다.

// Java OkHttpClient 예시
OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS) // 연결 제한 시간
    .readTimeout(30, TimeUnit.SECONDS)    // 데이터 읽기 제한 시간 (이 값을 늘려주세요)
    .writeTimeout(10, TimeUnit.SECONDS)
    .build();

만약 대용량 파일을 다운로드하거나 복잡한 계산 결과가 필요한 API라면, 기본값(보통 10초)보다 넉넉하게 30~60초로 설정하는 것이 권장됩니다.

나. 데이터베이스(DB) 연결 이슈

DB 쿼리가 너무 느려서 서버가 응답을 못 주는 경우라면, 타임아웃 설정 변경보다는 쿼리 최적화가 우선입니다.

  • 실행 계획(Explain)을 확인하여 인덱스가 제대로 걸려 있는지 확인하세요.
  • 불필요한 전체 테이블 스캔(Full Table Scan)이 발생하는지 점검하세요.
  • DBCP(Database Connection Pool)의 validationQueryTimeout 설정을 검토하세요.

다. 서버 및 WAS(Tomcat, Nginx) 설정

서버 자체의 설정 때문에 연결이 끊길 수도 있습니다.

  • Nginx: proxy_read_timeout 값을 수정 (기본 60s).
  • Tomcat: server.xmlconnectionTimeoutkeepAliveTimeout 확인.
  • Spring Boot: application.yml에서 server.tomcat.connection-timeout 설정 변경.

3. 근본적인 성능 개선을 위한 전략

단순히 타임아웃 시간만 늘리는 것은 '임시방편'일 수 있습니다. 근본적인 해결을 위해 다음 전략을 고려해 보세요.

비동기 처리(Asynchronous) 도입

응답 시간이 10초 이상 걸리는 작업이라면, 사용자를 마냥 기다리게 하는 대신 비동기 방식으로 전환하는 것이 좋습니다. 요청을 받으면 '작업 시작' 응답을 먼저 주고, 작업이 완료되면 알림(Webhook)이나 폴링(Polling) 방식을 사용하는 것이 UX와 시스템 안정성 측면에서 훨씬 우수합니다.

캐싱(Caching) 활용

자주 요청되는 데이터인데 처리 속도가 느리다면 Redis나 Memcached 같은 캐시 레이어를 도입하세요. 서버가 매번 복잡한 로직을 수행할 필요 없이 즉각적인 응답이 가능해집니다.


📌 핵심 요약 정리

  • 정의: 서버와 연결은 됐으나 응답 데이터를 받는 과정에서 시간이 초과됨.
  • 빠른 해결: 클라이언트(OkHttp, RestTemplate 등)의 ReadTimeout 값을 상향 조정.
  • 기술적 점검: 서버 로직 및 DB 쿼리 성능을 분석하여 병목 구간 제거.
  • 인프라 설정: Nginx, Tomcat 등 중간 프록시 서버의 타임아웃 설정 일치 여부 확인.
  • 장기적 대책: 시간이 오래 걸리는 작업은 비동기 처리 및 캐싱 도입 고려.