네트워크의 타임아웃 종류

시훈·2025년 4월 23일

⏱️ 네트워크 타임아웃 차이: Connection, Read, Socket Timeout

애플리케이션에서 외부 API 호출이나 DB 연결 시 간헐적으로 발생하는 Timeout 예외, 다들 한 번쯤은 겪어봤을 것이다. 그런데 정확히 어떤 타임아웃이 어디서 발생한 건지 헷갈릴 때가 많다. 이 글에서는 자주 혼동되는 세 가지 타임아웃:

  • Connection Timeout
  • Socket Timeout (Read Timeout)
  • Read Timeout

을 개념부터 실제 적용 사례까지 한 번에 정리한다.


🔌 1. Connection Timeout

서버에 연결을 시도할 때까지 기다리는 최대 시간이다. 흔히 TCP 3-way-handshake가 이루어지는 시점에서 서버가 응답하지 않으면 발생한다.

✅ 언제 발생할까?

  • 대상 서버가 죽어있다
  • 방화벽에 막혔다 (ex. IP 허용 안 됨)
  • 도메인 이름이 잘못됐거나 DNS 오류

🛠️ 예시 (Java - HttpClient)

HttpClient client = HttpClient.newBuilder()
    .connectTimeout(Duration.ofSeconds(5)) // 연결 시도 제한 5초
    .build();

📡 2. Socket Timeout (또는 Read Timeout)

서버와 연결은 되었지만, 데이터 수신이 일정 시간 내에 일어나지 않을 때 발생하는 타임아웃이다. 주로 다음 응답 패킷이 오지 않아서 연결이 끊기는 상황이다.

✅ 언제 발생할까?

  • 서버가 너무 느리게 응답하거나
  • 중간 네트워크 문제가 있어 패킷이 유실된 경우

🛠️ 예시 (Java - RestTemplate)

HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(5000); // 5초
factory.setReadTimeout(3000);    // 3초

☝️ 이때의 Read Timeout은 Socket Timeout과 거의 같은 의미로 사용된다.


📥 3. Read Timeout (I/O Timeout)

서버와 연결이 이미 수립된 상태에서, 특정 I/O 작업(예: InputStream.read())이 지정된 시간 내에 완료되지 않으면 발생하는 타임아웃이다.

✅ 언제 발생할까?

  • 서버가 대용량 데이터를 천천히 전송 중
  • 너무 많은 데이터를 요청함 (예: 대용량 SQL 쿼리)

일부 프레임워크에서는 Socket Timeout과 Read Timeout을 구분하지 않고 동일하게 쓰기도 한다.


🤔 왜 타임아웃 설정이 중요할까?

  • 리소스 낭비 방지: 응답이 없는 연결을 오래 유지하면 시스템 리소스가 고갈될 수 있다.
  • 시스템 장애 예방: 무한 대기 상황을 방지하고 빠르게 실패(Fail Fast)할 수 있게 해준다.
  • 사용자 경험 개선: 느린 요청을 빠르게 끊고 예외 처리를 하면 UX가 나아진다.

🧪 타임아웃 테스트는 어떻게 할까?

1. 로컬에서 딜레이 서버 띄우기

// Express.js 예제
app.get('/slow', (req, res) => {
  setTimeout(() => res.send('응답 지연 완료'), 10000); // 10초 딜레이
});

2. Postman이나 Curl로 호출 후 시간 측정

curl --max-time 3 http://localhost:3000/slow

🧾 정리표

항목의미주로 발생하는 위치
Connection Timeout연결 수립 전, 서버 응답 기다리는 최대 시간TCP 3-way-handshake
Socket Timeout연결 후, 응답 패킷이 지연되면 발생패킷 수신/전송 중
Read Timeout연결 후, I/O 작업 지연 시 발생InputStream.read(), DB 쿼리 등

✅ 마무리

Connection, Read, Socket Timeout은 이름은 비슷하지만 각각 다른 네트워크 단계에서 발생한다. 서비스 장애 예방빠른 에러 대응을 위해 명확한 구분과 적절한 설정이 필수다.

실전에서는 "Connection이 안 돼요" 같은 말보다 정확히 어떤 Timeout인지 로그로 구분하고, 그에 맞는 트러블슈팅을 해보자

profile
Backend Developer / Cloud Engineer

0개의 댓글