Spring MVC의 CommonsMultipartResolver를 사용하여 업로드한 임시파일은 지워질까?

Java|2010. 2. 23. 23:30

Spring MVC는 Commons FileUpload 패키지를 이용한 파일 업로드를 지원한다.


아무 생각 없이 사용하고 있다가 문득 FileUpload를 Spring 없이 사용할 때는 FileCleanerCleanup 리스너를 web.xml에 등록해서 temporary 파일을 자동으로 삭제하게 한다는게 기억났다.


아차! 지금이라도 등록해 줘야하는건가? 하는 생각에 확인차 서버의 temporary 경로를 살펴봤다.

그런데 이상하게도 파일 업로드 후에 남아 있었어야할 임시 파일이 하나도 없었다.


CommonsMultipartResolver가 뭔가 알아서 지우는건가 해서 뒤져봐도 관련 코드는 없었다.

이해가 안가서 좀 더 뒤지다가 결국 DispatcherServlet에서 삭제 코드를 찾았다. doDispatch 메서드의 finally 절에 cleanupMultipart 메서드를 호출하는 부분이 있었던 것이다.

public class DispatcherServlet extends FrameworkServlet {


    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {

        ......

        try {

            ......

        finally {

            // Clean up any resources used by a multipart request.

            if (processedRequest != request) {

                cleanupMultipart(processedRequest);

            }


            // Reset thread-bound context.

            RequestContextHolder.setRequestAttributes(previousRequestAttributes, this.threadContextInheritable);

            LocaleContextHolder.setLocaleContext(previousLocaleContext, this.threadContextInheritable);


            // Clear request attributes.

            requestAttributes.requestCompleted();

            if (logger.isTraceEnabled()) {

                logger.trace("Cleared thread-bound request context: " + request);

            }

        }

    }


    /**

     * Clean up any resources used by the given multipart request (if any).

     * @param request current HTTP request

     * @see MultipartResolver#cleanupMultipart

     */

    protected void cleanupMultipart(HttpServletRequest request) {

        if (request instanceof MultipartHttpServletRequest) {

            this.multipartResolver.cleanupMultipart((MultipartHttpServletRequest) request);

        }

    }

    ......

}




댓글()