본문 바로가기
이슈

파일 업로드 에러(/tmp/undertow)

by 샐리_ 2023. 9. 12.

한동안 이미지 업로드 및 파일 업로드를 하지 않아 에러가 발생하였다.

아래는 에러 로그의 일부이다.

2023-09-12 10:01:02 [WARN ] [AbstractHandlerExceptionResolver.java]logException(199) : Resolved [org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException: C:\Users\hyo\AppData\Local\Temp\undertow.8002257472558705684.8080\undertow6081112499835763156upload]
2023-09-12 10:01:02 [ERROR] [LoggingExceptionHandler.java]handleThrowable(80) : UT005023: Exception handling request to /rest/file-contents/image
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException: C:\Users\hyo\AppData\Local\Temp\undertow.8002257472558705684.8080\undertow6081112499835763156upload
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:665)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)

원인은 스프링 부트 기반의 애플리케이션 서버에서 멀티파트에 대한 로케이션 속성을 지정하지 않으면 어더토우는 서블릿 배포 시 시스템의 임시 디렉토리 경로에 멀티파트 업로드를 위한 폴더를 생성한다. 애플리케이션 서버로 파일 업로드가 주기적으로 요청되지 않으면 멀티파트에 대한 임시 파일이 만들어지지 않는다. 리눅스 시스템에서 임시 디렉토리 경로에 존재하는 파일이나 디렉토리를 일정 기간 사용하지 않는 경우 삭제하도록 되어 있어 이로 인해 파일 업로드 시 멀티파트 요청에 대해 임시적으로 저장하는 과정에서 NoSuchFileException이 발생하였다.

해당 이슈에 관해서는 내장 톰캣에서도 동일한 이슈로 스프링 부트 프로젝트에도 이슈로 등록이 되어 있었다.

https://github.com/spring-projects/spring-boot/issues/9616

 

Tomcat does not create temporary directory used to store file uploads when it does not exist · Issue #9616 · spring-projects/s

Steps to Reproduce When spring boot application starts with default value of server.tomcat.basedir in application.properties. It creates two folders in /tmp folder. /tmp/tomcat.xxxxx/.. and /tmp-do...

github.com

해당 내용을 보면 스프링 부트 버전을 2.6 또는 2.7로 업그레이드하라고 나온다..

 

해결방안으로 여러 가지를 찾았다.

  1. 재기동
    재기동 시 시스템의 임시 디렉토리 경로에 멀티파트 업로드를 위한 폴더를 생성하나, 이 이후 업로드가 주기적으로 요청되지 않으면 다시 발생할 수 있다.
  2. 위의 github 내용처럼 버전 업그레이드
  3. /tmp/undertow* 디렉터리를 자동 정리에서 제외하도록 설정 변경
  4. 시스템 기본 임시 디렉터리를 사용하는 경우, 주기적인 스케줄로 파일 업로드 경로가 삭제되었는지를 확인하고 삭제되었으면 복구하도록
  5. 업로드된 파일의 임시 저장 공간 변경
    application.yml 설정 추가
spring:
    servlet:
    	multipart:
        	location: 변경할위치

 

사실 이전에 1번 방법인 재기동으로 조치했던 경험이 있다. 그 당시에 찾아봤던 내용에는 재기동이 해결법이라고 되어있어 재기동 후 상황을 종료해 버렸다. 생각해 보면 재기동은 임시조치일 뿐인데... 또 이런 상황이 생길 텐데 왜 더 찾아보려 하지 않았는지 반성하자...

5번 방법인 임시 저장 공간을 변경하였다.

현재 개발서버에서 파일 업로드를 하지 않아도 임시 저장 공간이 삭제되거나 에러가 발생하지 않는지 테스트 중이다. 이후 테스트 완료 후 결과를 적어야지.

23.09.18

한 달 정도 개발서버에 업로드하지 않고 테스트한 결과 삭제되거나 에러가 발생하지 않았다. 그렇게 테스트 완료 후 다음날 운영에 적용하였다.

 

임시 조치인 것들은 임시 조치하는 것에 그치지 않고 해결할 수 있는 방법을 꼭 찾아보자. 임시가 왜 임시인지 잊지 말자.

 

 

참고

https://kdevkr.github.io/undertow-temp-dir/

반응형

'이슈' 카테고리의 다른 글

RestTemplate 에러  (0) 2023.09.12