교육 및 인강/스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

서블릿(Servlet) - HttpservletResponse 기본 사용법, HTTP 응답 데이터 단순 텍스트 & HTML & API JSON

loop-study 2021. 6. 28. 20:47

인프런 김영한 님의 스프링 강의이며, 섹션 2 - 서블릿(Servlet)를 정리한다.

실습형 교육으로 자세한 설명이 궁금하면 수강을 권장한다. (실습은 모두 옛날 방식이며, 현재는 좀 더 편하게 사용한다.)

 

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

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

www.inflearn.com


HttpServletResponse - 기본 사용법

HttpServletResponse의 역할

- HTTP 응답 메시지 생성

- 응답 코드 지정 (200, 300, 400, 500 등)

- 바디 생성 가능

- 여러 편의 기능 제공 (Content-type, Cookie, Redirect)

 

응답 메시지 코드를 작성해보자.

@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-headers]
        response.setHeader("Content-type", "text/plain");
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("my-header", "hello");

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

http://localhost:8080/response-header 이동하고 개발자 도구로 확인해보자.

코드에서 작성한 my-header, Pragma 등이 지정한 값으로 나왔다.

setHeader(key, value)로 지정하는게 너무 반복되어 편의성으로 제공하는 기능들이 존재한다

// 헤더 편의성
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 편의성
    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");
    }

redirect 확인


HTTP 응답 데이터 - 단순 텍스트, HTML

* 이전까지 단순 텍스트는 진행해온 관계로 생략한다.

 

HTML 응답

HTMl을 반환할 때는 content-type을 text/html로 지정해야 한다.

@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Content-type : text/html;charset=utf-8
        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>");
    }
}

실행하고 페이지 소스보기를 사용하자


HTTP 응답 데이터 - API JSON

JSON 응답

JSON을 반환할 때는 content-type을 application/json로 지정한다.

@WebServlet(name = "responseJsonServlet", 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;charset=utf-8
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");

        HelloData helloData = new HelloData();
        helloData.setAge(20);
        helloData.setUsername("loop-study");

        // {"username":"loop-study", "age":20}
        String result = objectMapper.writeValueAsString(helloData);
        response.getWriter().write(result);
    }
}

실행된 결과화면