"요청을 보냈는데 계속 대기 상태에서 멈춰있어요." IT 업무를 하다 보면 누구나 한 번쯤 겪는 상황입니다. PENDING(timeout) 상태는 단순한 네트워크 지연이 아닌, 시스템 전체의 안정성을 위협할 수 있는 심각한 문제입니다. 실제로 대형 웹서비스에서는 timeout 문제로 인한 장애가 전체 매출의 15-20% 손실로 이어지기도 합니다.
이 가이드에서는 PENDING(timeout) 상태가 발생하는 근본 원인부터 상황별 맞춤 해결 방법까지, 실무에서 바로 적용할 수 있는 완전한 해결책을 제시합니다.
PENDING(timeout)이란? 정확한 정의와 이해
기본 개념과 작동 원리
PENDING(timeout) 상태는 클라이언트가 서버에 요청을 보냈지만, 설정된 시간 내에 응답을 받지 못해 대기 상태가 지속되다가 최종적으로 시간 초과로 실패하는 상황입니다. 네트워크 타임아웃(Timeout)은 서버로 요청을 보냈지만 일정 시간 동안 답변을 받지 못하면 발생해요.
이 상태는 단순히 "느린 응답"과는 본질적으로 다릅니다. 시스템이 명확한 시간 제한을 두고, 그 시간을 초과하면 연결을 포기하는 적극적인 방어 메커니즘입니다.
Timeout의 종류별 특성
Connection Timeout
- TCP 연결 설정 단계에서 발생
- 3-Way Handshake 과정에서 응답 없음
- 일반적으로 3-10초 내에 발생
Read Timeout
- 연결은 성공했지만 데이터 수신 실패
- Connection time out과는 다르게 클라이언트와 서버가 connection은 맺어졌지만, I/O 작업이 길어지거나 데이터를 읽어가지 못하는 상황이 되어, 설정된 시간을 초과하여 생기는 문제이다.
- 서버의 처리 지연이나 대용량 데이터 전송 시 주로 발생
Write Timeout
- 데이터 전송 과정에서 발생
- 네트워크 대역폭 부족이나 수신 측 처리 능력 한계
상황별 PENDING(timeout) 발생 원인 분석
웹 브라우저에서의 timeout 원인
DNS 조회 실패 도메인 이름을 IP 주소로 변환하는 과정에서 DNS 서버가 응답하지 않는 경우입니다. 특히 잘못된 DNS 서버 설정이나 DNS 서버의 장애가 주요 원인입니다.
방화벽 차단 기업 내부 방화벽이나 라우터에서 특정 포트나 프로토콜을 차단할 때 발생합니다. Connection Timeout을 해결하려면 방화벽 설정을 다시 확인해주세요.
서버 과부하 대상 웹서버가 동시 연결 수 한계에 도달했거나, CPU/메모리 부족으로 새로운 요청을 처리할 수 없는 상태입니다.
데이터베이스 연결에서의 timeout 원인
커넥션 풀 고갈 애플리케이션에서 설정한 데이터베이스 연결 수를 모두 사용 중일 때 새로운 연결 요청이 대기 상태가 됩니다.
잠금(Lock) 대기 다른 트랜잭션이 필요한 리소스를 점유하고 있어서 현재 쿼리가 실행되지 못하는 경우입니다.
네트워크 지연 연결이 결국 성공하면 네트워크 문제입니다. 데이터베이스 서버와의 물리적 거리나 네트워크 품질 문제로 응답 시간이 지연됩니다.
API 통신에서의 timeout 원인
외부 서비스 의존성 마이크로서비스 아키텍처에서 다른 서비스의 응답을 기다리는 동안 발생하는 연쇄적 지연입니다.
리소스 경합 동일한 리소스에 대한 동시 접근으로 인한 경합 상황에서 일부 요청이 대기 상태에 빠집니다.
단계별 문제 진단 방법
1단계: 기본 연결성 확인
Ping 테스트
ping google.com
ping -c 4 8.8.8.8
정상적인 ping 응답이 있다면 기본적인 인터넷 연결은 문제없습니다. 패킷 손실률이 높거나 응답 시간이 불규칙하다면 네트워크 품질 문제를 의심해야 합니다.
DNS 조회 테스트
nslookup google.com
dig google.com
DNS 조회가 실패하거나 응답 시간이 길다면 DNS 서버 문제일 가능성이 높습니다.
2단계: 포트 및 서비스 확인
포트 연결 테스트
telnet example.com 80
nc -zv example.com 443
특정 포트로의 연결이 실패한다면 해당 서비스가 중단되었거나 방화벽에서 차단되고 있을 가능성이 있습니다.
서비스 상태 확인
curl -I <http://example.com>
curl -w "@curl-format.txt" -o NUL -s "<http://example.com>"
HTTP 헤더 정보와 응답 시간을 확인하여 서버 상태를 파악할 수 있습니다.
3단계: 시스템 리소스 분석
네트워크 연결 상태 확인
netstat -an | grep ESTABLISHED
ss -tuln
트래픽이 많은 웹 서비스를 운영하다보면 CPU는 여유가 있지만 웹서버가 응답을 제대로 처리하지 못하고 먹통이 되는 경우를 종종 보게 됩니다. 이때 CLOSE_WAIT나 TIME_WAIT 상태의 연결이 과도하게 많다면 소켓 리소스 고갈을 의심해야 합니다.
브라우저별 해결 방법
Google Chrome에서의 해결법
캐시 및 쿠키 정리
- Ctrl + Shift + Delete 키 조합으로 인터넷 사용 기록 삭제 창 열기
- *시간 범위를 "전체"**로 설정
- 쿠키, 캐시된 이미지 및 파일 모두 선택하여 삭제
DNS 캐시 초기화 Chrome 주소창에 다음을 입력:
chrome://net-internals/#dns
"Clear host cache" 버튼을 클릭하여 DNS 캐시를 초기화합니다.

네트워크 설정 초기화
chrome://net-internals/#sockets
"Flush socket pools" 버튼으로 소켓 연결 풀을 초기화합니다.

Firefox에서의 해결법
네트워크 설정 재설정
- about:config 페이지 접속
- network.http.connection-timeout 값을 90으로 증가
- network.http.response.timeout 값을 300으로 조정
안전 모드 실행 확장 프로그램이나 테마로 인한 문제인지 확인하기 위해 안전 모드로 Firefox를 실행합니다.
Safari에서의 해결법
개발자 메뉴 활성화 환경설정 → 고급 → "메뉴 막대에서 개발자 메뉴 보기" 체크 후, 개발자 메뉴에서 "캐시 비우기" 실행합니다.
서버 측 timeout 설정 최적화
웹 서버 설정 조정
Apache 설정
# httpd.conf 또는 .htaccess
TimeOut 300
KeepAliveTimeout 15
Nginx 설정
# nginx.conf
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 300s;
이런 설정을 통해 서버가 클라이언트 요청을 기다리는 시간을 적절히 조정할 수 있습니다.
애플리케이션 레벨 최적화
데이터베이스 연결 풀 튜닝
// Spring Boot application.properties
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
HTTP 클라이언트 timeout 설정
// JavaScript fetch API
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000);
fetch('<https://api.example.com/data>', {
signal: controller.signal
}).then(response => {
clearTimeout(timeoutId);
return response.json();
}).catch(error => {
if (error.name === 'AbortError') {
console.log('Request timed out');
}
});
네트워크 환경별 해결 전략
기업 내부 네트워크 환경
프록시 서버 설정 확인 많은 기업에서 보안을 위해 프록시 서버를 운영하는데, 이로 인한 timeout이 발생할 수 있습니다.
# 프록시 설정 확인
echo $http_proxy
echo $https_proxy
방화벽 규칙 검토 IT 관리자와 협력하여 다음 사항을 확인합니다:
- 필요한 포트(80, 443, 8080 등)의 아웃바운드 허용
- 신뢰할 수 있는 도메인의 화이트리스트 등록
- DPI(Deep Packet Inspection) 정책으로 인한 지연 확인
홈 네트워크 환경
공유기 설정 최적화
- 펌웨어 업데이트 확인 및 적용
- QoS 설정으로 웹 브라우징 우선순위 높이기
- 포트 포워딩 설정으로 특정 서비스 최적화
ISP 관련 이슈 해결
# 다른 DNS 서버 사용 테스트
nslookup google.com 8.8.8.8
nslookup google.com 1.1.1.1
모바일 네트워크 환경
데이터 절약 모드 해제 Android나 iOS의 데이터 절약 모드가 활성화되어 있으면 백그라운드 앱의 네트워크 접근이 제한될 수 있습니다.
네트워크 전환 테스트 WiFi와 모바일 데이터를 번갈아 사용하여 특정 네트워크에 문제가 있는지 확인합니다.
고급 트러블슈팅 기법
패킷 캡처를 통한 정밀 분석
Wireshark 활용
# 특정 호스트와의 통신만 캡처
wireshark -f "host example.com"
패킷 캡처를 통해 다음을 확인할 수 있습니다:
- TCP 핸드셰이크 실패 지점
- DNS 쿼리 응답 지연 시간
- HTTP 요청/응답의 정확한 타이밍

