Servlet을 발전시킨것이 Spring이다.
Spring은 Servlet을 이용한다!
가볍게 알아두면 좋은 내용 정리 ✏️
Servlet : @WebServlet
Spring Controller : @Controller
+ @RequestMapping
@WebServlet
은 @Controller
와 @RequestMapping
을 합쳐놓은 것이다.
Servlet은 HttpServlet 클래스를 상속받아야 한다.
클래스 상속은 단 하나만 받을 수 있기 때문에,
Spring Controller에서는 이를 개선하여 상속 없이 @Controller
선언만으로 사용할 수 있게 되었다.
Setvlet은 경로 Mapping을 클래스 선언부에 사용하는 @WebServlet
어노테이션에서만 할 수 있기 때문에,
경로 별로 클래스를 각각 만들어야 한다.
Spring Contoller는 경로 Mapping을
메서드 선언부에 사용하는 @RequestMapping
어노테이션(참고 : @PutMapping @GetMapping 등 Mapping 관련 다양한 어노테이션 제공)으로 할 수 있기 때문에,
극단적으로 표현하면 하나의 클래스 파일에 모든 경로를 지정해 줄 수 있다.
서블릿 구성
init()
서블릿에 대한 요청을 받으면, 서블릿 인스턴스가 있는지 확인 후
인스턴스가 없는 경우에 init()을 통해 서블릿 클래스를 로딩하고, 인스턴스를 생성한다.
인스턴스가 있는 경우에 init()을 거치지 않고 service()를 실행한다.
서블릿도, Spring도 기본적으로 Singleton 패턴이 적용되어 있다.
service()
destroy()
일반적으로 프로그램 종료시 호출 됨
이 메서드는 Servlet Container가 관리하기 때문에,
우리는 각각의 메서드에 내용만 작성하면 된다.
@WebServlet("/main")
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletExeption {
// 서블릿이 생성 또는 리로드 될 때 , 단 한번만 수행 됨
}
@Override
public void service(HttpServletRequest req, HttpServletResponse res) {
// 1. 입력
// 2. 처리
// 3. 출력
}
@Override
public void destroy() {
// 서블릿이 메모리에서 해제될 때 . 단 한번만 수행 됨
}
}
Servlet : Lazy Init
Spring : Early Init
둘 다 싱글톤으로 되어 있어서 하나의 객체를 반복해서 재사용 하지만,
차이점으로는 기본적으로
Servlet은 요청이 왔을때 초기화를 진행하여 지연된 초기화 ( Lazy init )을 하고
Spring은 프로그램 시작 시 초기화를 진행하여 빠른 초기화 ( Eary init )을 한다.
그렇기 때문에
Servlet은 첫 요청시 반응 시간이 소요될 수 있고
Spring은 프로그램 Run 시간을 길게 사용한다.
Servlet도 설정하면 Eary Init을 하게 할 수도 있다고 한다.