ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서블릿 HTTP 응답 데이터
    스프링/스프링 MVC 패턴 2023. 2. 10. 14:41
    @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_BAD_REQUEST);
    
            // [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");
    
    	content(response);
    
    
            PrintWriter writer = response.getWriter();
            writer.println("ok");
        }
    }

    HTTP 응답 데이터이다. 사용자가 요청을 하는 것이 아니라, 해당 url로 들어가면 개발자가 setHeader로 설정한 헤더를 통해 응답을 해주는 것이다.

    setHeader 4줄이 있는데 첫 번째 줄은 기본 형식으로 데이터를 응답해주는 것이고, 2, 3번째 줄은 이전 데이터를 삭제하는 등 정보가 잘 유지되게 하는것이다.

    4번째 response.setHeader("my-header", "hello");는 my-header라는 key값과 hello라는 value를 가진 Header를 내가 직접 만든 것이다. url에 들어가서 개발자 정보를 보게 된다면 위의 헤더들이 잘 응답하는 것을 확인할 수 있다.

     

    쿠키와 리다이렉트

     

    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);
    }
    
    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");
    }

    쿠키를 만들거나 리다이렉트를 하는 방법이다.

    여러 방법이 있지만 가장 좋은 방법은 쿠키는 쿠키 객체를 생성하고 생성값과 maxAge를 설정한 다음 response.addCookie(cookie)를 통해 쿠키를 넣어주는 것이다.

    리다이렉트 해당 url로 리다이렉트할 수 있게 도와주는 것이다.

    http:localhost:8080/response-header로 사이트를 들어가도 리다이렉트 해주는 코드가 있으면 바로 http:localhost:8080/basic/hello/-form.html로 넘어가게 된다.

     

     

    응답 방법

    1. 단순 텍스트 응답

    2. HTML 응답

    3. HTTP API - MessageBody JSON 응답

     

    1. 단순 텍스트 응답

    PrintWriter writer = response.getWriter();
        writer.println("ok");
    }

    단순 텍스트로 응답하는 방법이다.

    해당 웹 사이트에 들어가면 단순히 ok라는 메세지만 출력하게 된다.

    위에 코드에 포함된 내용이라 나머지 코드는 생략했는데 Content-Type은 text/plain으로 지정해줘야 한다.

     

     

     

    2. HTML 응답

    @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"); // html을 정상적으로 해주는 것
            response.setCharacterEncoding("utf-8"); // 한글 안깨지게 도와주는 것
    
            PrintWriter writer =response.getWriter();
            writer.println("<html>");
            writer.println("<body>");
            writer.println("  <div>안녕?</div>");
            writer.println("</body>");
            writer.println("</html>");
        }
    }

    html 방식으로 웹 사이트에서 응답을 해주는 것이다.

    writer.println안에 들어간 <html>, <body> 등은 웹 사이트에 표시하지 않아서 웹 사이트에 들어가보면 안녕?이라는 문자만 출력되어있다. 만약 특정 고객이 들어간다면 정적이 아니라 동적으로 사용할 수도 있다.

    HTTP 응답으로 HTML을 반환할 때는 content-type을 무조건 text/html로 지정해줘야 한다.

     

     

     

    3. HTTP API - MessageBody JSON 응답

     

    @WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
    public class ResponseJsonServlet extends HttpServlet {
    
        private ObjectMapper objectMapper = new ObjectMapper(); // json 방식으로 변경하기 위해 꼭 필요함
    
        @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는 따로 만든 클래스(username, age의 객체)
            helloData.setUsername("kim");
            helloData.setAge(20);
    
            //{"username": "kim", "age": 20} 으로 변경
            String result = objectMapper.writeValueAsString(helloData);
            response.getWriter().write(result);
        }
    }

    json 방식으로 웹 사이트에서 응답을 할 수 있다.

    아주 간단한 예제지만 username과 age를 설정하면 웹 페이지에서 json방식으로 응답해준다.

    {"username":"kim","age":20}

    웹 사이트에 출력되는 것은 위와 같다.

Designed by Tistory.