본문 바로가기

dev

[JAVA] Broken pipe, SocketTimeoutException 발생 원인 분석 - 1

 

운영중인 전산에서 간헐적으로 Broken pipe나 SocketTimeoutException가 발생하는 문제가 있었다

 

인터넷에 찾아보니 Socket통신시에 양 측에서 통신도중에 한쪽이 강제로 끊겼을 때

아직 연결되어 있는 측에서 데이터를 보내려고 하는 경우 발생한다고 한다

 

 

하지만 전산 내 사용하는 Socket통신의 코드를 봐도 예외가 날 부분이 없었고 예외처리도 되어있는데 계속 예외가 발생했다.

 

 

결론만 말하자면 프론트엔드는 이미 연결이 종료되었으나 백엔드에서 응답을 보내려고 해 발생하던 오류였다

 

 

계속 찾다보니 화면단에서 많은 리소스를 차지하는 파일 다운로드 기능이 있었는데

 

요청 후 정해진 시간내에도 백엔드에서 응답을 받지못해 오류가 발생하고

 

 

그 뒤 백엔드에서 요청을 처리하고 프론트엔드로 반환하던 중 Broken pipe예외가 발생한다.

 

자세한 정보는 AI에게 문의해 알아봤다

 

주요 원인

  • 사용자가 프론트엔드(React) 화면을 닫거나 새로고침 등으로 요청을 보낸 후 연결을 끊었을 때, 백엔드가 아직 응답을 보내지 못한 상태라면, 백엔드가 데이터를 보내려 할 때 Broken pipe 예외가 발생합니다.
  • 서버가 응답을 보내기 전에 프론트엔드에서 타임아웃이 발생하거나, 네트워크 문제로 연결이 끊겨도 동일한 현상이 나타날 수 있습니다.

Socket 사용 여부

  • HTTP 통신(axios 등)은 내부적으로 TCP 소켓을 사용합니다. 즉, 특별히 WebSocket이나 TCP 소켓 프로그래밍을 하지 않아도, HTTP 요청/응답 자체가 소켓 위에서 동작합니다.
  • Broken pipe 예외가 발생했다는 것은 꼭 "소켓 프로그래밍"을 직접 하고 있다는 뜻이 아니라, HTTP 연결(즉, 소켓 연결)에서 한쪽이 먼저 연결을 끊었기 때문입니다.

현재 프론트는 react를 사용하고 있는데 react에서 변경사항을 감지하거나 변경사항을 번들링할 때 서버와 소켓통신을 한다고 한다.

 

지금까지 직접 구현한 소켓통신이 문젠줄 알고 계속 찾아봤었는데 찾을 수 없는게 정상이었다.