반응형
admin 웹 페이지에서 사용하던 문서 다운로드 기능이 배포 후 갑자기 안되는 오류를 발견
오류
servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.io.IOException: Stream closed
원인
spring에서는 stream은 응답할때까지 close하면 안된다. spirng에서 응답 후 close 해주는데 이미 close가 되버려서 생긴 오류
디버깅
controller->service->db->service->controller 내부에 있는 log는 모두 잘 찍혀 있었고 이후에 response filter에서 해당 오류가 찍혀있었다. 수정 코드를 확인하니 최근에 스패로우 관련 정책이 업데이트가 되면서 service->다운로드 method에서 finally{ resource.close(); } 추가 확인
해결방법
스패로우 예외 신청 및 ResponseEntity에서 stream 관련 응답일 경우 close 호출을 미리 하지 않도록 공유
- ResponseEntity 작동원리
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(new InputStreamResource(inputStream));
- 컨트롤러가 ResponseEntity 반환
- Spring 내부에서 HandlerMethodReturnValueHandler가 이를 감지
- body에 있는 객체를 HttpMessageConverter로 직렬화 (예: JSON, 바이너리, etc)
- 응답 본문을 HttpServletResponse.getOutputStream() 또는 getWriter()로 씀
- Stream인 경우 자동으로 닫힘
* 일반 객체나 원시 값일 경우 별도로 닫아 줄 리소스가 없기 때문에 직렬화 후 응답 끝
반응형
'개발 > Java' 카테고리의 다른 글
레거시 스케줄러에 배치 처리 방식 적용하기 (1) | 2025.03.24 |
---|---|
대용량 파일 관리 스케줄러 개발 정리 (0) | 2025.03.04 |
자바 기초1 (0) | 2021.03.30 |