본문 바로가기
공부/springboot

SpringMVC(3) : 서블릿 요청에 대한 응답

by 샤샤샤샤 2023. 12. 11.

이 게시글에서는 사용자의 요청을 듣고, 서버가 응답해주는 방법을 정리한다.

사용자의 응답 역시 HTTP 메시지 형식인데, 이를 손쉽게 만드는 방법에 대한 내용이다.

 

HTTP 메시지 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");
        
        // 간단하게 만들기
        content(response);
    }
    
        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); //(생략시 자동 생성)
    }
}

두가지 방식이 존재하는데 첫번째는 직접 헤더 이름과 내용을 입력해주는 방식으로, setHeader() 함수를 통해 가능하다. 그러나 특별히 사용자가 지정한 헤더가 아니고서야 헤더에 들어가야할 내용은 모두 동일하기에, setContentType() 이나 setCharacterEncoding() 같이 좀더 편하게 설정할수 있는 함수가 존재한다.

 

쿠키 설정하기

HTTP 응답에는 어떤 데이터를 쿠키로 등록하라고 요청하는 것도 가능하다. 해당 요청은 아래와 같은 방식으로 만든다.

@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {

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

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

쿠키 역시 헤더에 직접 입력하는 대신, 쿠키 객체를 만들어 이를 응답 메시지에 추가하면 저절로 메시지의 내용이 완성된다.

 

300번대 요청 (Redirect)

300번대 redirect 응답을 내려줄때 url 을 이동시키기 위한 헤더를 만드는 방법은 아래와 같다.

@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {

    @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        redirect(response); // 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");
    }
 }

redirect 를 통한 url이동은 뒤로가기를 통해 이전 url로 이동하는 것이 불가능하다.

 

HTTP 메시지 바디를 넣기

1. 문자열

@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {

    @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
        //[message body]
        PrintWriter writer = response.getWriter();
        writer.print("ok");
    }
}

 

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");
        response.setCharacterEncoding("utf-8");

        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<body>");
        writer.println("<div>안녕?</div>");
        writer.println("</body>");
        writer.println("</html>");

    }
}

 

3. json

@WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
public class ResponseJsonServlet extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //ContentType: 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);
    }
}

 

HelloData 클래스

@Getter
@Setter
public class HelloData {

    private String username;
    private int age;
}

 

json으로 변환하고자 하는 경우, data 클래스의 객체를 ObjectMapper의 writeValueAsString() 함수를 통해 변환할수 있다.

이후에는 문자열과 똑같이 추가 가능하다.