개발/Java

Spring ResponseEntity Stream 처리 관련 오류

반응형

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));
  1. 컨트롤러가 ResponseEntity 반환
  2. Spring 내부에서 HandlerMethodReturnValueHandler가 이를 감지
  3. body에 있는 객체를 HttpMessageConverter로 직렬화 (예: JSON, 바이너리, etc)
  4. 응답 본문을 HttpServletResponse.getOutputStream() 또는 getWriter()로 씀
  5. Stream인 경우 자동으로 닫힘

 * 일반 객체나 원시 값일 경우 별도로 닫아 줄 리소스가 없기 때문에 직렬화 후 응답 끝

 

반응형

'개발 > Java' 카테고리의 다른 글

레거시 스케줄러에 배치 처리 방식 적용하기  (1) 2025.03.24
대용량 파일 관리 스케줄러 개발 정리  (0) 2025.03.04
자바 기초1  (0) 2021.03.30