WEB/Spring MVC 1

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(서블릿)

Tony Lim 2021. 3. 27. 22:17
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        System.out.println("HelloServlet.service");
        System.out.println("request = " + request);
        System.out.println("response = " + response);
    }
request = org.apache.catalina.connector.RequestFacade@49a07c45
response = org.apache.catalina.connector.ResponseFacade@67b0b9cb

여러가지 WAS들이 있을텐데 그들이 각각 HttpServletRequest ,Response 등등의 인터페이스 스펙에 맞춰서 구현체를 만들어 낸것이다. 

service 메소드안에 request parameter를 받아서 response를 생성해보는 코드이다.

        String username = request.getParameter("username");
        System.out.println("username = " + username);

        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        response.getWriter().write("hello"+ username);

 

HttpServletRequest 역할 = 개발자가 편리하게 HTTP 요청 메시지를 사용할 수있도록 개발자 대신에 HTTP 요청 메세지를 파싱한다. 그리고 그결과를 HttpServletRequest 객체에 담아서 제공한다.

 

 

HTTP 요청 데이터 - 3가지 방법

  1. Get 쿼리 파라미터 = 메시지 바디없이
  2. POST HTML form(tag) = 메세지 받에 쿼리 파라미터 형식으로 전달
    (cotent-type : application/x-www-form-urlencoded)
  3. JSON

HTTP 요청 데이터 - API 메세지 바디 - JSON

@WebServlet(name = "requestBodyJsonServlet",urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet
{

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        ServletInputStream inputStream = request.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        System.out.println("messageBody = " + messageBody);

        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
        System.out.println("helloData.getUsername() = " + helloData.getUsername());
        System.out.println("helloData.getAge() = " + helloData.getAge());
    }
}
messageBody = {
    "username":"hello",
    "age":20
}
helloData.getUsername() = hello
helloData.getAge() = 20

JSON도 그냥 String 일 뿐임으로 getInputStream() 으로 받아올 수 있다. 후에 objectMapper를 통해서 저절로 순수 자바 객체랑 매핑을 해준다. 


HttpServeltResponse 사용법

HTTP 응답코드 지정, 헤더 생성, 바디 생성, 쿠키 , 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);
        String tony = "tonyisfancy";
        //response header
        response.setHeader("Content-Type", "text/plain");
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        response.setHeader("Paragma", "no-cache");
        response.setHeader("my-header", "hello");

        Cookie cookie = new Cookie("tonyname", tony);
        cookie.setMaxAge(600);
        response.addCookie(cookie);
        response.sendRedirect("https://tonylim.tistory.com");

        response.getWriter().println("ok");
    }
}

쿠키및 리다이렉션 설정도 편하게 제공해준다.