[Spring Basic] 서블릿과 JSP
클라이언트가 정적 리소스를 요청하는 경우 웹 서버가 바로 처리할 수 있다.
클라이언트가 동적 리소스를 요청하는 경우는 웹 서버만으로 처리하기 힘들다. 웹 서버는 WAS에게 클라이언트의 요청을 넘기고 WAS의 처리 결과를 클라이언트에게 반환한다. (WAS는 웹 서버 역할을 수행할 수 있기도 하다)
WAS가 클라이언트의 동적 리소스 요청을 처리할 때 서블릿이 사용된다.
서블릿이 도입되기 전에는 CGI 방식으로 사용자의 요청을 처리했다.
CGI는 클라이언트의 요청이 들어올 때 마다 새로운 프로세스를 생성하는 방식으로 동작하고, 동시에 많은 요청이 들어오는 경우 프로세스의 생성과 종료에 따른 오버헤드가 너무 크다는 단점이 있다.
이런 단점을 극복하기 위해 서블릿이 도입됐다.
서블릿은 WAS가 한 번 실행되면 메모리에 로드되어있고, 각 요청에 따라 새로운 쓰레드를 생성해 프로세스 단위로 요청을 처리하는 것 보다 훨씬 효과적이다.
CGI와 서블릿 모두 클라이언트의 동적 리소스 요청을 처리하기 위해 도입된 기술이고, CGI의 단점을 보완해서 나온 기술이 서블릿이며 스프링 프레임워크는 서블릿 기술 위에서 작동한다.
Servlet
서블릿의 동작은 init() , service(), destroy() 세 가지로 나눌 수 있다.
클라이언트로부터 요청이 들어올 때 서블릿 인스턴스가 존재하지 않을 때만 서블릿 클래스를 로딩하고 객체를 생성 후 init() 메서드를 통해 초기화를 진행한다.
service()메서드로 입력과 처리 출력을 수행하고, 서블릿의 동작이 끝날 때는 destroy()메서드를 실행시킨다.
요청에 해당하는 서블릿 인스턴스가 존재하는지 확인할 때는 서블릿 컨텍스트 내부의 children을 통해 확인한다.
JSP
JSP는 Java Server Pages의 약자로, JSP로 작성하면 JSP가 Servlet으로 자동으로 변환된다.
JSP는 HTML코드 안에 Java코드가 있다고 생각하면 된다.
서블릿만 사용해서 클라이언트의 동적 리소스 요청을 처리하는 경우는 Java 코드 내부에서 HTML을 작성했다.
String = "<div class="abc"> ... " 이런 방식으로 HTML을 쭉 로드하고 HTTP 응답 메세지의 바디 부분에 메세지를 작성하는 방식이다 -_-
서블릿만으로 클라이언트의 동적 리소스 요청을 처리하는건 너무 번거로워서 JSP가 도입됐고, 이후 MVC 패턴이 도입되면서 서블릿은 Controller 역할을, JSP는 View 역할을 수행하게 됐다.
JSP에서 HTML코드는 Servlet의 Printout으로 변환되고, Java코드는 코드 그대로 변환되고.. 이런 방식으로 변환되는데, 인스턴스 변수와 클래스 변수를 구분하는 장치가 필요하다.
<!% ~ %> 태그 안에 작성된 자바 코드는 Servlet으로 변환될 때 클래스 안으로 들어가고, <% ~ %> 태그 안에 작성된 코드는 Servlet의 Service()메서드로 변환된다.
.jsp의 요청이 들어오면, JspServlet이 받아들이고 서블릿 인스턴스의 존재를 확인 후 해당하는 작업을 수행해 JSP를 Servlet으로 변환한다. (JSP파일이 변경된 경우에도 서블릿 인스턴스가 바뀐것으로 인식한다.)
서블릿에서는 처음 요청한 입장에서는 java파일을 만들고 class파일을 만드는 등 여러 가지 작업을 수행해야 해서 초기화가 늦을 수 밖에 없다. (lazy-init)
이 단점을 극복하기 위해 스프링에서는 요청이 오지 않아도 객체를 미리 만들어 놔 빠르게 초기화 할 수 있도록 한다. (early-init)
JSP를 사용하다 보면 객체를 생성하지 않았는데도 사용할 수 있는 객체들이 있다.
이를 기본 객체라고 하고, request / pageContext / session / application 등이 있다.
쿠키와 세션을 다룰 때 HTTP 프로토콜이 stateless 속성을 가지기에 쿠키와 세션을 통해 클라이언트를 식별한다고 했는데..
세션을 사용하면 편하지만 클라이언트마다 할당되기에 서버에 부담을 줄 수 있고, 특정 상황에 적합하지 않다는 단점이 있다.
웬만하면 세션을 사용하되, 특정 상황에서는 목적에 맞는 저장소를 사용하자.
'Spring > Spring' 카테고리의 다른 글
[Spring Basic] 파라미터의 변환과 검증 (0) | 2022.06.24 |
---|---|
[Spring Basic] DispatcherServlet (0) | 2022.06.23 |
[Spring Basic] 리다이렉트와 포워드 (0) | 2022.05.12 |
[Spring Basic] 서블릿과 출력 (0) | 2022.04.13 |
[Spring Basic] Java Reflection API (0) | 2022.04.13 |
댓글
이 글 공유하기
다른 글
-
[Spring Basic] DispatcherServlet
[Spring Basic] DispatcherServlet
2022.06.23 -
[Spring Basic] 리다이렉트와 포워드
[Spring Basic] 리다이렉트와 포워드
2022.05.12 -
[Spring Basic] 서블릿과 출력
[Spring Basic] 서블릿과 출력
2022.04.13 -
[Spring Basic] Java Reflection API
[Spring Basic] Java Reflection API
2022.04.13