커넥션 타임아웃
클라이언트가 서버와 연결을 시도할 때, 연결이 맺어지기까지 기다리는 최대 시간입니다. 이 시간 내에 연결이 안 되면 에러가 발생합니다.
왜 필요한가?
- 서버가 다운되었을 때 무한정 기다리는 것 방지
- 네트워크 문제 시 빠른 실패 처리
- 리소스 낭비 방지
동작 방식
클라이언트 ──── 연결 시도 ────▶ 서버
│ │
│ Connection Timeout │
│ (예: 3초) │
│ │
│ 3초 내 연결 안 되면 │
└─── ConnectTimeoutException 발생
| 항목 | Connection Timeout | Read Timeout |
| 시점 | 연결 수립 단계 | 데이터 수신 단계 |
| 상황 | TCP 연결 시도 | 요청 후 응답 대기 |
| 원인 | 서버 다운, 네트워크 끊김 | 서버 처리 지연 |
[Connection Timeout] [Read Timeout]
클라이언트 ─── 연결 ───▶ 서버 ─── 응답 대기 ───▶
│ │
여기서 실패 여기서 실패
설정 예시
Java HttpClient
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(3))
.build();
RestTemplate (Spring)
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory factory =
new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(3000); // 3초
factory.setReadTimeout(5000); // 5초
restTemplate.setRequestFactory(factory);
WebClient (Spring WebFlux)
HttpClient httpClient = HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000);
WebClient client = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
spring:
datasource:
hikari:
connection-timeout: 3000 # 풀에서 커넥션 얻는 시간
validation-timeout: 5000 # 커넥션 유효성 검사 시간
타임아웃 종류 정리
| 타임아웃 | 설명 |
| Connection Timeout | 연결 수립까지 대기 시간 |
| Read Timeout | 응답 데이터 수신 대기 시간 |
| Write Timeout | 요청 데이터 전송 대기 시간 |
| Socket Timeout | Read + Write 통합 |
적절한 설정값
Connection Timeout: 1~3초 (빠른 실패)
Read Timeout: 3~30초 (작업에 따라 다름)
- 너무 짧으면: 정상 요청도 실패
- 너무 길면: 장애 전파, 리소스 낭비