이 게시글은 인프런의 유료 강의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 수강하며 공부한 내용을 담고있습니다.
저작권에 의해 강의내용에 해당하는 전체 코드는 공개할 수 없습니다.
저작권에 의해 모든 내용을 담을 수 없습니다. 중복 및 반복되는 내용은 생략했습니다.
개요
HttpServletResponse 객체의 기초적인 내용을 공부한다. HTTP Response 의 header 와 body 를 작성하는 방법에 대해 공부한다.
response header 에 값 추가
header 는 status-line 과 header 로 구분된다. request 요청이 start-line 과 header 로 구분되는 것처럼 말이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// status-line : 응답 코드 200
// response.setStatus(200); // 또는
response.setStatus(HttpServletResponse.SC_OK); // 이것 사용
// 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("Set-Cookie", "myCookie=good; Max-Age=600");
response.setHeader("my-header", "hello");
// response.setStatus(HttpServletResponse.SC_FOUND); // Redirect
// response.setHeader("Location", "/basic/hello-form.html");
PrintWriter writer = response.getWriter();
writer.println("ok");
}
}
response 헤더를 살펴보면 직접 넣은 값들을 확인할 수 있다.(사진의 cookie 는 새로고침해야 볼 수 있음)
응답 코드는 직접 숫자를 집어넣을 수도 있지만 미리 정의된 값을 사용하는게 좋고, response.setHeader() 를 사용하면 범용적으로 사용할 수 있지만 오타가 발생하면 의도하지 않은 결과가 발생할 수 있다.
response header 에 값 추가. 다른 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// status-line : 응답 코드 200
// response.setStatus(200); // 또는
response.setStatus(HttpServletResponse.SC_OK); // 이것 사용
// header
// response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
// response.setContentLength(3); // 생략시 자동으로 계산된다
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
// response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600);
response.addCookie(cookie);
response.setHeader("my-header", "hello");
// response.setStatus(HttpServletResponse.SC_FOUND); // 응답코드 302, Redirect
// response.setHeader("Location", "/basic/hello-form.html");
// Rediect 는 위 방법 대신 아래 메서드를 사용할 수 있다.
// response.sendRedirect("/basic/hello-form.html");
PrintWriter writer = response.getWriter();
writer.println("ok");
}
}
response.setHeader() 말고 다른 방법을 사용하여 header 에 값을 추가할 수 있다.
자주 사용되는 몇몇 header 필드들은 미리 정의된 메서드를 사용하는 방법도 존재한다.
결과는 주석처리한 코드와 동일하다. Content-Length 가 3 인 이유는 출력되는 content 가 ok\n 3Byte 이므로 3 을 계산해서 자동으로 넣어준다.
Redirect 는 직접 해보면 된다.
body 에 값 넣어 보내기
단순 텍스트 넣어 보내기
1
2
3
4
response.getWriter().write("ok"); // 또는
PrintWriter writer = response.getWriter();
writer.println("ok");
설명은 안했지만 앞서 계속 ok 메시지를 넣어 보낸것을 알 수 있다.
HTML 넣어 보내기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@WebServlet(name = "responseBodyHtmlServlet", urlPatterns = "/response-body-html")
public class ResponseBodyHtmlServlet 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, Servlet!</div>");
writer.println("</body>");
writer.println("</html>");
}
}
코드 작성 후 실행해서 페이지 소스를 확인해보면 그대로 출력되는 것을 확인할 수 있다.
JSON 넣어 보내기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@WebServlet(name = "responseBodyJsonServlet", urlPatterns = "/response-body-json")
public class ResponseBodyJsonServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("utf-8"); // 안해도 됨.
HelloData data = new HelloData();
data.setUsername("kim");
data.setAge(20);
// 객체를 JSON 형식으로 변환
ObjectMapper objectMapper = new ObjectMapper();
String result = objectMapper.writeValueAsString(data);
response.getWriter().write(result);
}
}
1
2
3
4
5
6
@Getter
@Setter
public class HelloData {
String username;
int age;
}
1
2
3
http://localhost:8080//response-body-json 접속결과
{"username":"kim","age":20}
마찬가지 방법으로 JSON 을 보낼 수 있다. JSON 은 Spring MVC 에 포함되어 있는 Jackson 라이브러리를 사용하여 보내면 쉽게 JSON 을 작성할 수 있다.
참고
application/json 은 기본적으로 utf-8 을 사용하도록 정의되어 있어 별도로 utf-8 을 지정할 필요가 없다.
response.getWriter() 를 사용하면 자동으로 utf-8 을 추가한다. 이때는 response.getOutPutStream() 을 사용하면 그런 문제가 없다.
