[java] Guice와 서블릿 파일 다운로드 처리 방법

애플리케이션에서 파일 다운로드 기능을 구현하기 위해 Guice와 서블릿을 함께 사용할 수 있습니다. Guice는 의존성 주입(Dependency Injection) 프레임워크로, 서블릿을 통해 파일 다운로드 기능을 처리할 수 있습니다. 이번 블로그 포스트에서는 Guice와 서블릿을 사용하여 파일 다운로드 기능을 구현하는 방법에 대해 알아보겠습니다.

1. 의존성 추가

먼저, Maven 또는 Gradle과 같은 빌드 도구를 사용하여 프로젝트에 Guice 의존성을 추가해야 합니다. 아래는 Maven을 사용하는 경우의 예시입니다.

<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>4.2.3</version>
</dependency>

2. Guice 모듈 설정

다음으로, Guice의 모듈을 설정해야 합니다. Guice 모듈은 의존성 주입에 사용되는 설정 파일로, 파일 다운로드 서블릿과 관련된 의존성을 정의하는 역할을 합니다. 예를 들어, DownloadModule 클래스를 작성하여 Guice 모듈을 구성할 수 있습니다.

import com.google.inject.AbstractModule;

public class DownloadModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(DownloadServlet.class);
    }
}

위에서는 DownloadServlet 클래스를 Guice에 바인딩(binding)하고 있습니다. 이렇게 Guice에 바인딩하면 필요한 의존성을 주입받을 수 있게 됩니다.

3. 서블릿 작성

다음으로, 파일 다운로드를 처리하는 서블릿을 작성해야 합니다. DownloadServlet 클래스를 생성하고, 파일 다운로드를 처리하는 doGet 메소드를 구현합니다.

import com.google.inject.Inject;
import com.google.inject.servlet.RequestScoped;

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

@RequestScoped
public class DownloadServlet extends HttpServlet {
    @Inject
    public DownloadServlet() {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String filePath = "/path/to/file.pdf"; // 다운로드할 파일 경로

        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=\"file.pdf\"");

        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
             OutputStream os = response.getOutputStream()) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        }
    }
}

위에서는 doGet 메소드를 통해 파일의 경로를 설정하고, 적절한 응답 헤더를 설정한 후 파일을 다운로드합니다. 이 코드를 사용하면 사용자가 /download와 같은 URL을 호출하면 지정된 파일이 다운로드됩니다.

4. Guice 사용

마지막으로, Guice를 사용하여 서블릿을 등록해야 합니다. 예를 들어, GuiceServletConfig 클래스를 작성하여 Guice와 서블릿을 설정할 수 있습니다.

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;
import com.google.inject.servlet.ServletModule;

public class GuiceServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                serve("/download").with(DownloadServlet.class);
            }
        }, new DownloadModule());
    }
}

위에서는 /download URL에 DownloadServlet을 매핑하도록 설정하고, DownloadModule을 Guice 모듈로 등록합니다. 이렇게 설정하면 Guice가 서블릿을 생성하고 의존성 주입을 수행하여 파일 다운로드 기능을 처리할 수 있습니다.

결론

Guice와 서블릿을 함께 사용하여 파일 다운로드 기능을 구현하는 방법에 대해 알아보았습니다. Guice를 사용하면 의존성 주입을 통해 서블릿과 관련된 의존성을 관리할 수 있으며, 파일 다운로드와 같은 기능을 쉽게 구현할 수 있습니다.