* 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 등 웹(서버-클라이언트)에서 발생할 수 있는 에러이다.
'Web' 카테고리의 다른 글
좋은 URI Design의 요소들 (0) | 2022.03.24 |
---|---|
TLS10 is not accepted by client preferences [TLS12] 오류 해결 (0) | 2022.01.08 |
OAuth 2.0 (0) | 2021.11.07 |
백엔드 서버 배포 후 재빌드할 때 (2) | 2021.08.17 |
Spring Boot : jar, war 파일의 특성 (0) | 2021.08.16 |