서블릿을 등록해서 사용해보신 적 있나요?
안녕하세요.
웹을 만들 때, 보통 서블릿을 직접 등록해서 사용하지는 않습니다.
오늘은 서블릿 클래스를 직접 만들어서 사용해보겠습니다.
스프링 부트 환경에서 서블릿을 등록하고 사용할 것입니다. 스프링 부트는 톰캣 서버가 내장되어 있어서 편리하게 서블릿 코드를 실행할 수 있습니다.
@ServletComponentScan
스프링 부트에서 서블릿을 직접 등록해서 사용하려면 @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 {
System.out.println("HelloServlet.service");
System.out.println("request = " + request);
System.out.println("response = " + response);
String username = request.getParameter("username");
System.out.println("username = " + username);
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello "+username);
}
}
@WebServlet 어노테이션을 달면 WAS는 서블릿인 것을 인지하고, 등록합니다.
서블릿의 name을 지정할 수도 있고, 지정하지 않으면 클래스의 이름이 name이 됩니다.
urlPatterns는 어떤 URL이 들어오면 이 서블릿이 수행될 것인지를 나타냅니다.
여기서 만든 HelloServlet은 /hello가 들어오면 수행될 것입니다.
서블릿 클래스는 HttpServlet을 상속받아서 service 메소드를 오버라이드 합니다.
HTTP 요청을 통해서 매핑된 URL이 호출되면 서블릿 컨테이너가 service 메소드를 수행합니다.
service 메소드에서는 HttpServletRequest 객체와 HttpServletResponse 객체를 사용할 수 있습니다.
위의 코드에서는 request 객체로 파라미터를 받아오고, response 객체로 데이터를 전송하였습니다.
서버를 띄우고 아래 웹 사이트에 들어가 보면 수행되는 것을 확인할 수 있습니다.
http://localhost:8080/hello?username=world
hello world가 잘 출력됩니다.
로그를 확인해봅시다.
HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@632a358c
response = org.apache.catalina.connector.ResponseFacade@2a0b38e
username = world
request, response 객체가 잘 생성되었고, 파라미터가 잘 받아진 것을 확인할 수 있습니다.
서블릿 컨테이너 동작 방식 설명
서블릿은 어떻게 등록되고 사용되는 것일까요?
내장 톰캣 서버 생성
먼저 스프링 부트가 내장 톰캣 서버를 생성합니다.
내장 톰캣 서버가 @WebServlet 어노테이션을 보고 서블릿 객체를 서블릿 컨테이너에 생성합니다.
웹 애플리케이션 서버의 요청 응답 구조
WAS는 웹 브라우저에서 요청이 오면, request, response 객체를 만듭니다.
서블릿은 HTTP 요청 메시지를 파싱해서 request 객체에 담아줍니다.
이 request를 사용해 service 메소드에서 작업을 수행합니다.
다음 글에서는 request를 조회해서 HTTP 요청 메시지 정보를 받는 방법을 알아보겠습니다.
인프런 '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 강의를 듣고 공부하며 정리한 자료입니다.
잘못된 부분은 피드백 주시면 감사하겠습니다.
글 읽어주셔서 감사합니다 :-)
참고자료
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술, 섹션 2. 서블릿 https://www.inflearn.com/course/스프링-mvc-1
'Spring > 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
HttpServletRequest로 HTTP 요청 데이터 조회하기 (0) | 2022.01.18 |
---|---|
HttpServletRequest로 HTTP 요청 메시지 조회하기 (0) | 2022.01.18 |
HTTP API (0) | 2022.01.17 |
[WAS] 동시 요청 - 멀티 스레드 (0) | 2022.01.17 |
WAS와 서블릿 (0) | 2022.01.16 |
댓글