Web

Broken Pipe Error의 의미와 대처법

superbono 2022. 3. 1. 16:35

* Broken Pipe Error란?

 

[java.net.SocketException : Broken pipe]



잦은 입출력 호출로 발생한다. 

예) 처리 중인 요청(또는 응답)을 사용자가 기다리지 않고, 새로고침을 하거나 종료, 연속 클릭 등으로 제대로 연결이 마무리(또는 맺어지지 x) 되지 않았을 때 소켓이 끊어져서 발생하게 된다. 

 

[java.io.IOException: Broken pipe]

 

receiver에서 송신 받은 데이터를 제때 처리하지 못하는 상황(네트워크 문제 / receiver의 cpu max와 같은 문제 등)에서 sender가 계속 보내는 경우에 발생한다. 

 

두 소켓(receiver, sender) 상의 통신에서 한 소켓(대개 receiver)이 갑작스러운 이상으로 종료가 된 상황에서 다른 하나의 소켓(대개 sender)이 이를 알지 못하고 데이터를 계속 전송하려 할 때 발생한다. 

 

예) receiver(client)가 sender에게 요청을 하여, sender(server)가 작업을 완료하여 receiver에게 결과를 넘겨주기 전에 receiver(client)의 네트워크가 끊겼던지, cpu가 해당 결과를 처리할 수 없다던지, 브라우저가 종료되었다던지, 다른 화면으로 이동하였든지 

 

서버(receiver)에서 작업 결과를 전달할 곳이 없어 발생하는 현상이다.  

 

 

* 대처법

서버 측의 입장에서 이 에러를 생각해보자면, client에서의 동작으로 발생하는 에러를 서버에서 처리를 해줄 수 있는 방법이 없다. 

예를 들어 사용자가 요청을 보내고 새로 고침을 하거나, 브라우저를 종료하는 등의 행위를 서버에서 막을 수 없기 때문에

이러한 에러가 발생하면 서버가 죽지 않게끔 exceptionhandler를 통해서 무시하도록 처리를 하는 방법이 대표적이다. 

 

그 외에 중복 요청 막기, request를 보낸 뒤 response가 올 때까지 client가 응답을 기다리도록 하는 방법들이 있다. 

1. 중복 요청 막기 

연속적인 버튼 클릭을 방지하거나 exception 처리 부분에서 오류를 뱉지 않도록 처리

2. request 후 response 기다리기

client에서 보낸 데이터를 받고 server가 데이터를 리턴할 때까지 client가 응답을 기다리도록 설정 (새로고침 등을 막는 방법?) 

 

이 포스트에서는 java만 다루었지만, java에서만 발생할 수 있는 에러는 아니고 python 등 웹(서버-클라이언트)에서 발생할 수 있는 에러이다.

 

참고 https://lookingfor.tistory.com/entry/%EC%9E%90%EB%B0%94-ExceptionBroken-pipe-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95

 

자바 Exception:Broken pipe 오류 해결 방법

오류 발생 원인 java.net.SocketException: Broken pipe : 보통 잦은 입출력 호출로 발생된다. 처리 중인 요청(또는 응답)을 사용자가 기다리지 않고, '새로고침(또는 종료, 연속 클릭 등)'을 자주 실행하게

lookingfor.tistory.com