Servlet&JSP

서블릿 & JSP(생명주기)

odong2 2022. 9. 3. 20:12

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

'스프링의 정석 : 남궁성과 끝까지 간다' 수강 후 복습한 내용입니다.