티스토리 뷰
이번 글에서는 HttpServletResponse 에 대하여 공부하고 기본적인 사용법과 응답 데이터는 어떻게 처리를 하는지 공부할 예정이다. 선행 지식으로는 서블릿(Servlet)에 대해 이해하는 것을 추천드립니다.
현재는 스프링을 통하여 더 쉽게 사용할 수 있으나, 이 글의 목적은 순수하게 HttpServletResponse에 대해 그리고 순수 자바(JAVA)를 사용하여 공부하는 목적으로 작성된 글입니다.
HttpServletResponse
HttpServletResponse 는 HttpServletRequest와는 달리 HTTP 응답 정보를 캡슐화하는 객체입니다.
이 객체는 서버에서 클라이언트로 전송되는 응답 메시지의 내용과 속성을 확인하고 수정할 수 있습니다.
예를 들어, 응답 코드, 응답헤더와 바디 등의 정보가 포함됩니다.
HttpServletResponse 역할
- HTTP 응답 메시지 생성
- 응답 코드 지정(2xx, 3xx, 4xx, 5xx 등등)
- 바디 생성 가능
- 여러 편의기능 제공 (Content-type, Cookie, Redirect)
바로 아래에서 응답 메시지를 직접 만들어보며 이해를 해보도록 하겠습니다.
@WebServlet(urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 상태코드 지정
response.setStatus(HttpServletResponse.SC_OK);
// 응답 헤더 설정
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!!");
response.getWriter().write("ok");
}
}
위 코드와 사진에 대해 설명을 덧붙이자면, 우선 HttpServletResponse의 setHeader 메서드를 통하여 응답 헤더를 설정해주었습니다.
예를 들어, 'Content-Type'이라는 헤더값에는 "text/plain;charset=utf-8" 이라는 값을 설정해주었다.
기존에 있는 헤더가 아닌 우리가 직접 만든 헤더 'My-Header' 의 값에는 "hello!"를 설정해준것을 볼 수 있다.
추가로 사진에는 보이지않지만 setStatus 메서드를 통해 상태코드 또한 지정해주었다.
파라미터로는 HttpServletResponse.SC_OK 라는 상수가 들어가있는데, 200번을 의미합니다.
실제로 'jakarta.servlet.http.HttpServletResponse.java' 에 들어가보면 위 사진과 같이 다양한 상태코드들이 상수로 정의되어 있는 것을 확인할 수 있습니다.
HttpServletResponse 객체는 위와 같이 setHeader 메서드를통해 헤더를 설정하는 것이 너무 반복되고 불편하기때문에 제공하는 편리한 기능들이 존재한다.
@WebServlet(urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 헤더 편의 메서드
// response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
// 쿠키 편의 메서드
//response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600초
response.addCookie(cookie);
// redirect 편의 메서드
// 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");
}
}
위 편의 메서드를 사용한 결과는 setHeader 메서드를 사용한 결과와 동일합니다.
추가로 sendRedirect 메서드를 사용하면 응답코드를 302로 설정하고 리다이렉트가 이루어집니다.
리다이렉트를 진행할 때 응답코드를 302가 아닌 다른 응답코드로 설정하고 싶다면
sendRedirect 메서드가 아닌 setStatus 메서드와 setHeader 메서드를 사용해야 합니다.
(sendRedirect 메서드가 자동으로 302로 설정하기 때문)
HttpServletResponse 응답 데이터 처리 3가지
HTTP 응답 메시지는 다음과 같이 3가지 방법으로 데이터를 바디에 담아서 전달 합니다.
- 단순 텍스트 응답
- HTML 응답
- HTTP API - JSON 응답
단순 텍스트 응답
HttpServletResponse 객체가 제공하는 메서드인 getWriter 메서드를 통해 PrinterWriter 객체의 write()/println() 메서드를 사용하여 데이터를 간단하게 전송할 수 있습니다.
@WebServlet(urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrinterWriter printer = response.getWriter();
printer.write("ok");
//혹은 printer.println("ok");
}
}
다음과 같이 해당 서블릿을 요청하면 "ok" 문자가 화면에 출력되는 것을 확인할 수 있습니다.
write() 메서드와 println() 메서드는 단순 텍스트를 출력할 때 주로 사용하는 메서드인데, 둘의 차이점으로는 write() 메서드는 개행문자가(한줄 띄기) 없이 출력하고 println() 메서드는 개행문자를 추가하여 출력한다는 차이점이 있습니다.
@WebServlet(urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrinterWriter printer = response.getWriter();
printer.write("ok");
printer.write("hello"); //okhello 출력
printer.println("ok");
printer.println("hello"); //ok
//hello 출력
}
}
HTML 응답
HTML 응답은 단순 텍스트 응답처럼 println() 메서드를 통해 데이터를 전송합니다.
여기서 주의할 점은, content-type을 text/html로 지정해야 합니다.
예시 코드는 아래와 같습니다.
@WebServlet(urlPatterns = "/response-html")
public class ResponseHeaderServlet extends HttpServlet {
@Override
public 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>안녕하세요</div>");
writer.println("</body>");
writer.println("</html>");
}
}
해당 서블릿 URL에 들어가보면, 위와 같이 HTML 렌더링이 잘 된것을 확인할 수 있습니다.
즉, 자바 코드에 HTML 코드를 작성한다고 생각하시면 됩니다.
HTTP API - JSON 응답
JSON 데이터를 응답하는 방법은, HttpServletRequest에서 API JSON 데이터를 받는 방법을 알아보면서 배웠던 ObjectMapper를 사용합니다.
ObjectMapper는 JSON을 객체로, 객체를 JSON 형식으로 변환해주는 역할을 합니다.
JSON을 객체로 변환하는 것은 readValue() 메서드이지만, 객체를 JSON으로 변환해주는 메서드는 writeValueAsString() 입니다.
예를 들어, HelloData 클래스의 data 객체가 있고 필드인 username 의 값으로는 baek을, age의 값으로는 20을 가진다고 생각해봅시다.
이 객체를 ObjectMapper를 사용하여 json 형태로 변환해주는 예시 코드는 아래와 같습니다.
JSON 응답을 할 때에도 HTML Form을 전송할 때와 같이 content type을 지정해주어야 하는데, application/json으로 지정해주어야 합니다.
@WebServlet(urlPatterns = "/response-json")
public class ResponseJsonServlet 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("baek");
helloData.setAge(20);
//{"username":"baek", "age":20}
String result = objectMapper.writeValueAsString(helloData);
response.getWriter().write(result);
}
}
참고(출처)
https://loopstudy.tistory.com/169
https://velog.io/@zihs0822/HttpServletResponse-%EC%82%AC%EC%9A%A9%EB%B2%95
https://passionate.tistory.com/36
김영한님의 스프링 MVC 1편 강의 (인프런)
'Spring | Spring Boot' 카테고리의 다른 글
[Spring] 요청 매핑- @RequestMapping, @PathVariable (0) | 2024.05.16 |
---|---|
[Spring] HttpServletRequest 요청 데이터 전송 3가지 방법 (0) | 2024.05.15 |
[Spring] HttpServletRequest 개요 및 기본 사용법 (0) | 2024.05.10 |
[Spring] 빈 스코프(Bean Scope) 완벽하게 이해하기 (1) | 2024.04.30 |
[Spring] 싱글톤 패턴이란? 그리고 스프링에서의 싱글톤 (0) | 2024.04.25 |
- Total
- Today
- Yesterday
- HttpServletRequest
- 스프링 컨테이너
- 자바
- 인터페이스 추상클래스 비교
- 스프링http
- 빈생명주기콜백
- 스프링
- 크롤링
- 객체지향설계원칙
- 요청데이터
- 요청매핑
- Thymeleaf
- 인터페이스 추상클래스 차이
- Spring
- Java
- 네이버지도크롤링
- 인터페이스
- Overloding
- 스프링 빈
- Servlet
- 타임리프
- RequiredArgsConstruct
- 추상클래스
- 인식안됨
- redirectattribute
- erd툴
- HTTP요청
- 타임리프 기본기능
- 스프링특징
- erd editor
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |