티스토리 뷰

서블릿 응답

  • 클라이언트로 부터 온 요청을 담당하는 서블릿이 request를 처리하고 response를 보낸다. 이 response도 HTTP 프로토콜로서 형식을 만들어줘야 한다.
  • 직접 문자열을 만들어서 반환해도 되지만 상상만해도 머리가 아프다. 이거를 서블릿이 필요한 값만 전달해주면 알아서 응답 메시지로 만들어서 반환해 준다.
  • 응답코드, 응답 형식, 인코딩 설정, 캐시 설정 등을 할 수 있다.

 

응답 헤더 작성

Response Header의 구성요건을 직접 문자열로 작성하는 방법
@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 header
        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");

        // message body
        PrintWriter writer = response.getWriter();
        writer.print("OK");
    }
  • /response-header로 요청이 오면 아래 서블릿이 처리를 하게 된다.
  • 응답 메시지를 만드는 내용이 담겨있다.
    200 OK, Content-Type, Cache-Control, Pragma, 커스텀 헤더(my-header), message-body 등

응답 패킷의 헤더

위와 같이 문자열로 작성해도 된다. 하지만 오타의 위험성이 있고 정확히 어디에 뭘 설정하는지 헷갈릴 수 있다.

response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");

따라서 위와같이 setXXX()함수를 사용해서 값을 넣을 수 있다.

 

Cookie 설정
// 문자열 세팅 방법 
-> response.setHeader("Set-Cookie", "myCookie=good;Max-Age=600");

// 쿠키 객체 생성 후 세팅 방법
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); // 600초
response.addCookie(cookie);

 

Redirect 설정
HTTP Code 302로 "/basic/hello-form.html" 로 리다이렉트한다고 하자.

// 문자열로 세팅 방법
response.setStatus(HttpServletResponse.SC_FOUND); //302
response.setHeader("Location", "/basic/hello-form.html");

// sendRedirect() 함수 사용
response.sendRedirect("/basic/hello-form.html");

 

위와 같이 응답 패킷의 헤더를 작성하는 방법들이 존재한다. 클라이언트의 요청으로부터 적절한 응답을 쉽게 보내기 위해 서블릿은 다양한 기능을 갖고 있는것을 알 수 있다. 잘 기억해 두자.

 

응답 메시지 작성 - HTML

  • Response로 HTML View를 보여주고 싶다면 HTML 형식에 맞게 작성해서 반환하면 된다.
  • JSP, thymeleaf 등이 있지만 사용하지 않는 경우의 예시를 드는 것.
@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<body>");
        writer.println("    <div>Hello?</div>");
        writer.println("</body>");
        writer.println("</html>");
    }
}
  • /response-html로 요청이 오면 HTML 코드가 응답 메시지로 가게 된다. 이때 Content-Type은 text/html로 해줘야 한다.
  • 인코딩은 utf-8로 세팅

HTML 응답

HTML 코드는 안보이고 렌더링 되어서 화면에 보여지고 있는걸 확인할 수 있다.

 

응답 메시지 작성 - JSON

  • 현대에 서버-클라이언트 모델의 REST API 구조로 설계할 때 가장 많이 사용되는 데이터 전송 포맷이다.
  • 딱 값을 key-value로 보내고 이를 처리하는 것은 프론트에게 맡긴다. 혹은 다른 외부서버에 맡긴다. (결제 서버 등)
@WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
public class ResponseJsonServlet extends HttpServlet {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");

        HelloData helloData = new HelloData();
        helloData.setUsername("woonsik");
        helloData.setAge(28);
        helloData.setJob("jobSeeker");
        helloData.setSex("male");

        String result = objectMapper.writeValueAsString(helloData);
        response.getOutputStream().println(result);
    }
}
  • 먼저 보낼 Json 데이터를 객체화 하고, 해당 객체를 ObjectMapper를 이용해서 JSON 형식 문자열로 변환하여 보낸다.
  • Content-Type은 application/json, 인코딩은 utf-8이다. JSON은 항상 utf-8이다.

JSON 응답 메시지

받은 응답 메시지가 JSON 인 것을 확인할 수 있다.

 

응답 메시지의 Header 설정과 응답 메시지 바디에 넣는 데이터의 형식 등을 정리해보았다.
반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday