Java/Basic

HttpServletResponse와 getOutputStream() 정리

마시멜로를찾아서 2025. 3. 24. 10:35
반응형

Java 웹 애플리케이션 개발 시 클라이언트에 데이터를 전달하기 위해 자주 사용하는 객체가 바로 HttpServletResponse입니다. 그중에서도 특히 파일 다운로드 또는 바이너리 데이터 전송 시 자주 사용하는 메소드가 getOutputStream()입니다.

이 두 개념을 명확히 이해하고 활용하는 방법을 살펴보겠습니다.


📌 1. HttpServletResponse란?

HttpServletResponse는 서블릿(Servlet)이 HTTP 요청을 처리한 뒤 클라이언트로 응답(response)을 보내기 위한 객체입니다. 주로 아래와 같은 작업을 수행합니다.

  • 응답 헤더(Header) 설정: 컨텐츠 타입, 캐싱, 리다이렉션 등
  • 상태 코드(Status Code) 설정: (200, 404, 500 등)
  • 응답 본문(Response Body) 전송

예를 들어 응답에 콘텐츠 타입을 설정할 때:

response.setContentType("text/html; charset=UTF-8");

상태 코드 설정 예시:

response.setStatus(HttpServletResponse.SC_OK); // 200 성공
response.setStatus(HttpServletResponse.SC_NOT_FOUND); // 404 페이지 없음

📌 2. getOutputStream()이란?

getOutputStream() 메소드는 HttpServletResponse에서 제공하는 메소드로, 클라이언트에게 바이너리 데이터를 전송할 때 사용합니다. 예를 들면:

  • 이미지, PDF 등 파일 다운로드 구현
  • 바이너리 데이터 (이미지나 동영상 등) 전송

주요 메서드 설명:

메서드명설명
ServletOutputStream HTTP 응답을 위한 바이너리 출력 스트림을 반환

📌 3. 사용 예시 (파일 다운로드)

아래는 파일 다운로드 기능을 구현할 때의 기본적인 코드 예시입니다.

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    // 파일 위치 지정 (예: 서버의 실제 파일 경로)
    String filePath = "/path/to/sample.pdf";

    // 파일 객체 생성
    File downloadFile = new File(filePath);
    FileInputStream inputStream = new FileInputStream(downloadFile);

    // 응답 헤더 설정 (파일명 지정)
    response.setContentType("application/pdf");
    response.setHeader("Content-Disposition",
            "attachment; filename=\"" + downloadFile.getName() + "\"");

    // 출력 스트림 획득
    ServletOutputStream outStream = response.getOutputStream();

    byte[] buffer = new byte[4096];
    int bytesRead = -1;

    // 파일 읽고 응답 출력 스트림으로 전송
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        outStream.write(buffer, 0, bytesRead);
    }

    inputStream.close();
    outStream.flush();
    outStream.close();
}
  • setContentType(): 파일 종류를 클라이언트에게 알려줍니다.
  • setHeader("Content-Disposition", ...): 브라우저가 해당 파일을 다운로드로 처리하게 지정합니다.

📌 4. 주의사항

  • getOutputStream()과 getWriter()는 함께 사용할 수 없습니다. 하나만 사용 가능합니다.
  • 스트림을 닫기 전에 반드시 flush() 하여 버퍼의 내용을 확실히 전송해야 합니다.
  • 스트림을 닫을 때는 반드시 try-with-resources 또는 명시적으로 close를 호출하여 리소스를 해제해주는 것이 중요합니다.

📌 5. getWriter()와의 차이점

  • getOutputStream(): 바이너리 데이터를 전송할 때 사용 (파일, 이미지 등)
  • getWriter(): 텍스트 데이터 전송할 때 사용 (HTML, JSON 등)
// 텍스트 전송 예시 (getWriter())
response.setContentType("text/plain; charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.println("Hello, world!");
writer.flush();

📌 정리하며

HttpServletResponse와 getOutputStream()을 정확히 이해하면 HTTP 응답 처리를 보다 명확하고 효율적으로 할 수 있습니다. 이 두 가지 기능을 잘 활용하여 사용자에게 다양한 데이터를 안정적으로 전달하는 애플리케이션을 만들어보세요! 🚀✨

반응형