서블릿 생성과 HttpServletRequest 정리

스프링 MVC 1편 강의 정리

Servlet 생성

  • @ServletComponentScan : 어노테이션이 적용된 패키지와 하위 패키지에서 서블릿을 찾아서 등록해주는 어노테이션
@ServletComponentScan
@SpringBootApplication
public class ServletApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServletApplication.class, args);
    }

}
  • @WebServlet : 서블릿을 선언할 때 사용하는 어노테이션
    • 이름과 urlPatterns를 정의할 수 있음
    • 정의된 urlPatterns에 해당하는 요청을 받게 됨
    • 이름과 URL 매핑은 중복되어선 안됨
    • 요청이 올 때, 상속받은 HttpServlet의 service 메서드가 실행됨
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;

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);
    }
}
  • 위의 HttpServletRequest, HttpServletResponse를 출력하면 각각 org.apache.catalina.connector.RequestFacade, org.apache.catalina.connector.ResponseFacade를 확인할 수 있음
  • 인터페이스인 HttpServletRequest와 HttpServletResponse를 구현한 WAS의 구현체

Logging

application.properties에 아래 설정을 추가하면 요청값에 대한 상세한 로그를 볼 수 있다.

운영환경에서는 성능 문제가 있을 수 있으므로 개발 환경에서만 사용하도록 한다.

logging.level.org.apache.coyote.http11=debug

HttpServletRequest

  • 서블릿은 HTTP 요청 메시지를 파싱해서 그 결과를 HttpServletRequest 객체로 제공
  • HTTP 요청 메시지

    POST /save HTTP/1.1
    Host: localhost:8080
    Content-Type: application/x-www-form-urnencoded
      
    username=kim&age=20
    
    • Start line
      • HTTP 메소드, URL, 쿼리 스트링, 스키마, 프로토콜
    • Header
    • Body
      • form 파라미터 형식 조회
      • 메세지 바디 데이터 직접 조회
  • 해당 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능 제공
    • 저장: request.setAttribute(name, value)
    • 조회: request.getAttribute(name)
  • 세션 관리 기능
    • request.getSession(create: true);

기본 사용

  • HttpServletRequest 제공 정보
    • 기본 요청 정보
      • getMethod()
      • getProtocol()
      • getScheme()
      • getRequestURL()
      • getRequestURI()
      • getQueryString()
      • isSecure()
    • 헤더 정보
      • request.getHeaderName()
      • request.getHeader(name)
    • 호스트, 포트 정보
      • request.getServerName()
      • request.getServerPort()
    • 언어 정보
      • request.getLocales()
      • request.getLocale()
    • 쿠키 정보
      • request.getCookies()
      • cookie.getName()
      • cookie.getValue()
    • 내용 정보
      • request.getContentType()
      • request.getContentLength()
      • request.getCharacterEncoding()
    • remote 정보
      • request.getRemoteHost()
      • request.getRemoteAddr()
      • request.getRemotePort()
    • local 정보
      • request.getLocalName()
      • request.getLocalAddr()
      • request.getLocalPort()