이전 게시물에서 IOException이 발생하면 내가 원하는대로 json 응답을 해주고 싶었다.
파일 다운로드 try catch 시 자원 반납, exception 시 json 응답
이번에 많은 테스트를 하며 기록해 두면 좋을 것 같은 내용이다. 상황은 다음과 같다.1. 파일 다운로드를 모두 void로 리턴한다.- 스트림으로 이미 내보내서 커밋 됐는데 또 json으로 리턴하려고
so23go.tistory.com
하지만 ClientAbortException이 발생한 경우에 outputStream.close()하는 부분에서 에러가 발생한다.
이유가 뭔지 알아보니 서블릿에서 몇몇의 경우에 알아서 스트림을 정리한다고 한다.
스트림을 정리하는 건 다음의 경우 등이 있다.
응답이 클라이언트로 완전히 전송된 경우
- 서블릿의 HttpServletResponse.getOutputStream()이나 getWriter()를 통해 작성된 데이터가 클라이언트로 전송되면, 컨테이너는 이를 자동으로 닫는다고 한다.
- 이 과정에서 스트림을 명시적으로 닫지 않아도 된다고 한다.
- 그러나 명시적으로 닫아주는게 마음이 편하다.
컨테이너 내부에서 발생한 I/O 예외
- 네트워크 연결 문제, 클라이언트가 연결을 강제로 끊는 경우 등에서 발생하는 IOException이 있다.
- 이 경우 서블릿 컨테이너가 스트림을 정리하며 리소스를 해제한다.
- 이 부분에 문제가 생겼던 것이다. ClientAbortException은 IOException의 자식이기에 해당 에러가 발생했을 때 내가 원하는대로 응답을 컨트롤 못하고 바로 정리되어 .close() 부분에서 문제가 생겼던 것이다.
'자바' 카테고리의 다른 글
파일 다운로드 try catch 시 자원 반납, exception 시 json 응답 (0) | 2024.12.04 |
---|---|
mockMvc에서 HttpServletRequest 값 넣는 방법 (0) | 2024.12.03 |
[스프링] .properties 에 값이 없는 경우 @Value 기본 값 설정 (0) | 2024.02.19 |
[JDBC] DB PK변경 방법 (0) | 2024.02.07 |
스프링 테스트 코드 @RestControllerAdvice를 거치게 하는 방법 (0) | 2024.01.25 |