이전 편에서 서블릿을 통해 클라이언트의 요청을 처리하는 방법을 정리했다면, 이번에는 서버가 클라이언트에게 응답을 보내는 방식에 대해 자세히 알아본다.
서블릿은 HttpServletResponse 객체를 통해 HTTP 응답 메시지를 직접 구성할 수 있게 해준다.
1. HttpServletResponse란?
HttpServletResponse는 서버가 클라이언트에게 응답을 보낼 때 사용하는 객체로, 다음과 같은 기능을 제공한다:
- HTTP 응답 코드 설정
- 응답 헤더 설정
- 응답 바디 작성
- 쿠키 추가
- 리다이렉트 처리
이 객체를 활용하면 개발자가 응답을 원하는 방식으로 조작할 수 있다.
2. 상태 코드, 헤더, 바디 직접 설정하기
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 상태 코드 설정
response.setStatus(HttpServletResponse.SC_OK); // 200 OK
// 헤더 수동 설정
response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("my-header", "hello");
// 응답 바디
PrintWriter writer = response.getWriter();
writer.println("ok");
}
}
3. 편의 메서드들로 더 간단하게
Content-Type 설정
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
쿠키 설정
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); // 600초 유효
response.addCookie(cookie);
리다이렉트 처리
response.sendRedirect("/basic/hello-form.html");
302 Found 상태 코드와 Location 헤더가 자동으로 설정된다.
4. 다양한 응답 바디 예시
① 텍스트 응답
response.setContentType("text/plain");
response.getWriter().write("텍스트 응답입니다.");
② HTML 응답
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println("<h1>안녕하세요</h1>");
writer.println("</body>");
writer.println("</html>");
③ JSON 응답
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
HelloData data = new HelloData();
data.setUsername("kim");
data.setAge(20);
ObjectMapper objectMapper = new ObjectMapper();
String result = objectMapper.writeValueAsString(data);
response.getWriter().write(result);
5. 회고
이번 편을 공부하면서 응답의 모든 요소를 개발자가 직접 제어할 수 있다는 점이 꽤 인상 깊었다.
평소에는 스프링이 알아서 처리해주던 응답 메시지를 하나하나 수동으로 작성해보니, HTTP 프로토콜의 구조에 대해 더 깊이 이해할 수 있었다.
특히 Content-Type, CharacterEncoding, 쿠키, 리다이렉트 등의 설정이 제대로 되지 않으면 클라이언트와의 통신이 깨질 수 있다는 점을 실감했다.
실제로 내가 만든 프로젝트에서 쿠키 설정이 잘못되어 세션이 유지되지 않는 이슈를 겪었던 적이 있다. 그때는 원인을 몰라서 헤맸지만, 지금 와서 돌아보면 바로 이 응답의 구성 요소들이 원인이었던 거였다.
스프링 MVC는 이런 복잡한 과정을 잘 추상화해주지만, 그 속을 이해하고 있어야 진짜 실력이라고 느꼈다.
이번 강의는 내가 단순히 작동하는 웹을 넘어서 어떻게 작동하는지를 바라볼 수 있는 눈을 키워준 시간이었다.
'Spring' 카테고리의 다른 글
[Spring] MVC 5편 - 프론트 컨트롤러 v1 (0) | 2025.08.12 |
---|---|
[Spring 완전 정복 시리즈 - MVC편] 4편 - 서블릿에서 JSP, 그리고 MVC로 (4) | 2025.08.11 |
[Spring 완전 정복 시리즈 - MVC편] 2편 - 서블릿의 기본 개념과 동작 원리 (4) | 2025.08.07 |
[Spring 완전 정복 시리즈 - MVC편] 1편 - 웹 애플리케이션의 이해 (7) | 2025.08.02 |
[Spring 완전 정복 시리즈] 마지막편 - 기본편 완강 회고 및 마무리 (7) | 2025.08.02 |