본문 바로가기
자바

ClientAbortException 시 HttpServletResponse 에서 .getOutputStream() 관리

by Hyeongjun_Ham 2024. 12. 5.

이전 게시물에서 IOException이 발생하면 내가 원하는대로 json 응답을 해주고 싶었다.

 

파일 다운로드 try catch 시 자원 반납, exception 시 json 응답

이번에 많은 테스트를 하며 기록해 두면 좋을 것 같은 내용이다. 상황은 다음과 같다.1. 파일 다운로드를 모두 void로 리턴한다.- 스트림으로 이미 내보내서 커밋 됐는데 또 json으로 리턴하려고

so23go.tistory.com

 

하지만 ClientAbortException이 발생한 경우에 outputStream.close()하는 부분에서 에러가 발생한다.

 

이유가 뭔지 알아보니 서블릿에서 몇몇의 경우에 알아서 스트림을 정리한다고 한다.

 

스트림을 정리하는 건 다음의 경우 등이 있다.

 

응답이 클라이언트로 완전히 전송된 경우

  • 서블릿의 HttpServletResponse.getOutputStream()이나 getWriter()를 통해 작성된 데이터가 클라이언트로 전송되면, 컨테이너는 이를 자동으로 닫는다고 한다.
  • 이 과정에서 스트림을 명시적으로 닫지 않아도 된다고 한다.
  • 그러나 명시적으로 닫아주는게 마음이 편하다.

컨테이너 내부에서 발생한 I/O 예외

  • 네트워크 연결 문제, 클라이언트가 연결을 강제로 끊는 경우 등에서 발생하는 IOException이 있다.
  • 이 경우 서블릿 컨테이너가 스트림을 정리하며 리소스를 해제한다.
  • 이 부분에 문제가 생겼던 것이다. ClientAbortException은 IOException의 자식이기에 해당 에러가 발생했을 때 내가 원하는대로 응답을 컨트롤 못하고 바로 정리되어 .close() 부분에서 문제가 생겼던 것이다.