-서블릿의 라이프 사이클을 관리하고 서블릿을 실행하는 서블릿 컨테이너를 알아본다.
-서블릿 컨테이너에서 사용되는 서블릿에 대해 알아본다.
-스프링 MVC 핵심 기술인 스프링 컨테이너에 대해 알아본다.
서블릿 컨테이너와 스프링 컨테이너는 웹개발자라면 기본적으로 어느정도는 다 알고 있을 것이다. 나도 딱 '어느정도'만 알고 있고, 공부를 할 때는 깊게 배운 것 같았는데 또 실무 프로젝트를 하고 오랜기간 생각을 안하면 기억이 흐려진다. 웹개발자이기 떄문에 언제나 쉽게 서블릿, 서블릿 컨테이너, 스프링 컨테이너 등에 대해 설명할 수 있을 정도가 되어야 된다고 생각하여 포스팅한다.
*틀린 개념이 있을 수 있습니다. 지적 부탁드립니다.
서블릿(Servlet)이란?
서블릿은 웹 프로그래밍을 위한 자바 기술이다.
- Servlet 클래스 구현 규칙을 지켜야 한다.
- HTTP Request를 처리하고 Response할 수 있는 기술이다.
- 정적인 웹사이트를 동적인 웹사이트로 바꿀 수 있게 도와준다.
일단 더도 말고 덜도 말고 이정도 개념은 그냥 바로 튀어나오게 숙지하는 게 좋다고 생각한다.
서블릿 컨테이너(Servlet Container)란?
서블릿을 관리하는 역할을 한다. 여기서 관리란 서블릿을 실행, 생성, 소멸 등의 관리를 말한다. 보통 자바 프로그램은 main() 메소드를 호출하여 자체적으로 프로그램을 실행했다. 하지만 서블릿은 스스로 실행할 수 없다. 서블릿 컨테이너가 실행해줘야 한다. 서블릿은 Request를 처리한다고 했는데 즉 Request를 처리하기 위한 서블릿을 실행하고 관리하는 것이 서블릿 컨테이너라고 할 수 있다. 또한 이렇게 실행(제어, Control)이 서블릿 컨테이너에게 넘어간 것(역전, Inversion)을 제어의 역전(IoC, Inversion of Control)이라고 한다. 토비의 스프링 같은 책에서 수도 없이 나오는 그 개념이다. 스프링 컨테이너를 설명할 때 나오는데 그 IoC 개념이 서블릿 컨테이너부터 쓰인 것이다.
서블릿 컨테이너 특징
- 서블릿 생명주기(Life Cycle) 관리
- 서블릿 클래스 로딩하여 인스턴스화
- 초기화 메소드 호출
- 요청 들어오면 적절한 서블릿 메소드 호출
- 서블릿 소멸시 GC(가비지 컬렉션) 실행
- 웹서버와의 통신 지원
- 웹서버와 서블릿이 쉽게 통신할 수 있게 해주어 소켓을 만들고 listen, accept 등을 API로 제공하여 복잡한 과정 생략
- 멀티스레드 지원 및 관리
- 서블릿 컨테이너는 요청이 올 때마다 새로운 자바 쓰레드 생성
- Http Service() 실행 후 쓰레드 자동 소멸
- 이로 인한 쓰레드 안정성
서블릿 컨테이너의 구조와 동작 과정
- 클라이언트(사용자)가 Http Request를 요청한다.
- Servlet Container(Tomcat 등)가 요청을 받으면, 컨테이너는 web.xml(배포서술자)를 참조하여 해당 서블릿에 대한 쓰레드를 생성하고 HttpServletRequest, HttpServletResponse 객체를 생성하여 전달한다.(web.xml에는 서블릿 매핑 등에 대한 정의가 되어 있다. 그림에서는 HelloServlet)
- 컨테이너가 서블릿의 service() 메소드를 호출하여 http요청을 처리한다.(POST, GET 여부에 따라 doGet(), doPost() 호출)
- doGet(), doPost()가 동적 페이지 생성 후 HttpServletResponse 객체에 응답을 보낸다.
- 응답 완료 후 HttpServletRequest, HttpServletRespone 객체를 소멸시킨다.
스프링 컨테이너란?
스프링 컨테이너는 스프링 빈을 생성, 관리하는 컨테이너이다. 서블릿 컨테이너처럼 IoC개념이 적용되어 객체를 컨테이너가 관리한다. 이렇게 컨테이너가 관리하는 스프링 객체를 빈이라고 한다. 스프링 MVC에서는 Dispatch Servlet이라는 서블릿의과 스프링 컨테이너 등을 사용하여 웹 요청을 효율적으로 처리하고 관리한다.
또한 런타임시에 빈들의 관계 설정을 해주는 것을 DI(Dependency Injection)라고 하는데, 스프링 컨테이너는 DI를 해주는 DI 컨테이너라고도 한다.
그 관계성은 다음 그림과 설명에서 잘 표현이 된다.
스프링 컨테이너의 구조 및 동작 과정
- 웹 어플리케이션이 실행되면 서블릿 컨테이너(톰캣 등)에 의해 web.xml이 로드된다.
- web.xml에 등록되어 있는 ContextLoaderListener가 생성된다. (ContextLoaderListener는 ServletContextListener 인터페이스를 구현하고 있으며, ApplicationContext를 생성하는 역할을 수행)
- root-context.xml(applicationContext.xml)을 로드한다.
- root-context.xml에 등록되어 있는 Spring Contatiner가 구동된다(그림 가장 오른쪽). 이 때 SERVICE, DAO, VO 등 객체들이 생성된다.
- Request가 들어온다.
- Dispatcher Servlet이 생성된다. FrontController 역할을 한다. 알맞은 PageController에 요청을 전달하고 응답을 받아 어떻게 할 지를 결정한다. )기존에는 web.xml에 모든 요청과 서블릿 매핑을 해줬는데 Dispatcher Servlet 덕분에 매핑을 손쉽게 처리한다)
- Dispatcher Servlet이 servlet-context.xml을 로드한다.
- 두번째 Spring Container(사진 중간)가 구동되며 응답에 알맞는 PageController들이 동작한다.
출처 : https://asfirstalways.tistory.com/m/334, https://wan-blog.tistory.com/16, https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-%EB%9E%80
'개발자 일지 > Spring' 카테고리의 다른 글
[자바, 스프링]인프런 김영한 로드맵1, 스프링 입문 강의 정리4 (0) | 2022.01.10 |
---|---|
[자바, 스프링]인프런 김영한 로드맵1, 스프링 입문 강의 정리3 (0) | 2022.01.01 |
[자바, 스프링]인프런 김영한 로드맵1, 스프링 입문 강의 정리2 (0) | 2021.12.12 |
[자바, 스프링]인프런 김영한 로드맵1, 스프링 입문 강의 정리1 (0) | 2021.12.06 |
[토비의 스프링 vol.1]4장 예외 (0) | 2021.06.11 |
[토비의 스프링 vol.1]3장 템플릿 (0) | 2021.05.16 |
[토비의 스프링 vol.1]2장 테스트 (0) | 2021.05.12 |
[토비의 스프링 vol.1]1장 오브젝트와 의존관계 (0) | 2021.04.09 |