[java] 서블릿에서의 동적 파일 다운로드 처리

웹 애플리케이션을 개발하다 보면 서버 측에서 동적으로 생성된 파일을 사용자에게 다운로드하도록 해야 할 때가 있습니다. 이번 글에서는 Java의 서블릿을 사용하여 동적 파일 다운로드를 처리하는 방법에 대해 알아보겠습니다.

1. 서블릿에서 파일 다운로드를 위한 클래스 작성

서블릿에서 파일 다운로드를 처리하기 위해서는 javax.servlet.http.HttpServlet 클래스를 상속받는 클래스를 작성해야 합니다. 다음은 파일 다운로드를 처리할 DownloadServlet 클래스의 예시입니다.

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

public class DownloadServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String filePath = "path/to/your/file.pdf";
        String fileName = "file.pdf";

        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

        FileInputStream inputStream = new FileInputStream(filePath);
        OutputStream outputStream = response.getOutputStream();

        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }

        inputStream.close();
        outputStream.close();
    }
}

위의 코드에서는 doGet() 메소드를 오버라이드하고, 다운로드할 파일의 경로와 파일 이름을 설정합니다.

response.setContentType() 메소드를 사용하여 다운로드할 파일의 MIME 타입을 지정합니다. 위의 예시에서는 일반적으로 사용되는 application/octet-stream을 사용했습니다.

response.setHeader() 메소드를 사용하여 다운로드할 파일의 이름을 지정합니다. 위의 예시에서는 “file.pdf”로 설정했습니다.

FileInputStream을 사용하여 파일을 읽고, response.getOutputStream()을 사용하여 파일을 클라이언트로 전송합니다. 작은 크기의 버퍼를 사용하여 파일의 내용을 조금씩 전송하도록 구현했습니다.

2. 서블릿 매핑 설정

다운로드 서블릿을 사용하기 위해서는 web.xml 파일에 서블릿 매핑을 설정해야 합니다. web.xml 파일에 다음과 같이 매핑 정보를 추가해 주세요.

<servlet>
    <servlet-name>DownloadServlet</servlet-name>
    <servlet-class>com.example.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DownloadServlet</servlet-name>
    <url-pattern>/download</url-pattern>
</servlet-mapping>

위의 예시에서 /download URL로 접속했을 때 DownloadServlet이 호출될 수 있도록 매핑이 설정되었습니다. 적절한 URL 패턴을 사용하여 원하는 경로로 설정해 주세요.

3. 파일 다운로드 테스트

서버에서 파일 다운로드를 정상적으로 처리하기 위해 테스트해 보겠습니다. 웹 브라우저에서 다운로드 서블릿이 매핑된 URL로 접속하면 다운로드가 시작됩니다.

예를 들어, http://localhost:8080/download로 접속하면 파일이 다운로드되는 것을 확인할 수 있습니다.

결론

이번 글에서는 Java의 서블릿을 사용하여 동적 파일 다운로드를 처리하는 방법에 대해 알아보았습니다. 서버 측에서 파일을 다운로드할 때에는 파일의 MIME 타입과 파일 이름을 설정해야 하며, 작은 크기의 버퍼를 사용하여 파일을 클라이언트로 전송하는 것이 중요합니다.