1. 서블릿과 컨트롤러(스프링)의 비교

- 서블릿에서는 @WebServlet("url")을 사용하여 URL을 매핑한다( 스프링에서는 @Controller + @ RequestMapping)
- 스프링에서는 URL 매핑을 메서드 단위로 하기 때문에 한 클래스 안에 여러 URL 매핑을 할 수 있다는 장점을 가진다.
- 서블릿에서는 @Webservlet을 매핑하는 클래스는 HttpServlet을 상속받아야 한다.
- 자바는 단일 상속이므로 가능한 상속을 받지 않는 것이 유리하다 → 스프링에서는 @Controller 사용으로 개선
- 서블릿에서 service 메서드는 항상 고정이다. 매개변수로 request와 response 또한 고정이다.
- 스프링에서는 메서드에서 필요한 매개 변수만 적어줄 수 있다.
2. 서블릿의 생명주기

서블릿의 생명주기를 순서대로 살펴보자
1. 요청이 들어오면 Servlet Context에서 서블릿 인스턴스가 존재하는지 확인한다.
2. 존재 한다면 service() 메서드를 호출. 서블릿 인스턴스가 존재하지 않다면 서블릿 클래스 로딩 후 인스턴스 생성
3. 생성 후 init() 메서드 호출하여 초기화
4. service() 메서드 호출하여 응답을 하게 된다.
5. 프로그램이 변경되거나 웹 애플리케이션이 종료돼서 서블릿이 메모리에서 내려갈 때 destroy()가 호출 된다.
서블릿은 위와 같인 생명주기를 가지는데 최초 요청의 경우 인스턴스가 생성되지 않았기 때문에 init() 메서드가 호출이 되고, 그 이후의 요청부터는 이미 서블릿 인스턴스가 생성이 되었기 때문에 service()만 호출하게 된다.
그리고 기본적으로 서블릿은 싱글톤으로 되어있다.
즉 한 개의 인스턴스만 존재한다는 의미로 인스턴스가 존재하면 기존의 인스턴스를 사용하고, 인스턴스가 없다면 인스턴스를 만들어서 사용한다.
이렇게 사용하는 이유는 요청하는 사람마다 처리되어야 하는 작업이 똑같으므로 사용자마다 서블릿이 여러 개 있을 필요가 없다.
이러한 싱글톤 패턴을 활용하여 요청이 올 때마다 한 개의 인스턴스를 재활용하여 메모리를 아낄 수 있다.
참고 사항으로 Servlet Context안에는 children이라는 멤버가 있다.
children은 map의 형태를 하고 있는데 Key에는 서블릿 이름을 저장하고 Value에는 서블릿이 등록이 되어있다.
요청이 왔을 때 서블릿 객체가 존재하는지 안 하는지 유무를 판단하기 위해 children을 살펴보고 판단한다.
3. JSP(Java Server Pages)란?

jsp의 특징은 다음과 같다.
- HTML안에 Java코드가 있는 형태이다.
- 서블릿과 똑같다
- jsp로 작성하면 서블릿으로 변환이 된다.
- 스크립틀릿: <% %>으로 표기. 자바 코드를 넣는다. 서블릿으로 변환될 때 serviece() 함수의 지역변수로 삽입된다.
- 표현식(expression): <%= %>으로 표기. 값을 출력할 때 사용
- 선언: <%! %>으로 표기. 변수와 메서드의 선언. 서블릿으로 변활 될 때 클래스 영역으로 삽입된다.( iv 및 cv )
4. JSP의 호출 과정
JPS파일은 어느 시점에 서블릿으로 변환이 될 까?
아래의 그림을 통해 과정을 살펴보자.

1. 확장자가 *.jsp인 요청이 오면 JspServlet이 요청을 받는다.
2. JspServlet은 서블릿이 존재하는지 확인을 한다.
3. 없을 경우 요청된 jsp를 서블릿으로 변환한다. / jsp이름_jsp.java로 변환
4. 변환된 java파일을 컴파일하여 class파일 생성 / jsp이름_jsp.class
5. 이후 인스턴스 생성이 되고 _jspInit() 메서드가 실행되어 초기화 작업을 한다.
6. 서블릿 객체가 만들어지고 _jspService() 메서드가 호출되어 응답한다.
위의 내용을 과정을 살펴보면 JSP가 서블릿과 동일하다는 것을 확인할 수 있다.
추가적으로 살펴볼 사항은 두 번째 요청부터는 변환과 컴파일을 거치지 않고 바로 _jspService메서드가 호출된다는 점과
JSP파일이 변경되면 다시 위의 과정을 거치게 된다는 점이다.
서블릿은 기본적으로 늦은 초기화를 사용한다. 즉 미리 객체를 만들어 놓는 것이 아닌 요청이 올 때 객체를 만들고 초기화를 한다.
스프링은 서블릿과 달리 이른 초기화를 사용하여 미리 객체를 만들어 놓는다.
5. JSP 기본 객체
기본 객체란 생성 없이 사용할 수 있는 객체를 의미한다.
JSP에서 기본 객체를 인스턴스화 하지 않고도 사용 가능한 이유는 JSP파일이 서블릿으로 변환이 될 때 서블릿 즉
jsp이름_jsp.java파일에서 기본 객체를 선언하고 초기화를 하기 때문에 JSP파일에서 사용이 가능하도록 한 것이다.
JSP의 기본 객체의 종류는 아래의 표와 같다.
| 기본 객체 | 타입 | 설명 |
| request | javax.servlet.http.HttpServletRequest | 요청 정보가 담겨있는 객체 |
| response | javax.servlet.http.HttpServletResponse | 요청에 응답을 작성할 때 사용 |
| session | javax.servlet.http.HttpSession | HTTP session을 구현한 객체. 세션 정보 저장에 사용 |
| application | javax.servlet.ServletContext | Web Application 전체에서 공유하는 객체 |
| config | javax.servlet.ServletConfig | JSP 페이지에 대한 설정 정보가 담긴 객체 |
| page | java.lang.Object | JSP 페이지 객체 자신 |
| pageContext | javax.servlet.jsp.PageContext | JSP 페이지의 context정보를 제공 |
| out | javax.servlet.jsp.JspWriter | 응답에 포함될 내용을 출력할 때 사용 |
| exception | java.lang.Throwable | 예외가 발생했을 때 생성되는 예외 객체 |
Reference
'스프링의 정석 : 남궁성과 끝까지 간다' 수강 후 복습한 내용입니다.
'Servlet&JSP' 카테고리의 다른 글
| 서블릿 URL 패턴 (0) | 2022.09.03 |
|---|---|
| 서블릿 기본객체 저장소 (0) | 2022.09.03 |
| EL표기법 (0) | 2022.08.31 |