현재의 Spring 강의 중 Container안에 Bean이 생성되고.. Container에서 생성된 Bean을 가져오고.. 등등의 이야기를 들으며 문득 Container와 Annotation이 Spring에 있어서 굉장히 중요한 부분인 것 같아서 상세한 내용이 궁금해졌다. 그렇게 검색을 하던 중 ServletContainer와 SpringContainer는 무엇이 다른가? 라는 Sigrid Jin님의 포스팅을 읽고 아 나는 토끼가 뭔지도 제대로 모르면서 토끼를 잡겠다고 했구나 생각이 들었다. Spring Container가 뭔지 Servlet Container와 무슨 차이가 있는지를 알기 위해서 그 전 단계인 Servlet을 더 명확하게 알아야겠다는 생각이 들었다.
과거에는 서버에서 미리 만들어진 자료(정적 자료 - 주로 HTML문서)를 저장하고 있다가 클라이언트가 자료를 요청하면 반환하는 구조였다. 하지만 인터넷 사용자가 증가하며 다양한 기능을 웹을 통해 구현하고자 하며 사용자 요구에 맞춰 동적으로 반응하는 페이지를 만들 필요성에 의해 탄생하게 된것이 Servlet이다.
Servlet을 쉽게 말하면 자바를 사용하여 웹을 만들기 위한 어플리케이션이다.
이전에는 Web Server까지만 존재하여 저장된 페이지를 반환하기만 했지만 현재는 그림과 같이 WAS를 통해 사용자의 Request 중 연산이 필요한 것만 Servlet Container로 전송해 처리하고 다시 Response한다. 여기서 말하는 연산이란 HTML로만 이뤄진 정적 리소스에 JAVA 기술을 더하여 동적으로 만들어 주는 것을 말한다.
하지만 중요한 JSP와의 차이점은 JAVA 코드 안에 HTML코드를 일일이 기입해서 작성한다는 것이다. HTML코드 안에 JAVA코드를 작성하는 JSP와는 반대라고 할 수 있다.
설명에 들어가기 전 또 다시 위의 그림을 보면 WAS 안 Web Server에서 Servlet Container로 Request선과 Response 선이 이어진 것을 알 수 있다. Servlet에서는 사용자의 요청을 이 Servlet Container에서 처리한다.
Servlet Container의 정의는 다음과 같다
Servlet의 Life Cycle에서 Servlet 클래스가 클래스 로더에 의해 Container에서 동적으로 로드 되는 것을 볼 수 있다. Container에서는 사용자로부터 요청 받을 때마다 요청을 처리할 스레드를 생성하고 Container 내부의 Thread Pool에 저장하여 필요할 때 꺼내어 사용한다. 그로 인하여 Servlet 객체는 동시에 여러 개의 스레드를 제공할 수 있다.(Thread not safe) 하지만 더이상 사용되지 않을 때에는 JVM에 의해서 가비지 컬렉팅 되어야 한다.
(1) 요청이 오면 Servlet 클래스가 로딩되어 요청에 대한 Servlet 객체가 생성된다.
(2) 서버는 init() 메소드를 호출해서 Servlet을 초기화 한다.
(3) service() 메소드를 호출해서 Servlet이 브라우저의 요청을 처리하도록 한다.
(4) service() 메소드는 특정 HTTP 요청(GET, POST 등)을 처리하는 메소드(doGet(), doPost()등)를 호출한다.
(5) 서버는 destroy() 메소드를 호출하여 Servlet을 제거한다.
init() - 해당 메소드는 Servlet Life Cycle 중 초기화 단계에서 한 번 호출된다. javax.servlet.ServletConfig 인터페이스를 구현하는 오브젝트가 전달되고 이를 통해 웹 어플리케이션에서 초기화 매개변수(parameter)에 접근할 수 있도록 한다.
service() - 해당 메소드는 초기화 이후 각각의 요청들이 들어오면 호출된다. 각각의 요청들은 별도로 나누어진 스레드에서 처리된다. 웹 컨테이너는 모든 요청에 대해 Servlet의 service() 메소드를 요청하고 service() 메소드는 요청의 종류를 판별하고 적절하게 처리할 메소드로 전달한다.
destroy() - 해당 메소드는 Servlet 객체가 파괴되어야 할 때 호출된다. 해당 Servlet이 가지고 있던 자원(메모리)을 풀어(release)준다.
https://sgcomputer.tistory.com/226 (Servlet 정의)
https://soonggi.tistory.com/61 (Servlet 정의)
https://doozi316.github.io/web/2020/09/13/WEB26/ (Web Container의 정의)
https://scshim.tistory.com/28 (Life Cycle)