1. 서블릿과 컨트롤러의 비교
JSP(Java Server Page) ≒ Servlet 이고, 이를 발전시킨 것이 Spring이다. MVC 패턴에서 DispatcherServlet이 Servlet이다. Spring이 Servlet을 이용해서 동작하므로 알아야 한다.
TwoDice Controller를 Servlet으로 바꾼 것이다. 차이점은
(servlet에서 해당되는 내용이다.)
1. main이 아니고 service이다.
2. @WebServlet = @Controller + @RequestMapping 이다. servlet에서는 @WebServlet에 mapping할 URL을 적는다.
3. HttpServlet을 상속받아야 한다. Controller는 상속받지 않는다. 자바는 단일상속(부모 1개만 상속 가능)이기 때문에 상속받지 않는 것이 좋다. 따라서 Controller에서는 이 점이 개선되어서 상속받지 않는다.
Servlet은 annotation을 class에서만 하므로 mapping하기 위해서는 class를 여러개 만들어야 한다. 하지만 Controller는 메서드에 mapping을 하므로 하나의 클래스 안에 새로운 메서드를 만들기만 하면 mapping을 할 수 있는 장점이 있다. serlvet과 Controller는 유사하지만 Controller가 좀 더 발전한 형태이다.
2. 서블릿의 생명주기
servlet은 기본적으로 3개의 메서드를 갖고 있다. init 메서드는 servlet이 생성될 때 한번만 수행되며 servlet을 초기화한다. 실제 작업을 처리하는 메서드가 service이다. destroy는 servlet이 메모리에서 제거될 때 호출되는 메서드이다. 세 개의 메서드는 우리가 호출하지 않고 servlet container가 자동으로 생성해준다.
Servlet은 HttpServlet을 상속받아야 한다.
Source - Override/implement Methods로 자동 오버라이드 한다.
service, destory, init 3개를 오버라이드 한다.
init 메서드는 servlet이 초기화될 때 자동 호출된다. init 메서드는 servlet이 처음 실행될 때만 사용되고, 요청이 오면 service가 반복해서 작업을 처리한다. servlet이 새로 갱신되어서 다시 reload 되거나 webapplication이 종료될 때 destroy 메서드가 실행된다. destroy는 서블릿이 메모리에서 제거될 때 servlet container에 의해서 자동 호출된다.
실행한 후에 반복해서 호출 하면 init 메서드는 1번만 실행되고 service가 반복되어 실행된다.
Hello 서블릿 파일을 수정 할 때 reload되면서 destroy 메서드가 자동으로 실행된다. 기존의 HelloServlet을 메모리에서 내리고 다시 톰캣이 기동된다.
서블릿 객체가 존재하면 service( )를 실행하고, 아니면 서블릿 클래스를 로딩하고 인스턴스를 생성한다. 그리고 초기화 메서드 init( )이 실행된다. 그 다음 service( )호출하고 응답을 한다. 2번째 부터는 서블릿 객체가 존재해서 무조건 yes이다. 따라서 init( )이 실행되지 않고 service( )만 계속해서 실행된다. 새로고침 할 때 console에 service( )가 계속해서 출력된 것과 같다. servlet이 메모리상에서 내려갈 때 destroy( ) 한 번 호출하고 끝난다.
Servlet Context안에는 children이라는 member가 있다. iv이다. map형태로 되어있는데 servlet과 이름이 등록되 있어서 요청이 왔을 때 서블릿 인스턴스가 존재하는지 안하는지 이 map에서 확인한다.
여기서 servlet은 어떻게 돌아갈까? servlet은 기본적으로 Singleton 싱글톤이다. 1개의 인스턴스만 만들어진다. 인스턴스가 있다면 그냥 그거 쓴다. 요청이 올 때마다 서블릿 인스턴스를 만드는 것이 아니라 만들어진 인스턴스를 재활용한다. 이게 singleton이다. TwoDice, YoilTeller만 보더라도 사용자마다 다른 프로그램을 갖고 있을 필요가 없다.
⭐ 서블릿, 스프링이나 하나의 객체를 만들어 요청을 처리한다. 계속해서 다시 만들지 않는다.
3. JSP(Java Server Pages)란?
JSP ≒ 서블릿 이다. JSP로 작성하면 자동으로 서블릿으로 변환된다.
twoDice.jsp 페이지가 오른쪽과 같이 변환된다. JSP는 HTML안에 Java 코드가 있다. 자바코드가 들어가기 위해서는 <%~%> 형식으로 들어가야 한다. 값출력은 <%=값%> 형식으로 들어가고 <%=idx%> -> 3으로 치환된다. HTML의 tag는 out.println으로 자동으로 바뀐다.
빨간색 영역이 service 메서드 안으로 들어간다. 노란색 Java 코드 영역은 변수로 들어가고 녹색의 HTML tag는 out.println(" "); 으로 감싸진다.
노란색 영역의 변수는 lv로 메서드에 들어가지만 빨간색 영역에 있는 iv, cv는 메서드안에 들어가지 않고 클래스 영역으로 들어간다. iv, cv를 jsp파일에 선언하기 위해서는 <%!~%> 를 사용해야 한다.
jsp파일은 [src/main/webapp] 경로에 만들면된다.
jsp파일은 따로 mapping할 필요가 없다. 자동으로 mapping이 되며 twoDice.jsp가 자동으로 호출된다.
5. JSP의 호출 과정
*.jsp파일 요청이 들어오면 JspServlet이 무조건 받는다. JspServlet이 서블릿 인스턴스 존재하는지 확인한다. 서블릿 인스턴스가 없다면 twoDice.jsp를 servlet으로 변환한다. 변환하면 twoDice_jsp.java파일이 생성된다. twoDice_jsp.java파일이 servlet 소스 파일이 되고, 컴파일 되어 twoDice_jsp.class파일이 생성된다.
객체를 생성하고 초기화 메서드 _jspInit( )이 호출된다. 이름이 servlet 초기화 메서드 init( )과 다르다. 이름은 다르지만 하는 일은 같다. 서블릿 인스턴스인 _jspService( )가 호출되고 응답한다. 만약 서블릿 인스턴스가 존재하면 바로 _jspService( )가 호출되어서 응답한다.
첫 번째 호출일 때만 jsp파일을 변환해서 컴파일해서 객체를 만든다. 이 때 시간지연이 발생한다. 두 번째 호출부터는 객체가 존재해서 변환과 컴파일이 필요가 없어 응답이 빠르다. jsp 변경되면 변환, 컴파일 과정을 거쳐 시간이 걸린다.
servlet은 lazy-init 늦은 초기화 spring은 early-init으로 빠른 초기화 이다. 둘다 singleton으로 객체를 재사용 하지만 초기화는 차이가 있다. 서블릿은 늦은 초기화로 요청이 와야 객체를 생성한다. 스프링은 개선해서 요청이 오지 않아도 미리 객체를 만들어서 초기화한다.
6. JSP와 서블릿으로 변환된 JSP의 비교
twoDice.jsp가 twoDice_jps.java(servlet파일)로 변환된다. 클래스의 이름도 twoDice_jsp이다.
7. JSP의 기본 객체
JSP의 기본 객체가 있다. 생성 없이 사용할 수 있는 객체이다. requset는 선언부가 없어도 사용가능하다.
주황색으로 네모친 것들이 선언부가 없이도 사용할 수 있는 기본 객체이고 _jspService의 lv이다. jsp파일과 servlet 파일이 전혀 다르게 보이지만 변환되어서 들어갈 것이기 때문에 같다. _jspService 메서드의 지역변수로 선언이 되어있기 때문에 jsp에서 선언부가 없이도 사용가능하다.
service( )의 지역변수lv로 선언되어 있는 객체이다.
'스프링의 정석 > Ch. 02 Spring MVC' 카테고리의 다른 글
15. 서블릿과 JSP (3) (0) | 2023.07.15 |
---|---|
14. 서블릿과 JSP (2) (0) | 2023.07.10 |
12. 관심사의 분리와 MVC패턴 - 원리(2) -> 다시 듣기 (0) | 2023.07.07 |
11. 관심사의 분리와 MVC패턴 - 원리(1) (0) | 2023.07.06 |
ch2_10. 관심사의 분리와 MVC패턴 - 실습(2) (0) | 2023.07.05 |