Spring/SpringMVC

HttpServletResponse - 기본 사용법

느리지만 꾸준하게 2022. 4. 22. 01:52
Cache-Control: no-cache, no-store, must-revalidate
Connection: keep-alive
Content-Length: 3
Content-Type: text/plain;charset=utf-8
Date: Thu, 21 Apr 2022 16:48:03 GMT
Keep-Alive: timeout=60
my-header: hello
Pragma: no-cache
Set-Cookie: myCookie=good; Max-Age=600; Expires=Thu, 21-Apr-2022 16:58:03 GMT

응답 HttpServletResponse에 대해서 알아보자.

 

HTTP 응답 메시지 생성

  • HTTP 응답코드 지정 200 400 500 401 403 등등
  • 헤더 생성
  • 바디 생성

편의 기능 제공

  • Content-Type, 쿠키, Redirect(300대)

 

코드로 한 번 자세히 알아보자.

response 패키지 안에 ResponseHeaderServlet 클래스를 만들어 주고 

 

 

 

실행을 시킨 다음 localhost:8080/response-header에서 network를 확인하면

// ResponseHeaderServlet

package hello.setvlet.basic.response;

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


@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 직접 200 적는거 보다 SC_OK가 낫다.
        // [status - line]
        response.setStatus(HttpServletResponse.SC_OK);

        // [response - headers]
        response.setHeader("Content-Type", "text/plain");
        // 캐시 완전 무효화
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        // 과거버전까지 캐시를 없앤다.
        response.setHeader("Pragma", "no-cache");
        // 내가 원하는 임의의 header에 실려나간다.
        response.setHeader("my-header", "hello");

        PrintWriter writer = response.getWriter();
        writer.println("ok");
    }
}

 

network 결과가 잘 나온다.

 

content type에 utf-8을 넣고 다시 돌려보자. content-type에 utf-8이 잘 들어갔다.

// [response - headers]
response.setHeader("Content-Type", "text/plain;charset=utf-8");
writer.println("안녕하세요");

 

 

 

Bad Request도 한번 보자. 아래부분을

response.setStatus(HttpServletResponse.SC_OK);

 

 

바꾸고 재실행하면 400 결과가 잘나온다.

response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

 

 

 

 

 

Content 편의 메서드를 작성해보자. 편의 메서드를 넣어주고 content-type이 2인것을 확인해주자.

// RequestHeaderServlet class

package hello.setvlet.basic.response;

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


@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 직접 200 적는거 보다 SC_OK가 낫다.
        // [status - line]
        response.setStatus(HttpServletResponse.SC_OK);

        // [response - headers]
        response.setHeader("Content-Type", "text/plain;charset=utf-8");
        // 캐시 완전 무효화
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        // 과거버전까지 캐시를 없앤다.
        response.setHeader("Pragma", "no-cache");
        // 내가 원하는 임의의 header에 실려나간다.
        response.setHeader("my-header", "hello");

        // [Header 편의 메서드]
        content(response);

        PrintWriter writer = response.getWriter();
        // print를 해줘서 content-type이 2인것을 확인
        writer.print("ok");
    }

    private void content(HttpServletResponse response) {
        //Content-Type: text/plain;charset=utf-8
        //Content-Length: 2
        //response.setHeader("Content-Type", "text/plain;charset=utf-8");
        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        // response.setContentLength(2); //(생략시 자동 생성)
    }

}

 

 

쿠키 편의 메서드에 대해서 알아보자.

        // [Header 편의 메서드]
//        content(response);
        cookie(response);
private void cookie(HttpServletResponse response) {
    //Set-Cookie: myCookie=good; Max-Age=600;
    // response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
    Cookie cookie = new Cookie("myCookie", "good");
    cookie.setMaxAge(600); //600초

    // addCookie를 하면 response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");와 같은 결과가 나온다.
    response.addCookie(cookie);
}

ResponseHeaders에 결과값이 잘 들어온 것을 확인 할 수 있다.

Cache-Control: no-cache, no-store, must-revalidate
Connection: keep-alive
Content-Length: 3
Content-Type: text/plain;charset=utf-8
Date: Thu, 21 Apr 2022 16:48:03 GMT
Keep-Alive: timeout=60
my-header: hello
Pragma: no-cache
Set-Cookie: myCookie=good; Max-Age=600; Expires=Thu, 21-Apr-2022 16:58:03 GMT

 

 

 

다시 리프레시하면 웹 브라우저에서 서버로 쿠키를 또 보낸다.

 

 

 

리다이렉트 편의 메서드를 만들어보자.

redirect(response);
private void redirect(HttpServletResponse response) throws IOException {
    //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");
}

 

http://localhost:8080/basic/response-header에서

http://localhost:8080/basic/hello-form.html로 redirection이 된다.

 

network 상으로 뜨지 않아서 이렇게 적었다. 왜 뜨지 않을까??,,,,, response-header이 304라고 떴다.

 

 

response-header  status 302

 

hello-form.html status 200

 

굉장히 불편하다. 한줄로 sendRedirect로 해주자.

private void redirect(HttpServletResponse response) throws IOException {
        //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");
    }

 

 

Response는 크게 어려움이 없다.

 

이렇게 실행하게 되면  HTTP 응답 스펙에 있는 start-line를 세팅하고 header 세팅하고 body-content에 있는 message body가 넣어지게 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 스프링 MVC 1편 - 벡앤드 웹 개발 핵심 기술>

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com