Spring

[Spring 완전 정복 시리즈 - MVC편] 3편 - 서블릿 응답의 모든 것

dev-nadan 2025. 8. 7. 18:34

이전 편에서 서블릿을 통해 클라이언트의 요청을 처리하는 방법을 정리했다면, 이번에는 서버가 클라이언트에게 응답을 보내는 방식에 대해 자세히 알아본다.

 

서블릿은 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는 이런 복잡한 과정을 잘 추상화해주지만, 그 속을 이해하고 있어야 진짜 실력이라고 느꼈다.

이번 강의는 내가 단순히 작동하는 웹을 넘어서 어떻게 작동하는지를 바라볼 수 있는 눈을 키워준 시간이었다.