검색 필터 : http.host == "http://www.youtube.com" or tls.handshake.extensions_server_name == "http://www.youtube.com"
로드 밸런서 환경에서의 이슈
Health Check 설정 문제 로드 밸런서가 비정상 서버로 요청을 라우팅하는 경우 timeout이 발생할 수 있습니다.
세션 affinity 문제 특정 서버에만 요청이 집중되어 과부하가 발생하는 경우입니다.
CDN 관련 timeout 이슈
Origin 서버 응답 지연 이 오류는 프로그램이나 데이터베이스 쿼리와 같은 프로세스에서 주로 발생합니다. 원본 서버의 과부하가 원인일 수 있습니다.
Edge 서버 캐시 미스 CDN 캐시에 콘텐츠가 없어서 원본 서버에서 가져오는 과정에서 지연이 발생할 수 있습니다.
예방을 위한 모니터링 및 알림 설정
실시간 모니터링 시스템 구축
응답 시간 모니터링
# curl을 이용한 간단한 응답 시간 측정 스크립트
curl -w "Time: %{time_total}s\\n" -o /dev/null -s <http://example.com>
Nagios나 Zabbix 설정 예시
# Nagios HTTP 체크 명령어
/usr/lib/nagios/plugins/check_http -H example.com -t 30 -w 10 -c 20
프로액티브 알림 설정
응답 시간 임계값 설정
- 경고: 응답 시간 > 5초
- 위험: 응답 시간 > 10초 또는 timeout 발생
자동 복구 메커니즘 timeout 발생 시 자동으로 서비스를 재시작하거나 트래픽을 다른 서버로 우회시키는 스크립트를 구성합니다.
클라우드 환경에서의 timeout 해결
AWS 환경
ELB 설정 최적화
{
"idle_timeout": 60,
"connection_draining_timeout": 300
}
Lambda 함수 timeout 설정 서버리스 환경에서는 함수 실행 시간 제한을 적절히 설정해야 합니다.
Azure 환경
Application Gateway 설정 백엔드 풀의 timeout 설정을 애플리케이션 특성에 맞게 조정합니다.
Google Cloud 환경
Cloud Load Balancer 최적화 헬스 체크 간격과 timeout 설정을 적절히 구성하여 불필요한 트래픽 라우팅을 방지합니다.
개발자를 위한 코드 레벨 해결책
Python에서의 timeout 처리
import requests
from requests.exceptions import Timeout
try:
response = requests.get('<http://example.com>', timeout=10)
print(response.text)
except Timeout:
print("Request timed out")
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
JavaScript에서의 timeout 처리
// Promise with timeout
const timeoutPromise = (promise, timeout) => {
return Promise.race([
promise,
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), timeout)
)
]);
};
// 사용 예시
timeoutPromise(fetch('<https://api.example.com>'), 5000)
.then(response => response.json())
.catch(error => console.log('Request failed:', error.message));
Java에서의 timeout 처리
// RestTemplate timeout 설정
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory factory =
new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(10000);
restTemplate.setRequestFactory(factory);
성능 최적화를 통한 근본적 해결
데이터베이스 쿼리 최적화
인덱스 최적화 자주 조회되는 컬럼에 적절한 인덱스를 생성하여 쿼리 응답 시간을 단축합니다.
쿼리 캐싱 Redis나 Memcached를 활용하여 자주 요청되는 데이터를 메모리에 캐싱합니다.
애플리케이션 아키텍처 개선
비동기 처리 도입 시간이 오래 걸리는 작업은 백그라운드에서 비동기로 처리하고, 사용자에게는 즉시 응답을 반환합니다.
회로 차단기(Circuit Breaker) 패턴 외부 서비스 호출 시 연속적인 실패가 발생하면 일정 시간 동안 호출을 차단하여 시스템 전체의 안정성을 보장합니다.
마무리: 안정적인 시스템 구축을 위한 종합 전략
PENDING(timeout) 문제는 단순한 기술적 이슈가 아닌, 사용자 경험과 비즈니스 연속성에 직접적인 영향을 미치는 중요한 과제입니다. 이 가이드에서 제시한 해결 방법들을 순차적으로 적용하면서, 여러분의 환경에 가장 적합한 솔루션을 찾아보세요.
핵심 기억사항:
- 예방이 치료보다 중요: 사전 모니터링과 적절한 timeout 설정
- 단계적 접근: 기본적인 연결성 확인부터 고급 최적화까지 순차적 진행
- 환경별 맞춤 해결: 브라우저, 서버, 네트워크 환경에 따른 차별화된 접근
- 지속적 모니터링: 문제 해결 후에도 성능 지표를 지속적으로 관찰
특히 HTTP 요청시 Timeout을 설정하였음에도, 실제로는 설정한 시간을 크게 초과하여 지연이 발생했던 경우처럼, 설정과 실제 동작이 다를 수 있음을 항상 염두에 두고 실제 환경에서의 테스트를 게을리하지 마세요.
앞으로는 더욱 복잡해지는 마이크로서비스 아키텍처와 클라우드 네이티브 환경에서 timeout 관리의 중요성이 더욱 커질 것입니다. 이 가이드를 통해 학습한 원리와 기법들을 바탕으로, 더욱 안정적이고 성능 좋은 시스템을 구축해 나가시기 바랍니다.
이 가이드가 PENDING(timeout) 문제 해결에 도움이 되셨다면 팀 동료들과 공유해주세요. 특정 환경에서의 timeout 이슈나 추가적인 해결 방법이 궁금하시다면 댓글로 문의해주시기 바랍니다.