공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
HttpServletResponse - 기본 사용법
HttpServletResponse란?
HttpServletResponse는 클라이언트로부터의 요청에 응답을 보낼 때 사용되는 객체이다. 이 객체를 통해 상태 코드 설정, 헤더 추가, 쿠키 설정, 리다이렉트 처리 등의 기능을 사용할 수 있다.
ResponseHeaderServlet 예제
다음은 HttpServletResponse의 기본 사용법을 보여주는 서블릿 예제이다.
package hello.servlet.basic.response;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// [status-line]
response.setStatus(HttpServletResponse.SC_OK);
// [response-headers]
response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("my-header", "hello");
//[Header 편의 메서드]
content(response);
cookie(response);
redirect(response);
//[message body]
PrintWriter writer = response.getWriter();
writer.println("ok");
}
//Content 편의 메서드
private void content(HttpServletResponse response) {
//Content-Type: text/plain;charset=utf-8
//Content-Length: 2
//response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
//response.setContentLength(2); //(생략시 자동 생성)
}
// 쿠키 편의 메서드
private void cookie(HttpServletResponse response) {
//Set-Cookie: myCookie=good; Max-Age=600;
//response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600초
response.addCookie(cookie);
}
// redirect 편의 메서드
private void redirect(HttpServletResponse response) throws IOException {
//Status Code 302
//Location: /basic/hello-form.html
//response.setStatus(HttpServletResponse.SC_FOUND); //302
//response.setHeader("Location", "/basic/hello-form.html");
response.sendRedirect("/basic/hello-form.html");
}
}
1. Content 편의 메서드
서블릿에서 response.setHeader 메서드를 사용하지 않고도 setContentType, setCharacterEncoding과 같은 편의 메서드를 이용하여 응답 콘텐츠의 타입과 인코딩을 설정할 수 있다.
- response.setContentType("text/plain");
- response.setCharacterEncoding("utf-8");
2. 쿠키 편의 메서드
쿠키는 클라이언트에 저장되어 서버와 클라이언트 간의 상태를 유지하는 데 사용된다. response.addCookie 메서드를 통해 쿠키를 클라이언트에 보낼 수 있다.
myCookie라는 이름의 쿠키를 생성하고, 600초 동안 유지되도록 설정하여 클라이언트에게 전달한다.
3. 리다이렉트 편의 메서드
리다이렉트는 클라이언트에게 다른 URL로 이동하라고 응답하는 방식이다. response.sendRedirect 메서드를 사용하여 간편하게 리다이렉트를 구현할 수 있다.
서버는 클라이언트에게 /basic/hello-form.html 경로로 이동하라는 302 응답을 보낸다.
Http 응답 데이터 - 단순 텍스트, HTML
HTTP 응답 메시지란?
HTTP 응답 메시지는 클라이언트의 요청에 대한 서버의 응답을 전달하는 데 사용된다. 응답 메시지는 주로 다음과 같은 내용을 담고 있다.
- 상태 코드: 응답이 성공했는지, 실패했는지 등을 나타내는 코드. 예: 200 OK, 404 Not Found.
- 헤더: 응답에 대한 메타데이터. 예: Content-Type, Cache-Control 등.
- 메시지 바디: 실제 응답 데이터(HTML, JSON, 텍스트 등).
단순 텍스트 응답
이전 예시에서 writer.println("ok");로 간단한 텍스트 응답을 보내는 방법을 다루었다. 이는 PrintWriter를 사용해 응답 메시지의 바디에 텍스트를 전송하는 방식이다.
HTML 응답
HTML을 반환할 때는 Content-Type을 text/html로 지정해야 브라우저가 이를 HTML로 렌더링할 수 있다.
다음은 HTML 응답을 보내는 서블릿의 예시이다.
package hello.servlet.basic.response;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Content-Type: text/html;charset=utf-8
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.print("<html>");
writer.print("<body>");
writer.print(" <div>안녕</div>");
writer.print("</body>");
writer.print("</html>");
}
}
- Content-Type 설정
- response.setContentType("text/html");로 응답의 콘텐츠 타입을 text/html로 설정한다.
- response.setCharacterEncoding("utf-8");로 UTF-8 인코딩을 지정한다.
- HTML 출력
- PrintWriter 객체를 이용해 HTML 태그를 직접 응답 바디에 출력한다.
- <html>, <body>, <div> 등의 HTML 태그를 사용하여 브라우저에 표시될 내용을 구성한다.
실행
해당 서블릿을 실행하려면 브라우저에서 다음 URL을 입력하면 된다.
http://localhost:8080/response-html
또한, 브라우저의 페이지 소스 보기 기능을 사용하여 실제 HTML 결과를 확인할 수 있다. 이 방법을 통해 서블릿이 브라우저로 전송한 HTML 코드가 어떻게 렌더링 되는지 확인할 수 있다.
이와 같은 방식으로 단순 텍스트나 HTML 응답을 처리할 수 있다.
Http 응답 데이터 - API JSON
JSON 응답
API 서버는 주로 JSON 형태로 데이터를 응답한다. JSON은 경량 데이터 형식으로, 다양한 언어에서 쉽게 처리할 수 있어 API 통신에 널리 사용된다.
JSON 응답 서블릿 예제
package hello.servlet.basic.response;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "responseJasonServlet", urlPatterns = "/response-json")
public class ResponseJasonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Content-Type: application/json
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
HelloData helloData = new HelloData();
helloData.setUsername("kim");
helloData.setAge(20);
//{"username":"kim", "age":20}
String result = objectMapper.writeValueAsString(helloData);
response.getWriter().write(result);
}
}
- Content-Type 설정
- response.setContentType("application/json");로 JSON 응답을 명시.
- response.setCharacterEncoding("utf-8");로 UTF-8 인코딩 설정.
- Jackson 라이브러리 사용
- ObjectMapper를 사용하여 Java 객체를 JSON 문자열로 변환.
- writeValueAsString() 메서드를 통해 Java 객체(HelloData)를 JSON 문자열로 변환한 후, 이를 응답으로 전송한다.
JSON 응답 처리
Jackson 라이브러리의 ObjectMapper는 Java 객체를 JSON 형식으로 쉽게 변환할 수 있도록 도와준다.
Java 객체
HelloData helloData = new HelloData();
helloData.setUsername("kim");
helloData.setAge(20);
변환된 JSON 문자열
{"username":"kim", "age":20}
서블릿에서 이 JSON 데이터를 클라이언트로 반환하게 된다.
실행
해당 서블릿을 실행하려면 브라우저에서 다음 URL을 입력한다.
http://localhost:8080/response-json
참고 사항
- application/json은 스펙상 UTF-8 형식을 사용하도록 정의되어 있다. 즉, charset=utf-8 같은 추가 파라미터는 명시할 필요가 없다.
- 하지만 response.getWriter()를 사용하면 자동으로 charset=utf-8이 추가된다. 이를 피하고 싶다면 response.getOutputStream()을 사용할 수 있다.
'Spring MVC' 카테고리의 다른 글
[MVC] 서블릿(3) (0) | 2024.10.14 |
---|---|
[MVC] 서블릿(2) (1) | 2024.10.11 |
[MVC] 서블릿(1) (3) | 2024.10.10 |
[MVC] 웹 애플리케이션 이해 (0) | 2024.10.10 |