스프링 MVC(2)

2 minute read

서블릿

  • 스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan을 지원
@ServletComponentScan //서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getMethod();
    request.getProtocol();
    request.getRequestURL();
    request.isSecure();
    request.getHeaderNames();
    request.getCookies();
    request.getContentType();
 }
}
  • @WebServlet : 서블릿 애노테이션 (name : 서블릿 이름, urlPatterns : URL 매핑)
  • HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 service 메서드를 실행
  • HTTPServletRequest는 HTTP 요청 메시지를 개발자 대신 파싱 후 그 결과를 HttpServletRequest 객체에 담아 제공

GitHub Logo

서블릿을 이용한 - HTTP 요청 데이터

  • GET 쿼리 파리미터
    • ?/url?username=hello&age=20
    • 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
    • ex) 검색, 필터, 페이징등에서 많이 사용하는 방식
      //단일
      request.getParameter(name);
      //복수 ex) username=hello&username=chang
      request.getParameterValues();
      reqeust.getParameterNames();
      
  • POST : HTML FORM
    • content-type: application/x-www.form-urlencoded
    • 메시지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20
    • ex) 회원 가입, 상품 주문, HTML Form 사용
    • GET방식과 같이 request객체를 이용하여 데이터를 가져옴
  • HTTP message body에 데이터를 직접 담아서 요청
    • HTTP API에서 주로 사용, JSON, XML, TEXT
      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.getUsername() = " + helloData.getAge());
      
      
      }
      
  • 데이터 형식은 주로 JSON 사용(POST, PUT, PATCH)

서블릿을 이용한 - HTTP 응답

  • HTTP 응답 메시지 생성
    • HTTP 응답 코드 지정
    • 헤더 생성
    • 바디 생성
  • 편의 기능 제공
    • Content-Type
    • 쿠키
    • 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);//200과 같음

        //[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");
        response.setHeader("my-header","hello");
        cookie(response);
        redirect(response);

        //[message-body]
        PrintWriter writer = response.getWriter();
        writer.println("ok ");


    }
    private void cookie(HttpServletResponse response){
        Cookie cookie = new Cookie("myCookie","good");
        cookie.setMaxAge(600); // 600초
        response.addCookie(cookie);
    }

    private void redirect(HttpServletResponse response) throws IOException {
        response.setStatus(HttpServletResponse.SC_FOUND);
        response.sendRedirect("/basic/hello-form.html");
    }
}
  • HTTP 응답 데이터 - 단순 텍스트
    PrintWriter writer = response.getWriter();
    writer.println("ok ");
    
  • HTTP 응답 데이터 - HTML
      @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 응답 데이터 - JSON
      private ObjectMapper objectMapper = new ObjectMapper();
    
      @Override
      protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //Content-Type: application/json
          response.setContentType("application/json");
          response.setCharacterEncoding("utf-8");
    
          HelloData helloData = new HelloData();
          helloData.setUsername("changmin");
          helloData.setAge(25);
    
          //{"usernmae":"changmin","age":20} 으로 변환
          String result = objectMapper.writeValueAsString(helloData);
          response.getWriter().write(result);
    
      }
    

출처 - 김영한의 스프링 MVC 1편

Leave a comment