1. 서블릿과 컨트롤러의 비교
우선 애노테이션을 보면 서블릿은 @WebServlet (=@Controller + @RequestMapping), 컨트롤러는 @Controller를 사용한다.
서블릿은 HttpServlet 클래스를 상속 받아야 하며, 클래스에 매핑해서 클래스의 수가 많아지는 단점이 있다. 컨트롤러는 서블릿이 조금 더 발전된 형태라고 볼 수 있다.
2. 서블릿의 생명주기
서블릿은 기본적으로 세 개의 메서드가 있다. 아래의 메서드들은 서블릿 컨테이너에 의해 자동 호출된다.
- init() : 서블릿이 생성될 때 서블릿 초기화를 위해서 쓰임
- service() : 실제 작업을 처리
- destroy() : 메모리 상에서 제거될 때 수행됨
서블릿은 싱글톤이다. 따라서 1개의 인스턴스만 만들어진다. 요청이 왔을 때 서블릿 인스턴스가 존재하면 새로 만드는 게 아니라 해당 인스턴스를 사용한다.
3. JSP(Java Server Pages)란?
JSP는 HTML안에 자바 코드가 있는 것으로, 서블릿이라고 보면 된다. JSP로 작성하면이 JSP가 자동으로 서블릿으로 변환이 된다.
예를 들어 아래와 같이 twoDice.jsp 파일이 있을 때 오른쪽의 서블릿처럼 변환된다. <%! %> 태그 안의 내용은 클래스 내용으로, <% %> 태그 안의 내용은 service 메서드 안으로 들어간다.
4. JSP의 호출 과정
JSP파일이 언제 서블릿으로 변환되는지 알아보자.
*.jsp 로 요청이 들어오면 JspServlet이 받아서 서블릿 인스턴스 존재 여부를 확인한다. 만약 없다면 해당 jsp파일을 서블릿으로 변환하고(ex. twoDice.jsp -> twoDice_jsp.java) 컴파일해서 class파일 생성 후 인스턴스를 생성한다.(_jspinit() 메서드 실행됨 <- 서블릿의 init() 메서드와 같음) 그런 후 _jspService() 메서드를 실행한다. (서블릿의 service() 메서드와 같음)
만약 서블릿 인스턴스가 존재한다면 바로 _jspService() 메서드를 실행한다.
즉 첫 번째 호출에는 jsp 파일을 서블릿으로 변환하는 과정이 있으므로 시간 지연이 있다.
두 번째 호출 부터는 객체가 존재하므로 훨씬 빠르게 실행된다.
그리고 jsp 파일이 변경되면 다시 서블릿으로 변환하는 과정을 거친다.
서블릿과 스프링, 둘 다 싱글톤으로 되어있으나 초기화에 있어서 차이가 있다.
서블릿은 lazy-init(), 즉 요청이 올 떄 객체를 만드므로 늦은 초기화이지만, 스프링은 이를 개선해서 요청이 오지 않아도 객체를 만들어놓고 출력하는 early-init() 이다. (서블릿도 스프링처럼 미리 초기화 해놓는 방법이 있다)
5. JSP와 서블릿으로 변환된 JSP의 비교
6. JSP의 기본 객체
기본 객체란 생성 없이 사용할 수 있는 객체를 의미한다.
아래 사진에서처럼 request의 선언부가 없는데도 사용하고 있음을 확인할 수 있다. <% %> 태그의 내용은 service() 안으로 들어간다고 했는데, 기본 객체들은 오른쪽 사진처럼 service()의 lv로 선언되어 있다.
기본 객체로는 request, response, pageContext, session, application, config, out, page 등이 있다.
기본 객체 | 타입 | 설명 |
request | javax.servlet.http.HttpServletRequest | 요청 정보가 담겨있는 객체 |
response | javax.servlet.http.HttpServletResponse | 요청에 응답을 작성할 때 사용 |
session | javax.servlet.http.HttpSession | HTTP session을 구현할 객체. 세션 정보 저장에 사용 |
aapplication | 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 | 예외가 발생했을 때 생성되는 예외 객체 |
참조
https://fastcampus.co.kr/dev_academy_nks
'3. Back-end > 3-2. Spring MVC - 남궁성' 카테고리의 다른 글
Spring MVC - [ URL패턴 / EL표현식 ] (0) | 2022.11.07 |
---|---|
Spring MVC - [ 유효 범위(Scope)와 속성(attribute) ] (0) | 2022.11.04 |
Spring MVC - [ 바이너리 파일 ] (0) | 2022.10.18 |
Spring MVC - [ HTTP 요청과 응답 - 이론] (0) | 2022.10.14 |
Spring MVC - [ 클라이언트와 서버 ] (0) | 2022.10.07 |