서블릿(Servlet)? Java를 사용하여 웹 페이지를 동적으로 생성하기 위한 웹 프로그래밍 기술

 

JSP(Java Server Pages)? HTML 내에 Java 코드를 삽입하여 동적 웹페이지를 생성하는 웹 프로그래밍 도구. JSP 페이지는 클라이언트의 요청이 들어오면 자동으로 서블릿으로 변환

 

 

 

서블릿과 컨트롤러 비교


서블릿은 @WebServlet 어노테이션(@Controller + @RequestMapping)을 사용하고, 컨트롤러는 @Controller 어노테이션을 사용한다. 따라서 서블릿의 경우 URL 맵핑을 클래스 단위로 해줘야 하기 때문에 여러 개의 클래스를 필요로 하고, 컨트롤러의 경우 메서드 단위로 URL 맵핑할 수 있으므로 한 클래스 내 메서드 단위로 작성해주면 된다.

 

그 외에도 서블릿은 HttpServlet을 항상 상속받아야 하고, 컨트롤러는 반드시 상속받을 필요는 없다. 또한 서블릿은 service() 메서드가 고정으로 사용되고, 매개변수 객체로 request와 response가 항상 들어가야 한다. 컨트롤러는 필요한 매개변수 객체만을 사용할 수 있다는 차이가 있다.

 

 

 

서블릿의 생명 주기


1. init() - 서블릿을 초기화하고 서블릿이 생성될 때 한번만 수행

2. service() - 실제 작업을 처리하고 호출될 때마다 반복 수행

3. destory() - 뒷정리 작업을 수행하고 서블릿이 제거되거나 변경될 때 한번만 수행

 

→ 위 메서드들은 servletContainer가 자동으로 호출해주기 때문에 각 메서드의 내용만 작성해주면 된다.

 

서블릿은 singleton(싱글톤)이기 때문에 1개의 인스턴스만이 생성되고, 요청이 올때마다 계속 재활용하는 방식이다. 요청이 들어오면 서블릿 인스턴스 존재 유무에 따라 동작하게 된다. 먼저, 서블릿 인스턴스가 존재하지 않을 때에는 서블릿 클래스를 로딩하여 인스턴스를 생성하고 init() 초기화를 수행한 뒤 service()가 수행된다. 서블릿 인스턴스가 존재할 때에는 service()가 바로 수행된다. 따라서 서블릿 인스턴스 생성 이후에는 반복적인 요청이 수행되고 있다고 가정했을 때, service()만이 지속적으로 호출된다. 마지막으로 종료 혹은 변경되면 destory()가 수행된다.

 

이와 같이 서블릿은 lazy-init(늦은 초기화)이라는 특성을 보이고, 다시 말해 처음 요청 시 인스턴스 생성 과정을 거치기 때문에 초기화 시간이 지연됨을 의미한다.

 

 

 

JSP 변환 및 호출 과정


JSP? Java in HTML

 

1. <% %> : 메서드 영역(지역 변수)

2. <%! %> : 클래스 영역(인스턴스 변수, 클래스 변수)

3. <%= %> : 값 출력

 

※ JSP는 WetServlet으로 맵핑해주지 않아도 자동으로 맵핑된다.

 

 

JSP의 변환 및 호출 과정은 다음과 같다.

 

1. hello.jsp 요청

2. JspServlet이 서블릿 인스턴스 존재 유무를 확인

3 - 1. (존재하지 않는다면) 먼저 hello.jsp를 hello_jsp.java로 변환하고, hello_jsp.java를 hello_jsp.class로 컴파일한다. 이후 서블릿 인스턴스를 생성하여  _jspInit()을 수행하고 _jspService()를 수행하게 된다.

3 - 2. (존재한다면) 서블릿 인스턴스에서 _jspService()를 수행한다.

 

이때, 생성없이 사용할 수 있는 객체들이 있다. request, response, session 등이 이 객체들에 해당한다. 사용할 수 있는 이유는 _jspService() 메서드 내에 지역 변수로 선언이 되어있기 때문이다.

+ Recent posts