반응형
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 응답 처리를 보다 명확하고 효율적으로 할 수 있습니다. 이 두 가지 기능을 잘 활용하여 사용자에게 다양한 데이터를 안정적으로 전달하는 애플리케이션을 만들어보세요! 🚀✨
반응형
'Java > Basic' 카테고리의 다른 글
Spring vs. NestJS 상세 비교 (0) | 2025.03.24 |
---|---|
Filter(필터)란? (0) | 2025.03.24 |
Java 11 vs 17 vs 21: 주요 변화와 코드로 살펴보기 (0) | 2025.03.24 |
Spring boot vs Nestjs (0) | 2023.07.25 |
Spring Cloud MSA(Microservices Architecture)에서 Eureka 장/단점 (0) | 2023.07.25 |