본문 바로가기
Spring/Spring MVC

[Spring MVC] 12. HttpServletResponse

by Kloong 2022. 11. 23.
더보기

Spring Boot & Thymeleaf 시리즈는 김영한 님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다.

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

 

마크다운 형식으로 작성한 글을 블로그에 다시 올리는 거라 가독성이 많이 떨어집니다. 조금더 편하게 보시려면 아래의 Github repository에서 보시면 됩니다.

 

GitHub - Kloong1/TIL: Today I Learned.

Today I Learned. Contribute to Kloong1/TIL development by creating an account on GitHub.

github.com

HttpServletResponse

역할

HTTP 응답 메세지를 생성한다

HTTP 응답 메세지를 하나 하나 구성하는 것은 너무 귀찮은 일이기 때문에, HttpServletResponse는 응답 메세지를 편하게 만들 수 있는 여러 메서드를 제공한다.

  • HTTP 응답 코드 지정
  • 헤더 생성
  • 바디 생성
편의 기능 제공
  • Content-Type 헤더의 값을 편리하게 지정 가능
  • 쿠키 관련 설정
  • Redirect 관련 설정

기본 사용법

HttpServletResponse가 제공하는 메서드들을 사용해서 HTTP 응답 메시지를 쉽게 구성할 수 있다.

ResponseHeaderServlet.java
package com.kloong.servlet.basic.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@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");

        //[header 편의 메서드]
        setContent(response);
        setCookie(response);
        setRedirect(response);

        //[response-body]
        response.getWriter().write("OK");
    }

    //content 관련 헤더 설정을 위한 편의 메서드
    private void setContent(HttpServletResponse response) {
        //response.setHeader("Content-Type", "text/plain;charset=utf-8") 와 동일하다.

        //Content-Type: text/plain;charset=utf-8
        //Content-Length: 2
        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        //response.setContentLength(2); //자동 생성되므로 보통 생략함
    }

    //Cookie 관련 헤더 설정을 위한 편의 메서드
    private void setCookie(HttpServletResponse response) {
        //response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600") 와 동일하다.

        //Set-Cookie: myCookie=good; Max-Age=600;
        Cookie cookie = new Cookie("myCookie", "good");
        cookie.setMaxAge(600); //600초
        response.addCookie(cookie);
    }

    //Redirect 관련 헤더 설정을 위한 편의 메서드
    private void setRedirect(HttpServletResponse response) throws IOException{
        //response.setStatus(HttpServletResponse.SC_FOUND);
        //response.setHeader("Location", "/basic/hello-form.html"); 와 동일하다.

        //Status Code 302
        //Location: /basic/hello-form.html
        //setRedirect()만 하면 상태 코드가 자동으로 302 같은 redirect에 대한 상태코드로 바뀐다
        response.sendRedirect("/basic/hello-form.html");
    }
}

요청을 보내고 응답 메시지를 확인해보면,

위와 같이 헤더가 잘 설정되어 있는 것을 볼 수 있다. Content-Length가 0인 이유는 redirection을 했기 때문이다. 실제로 redirection도 정상적으로 잘 된다. 쿠키도 잘 설정되었음을 확인할 수 있다.

 

참고로 웹 브라우저에서 동일한 요청을 다시 보내면,

쿠키를 읽어서 요청할 때 같이 보내는 것을 확인할 수 있다.

댓글