요즘 들어 스프링에 대한 깊은 이해가 없이 스프링 부트를 공부했다는 생각이 들었다.
눈에 보이지 않는것들에 집중하며 스프링 또는 Java EE 로만 프로젝트를 진행해보면서 이해를 한 부분을 정리하려고 한다.
Servlet, Spring, WAS의 동작방식이 헷갈렸고 이참에 확실하게 정리하기 위해 글 작성하였다.
주로 웹 서버나 WAS(Tomcat)에 내장되어 제공
Servlet 인스턴스 생성 관리, HTTP 요청 처리, 스레드 관리, 세션 관리, 보안 인증
→ 서블릿 인스턴스 자체를 생성하는 것이 아닌 요청이 올때마다 해당 서블릿의 스레드를 생성.
서블릿 인스턴스는 싱글톤으로 생성되고, Thread-Safe 하지 않기 때문에, 무상태 혹은 동기화 처리된 구조로 설계 되어야 한다.
웹 서버 실행: 웹 애플리케이션을 구동하기 위해 웹 서버(Tomcat, Jetty 등)가 실행된다.
web.xml 로딩: 웹 서버는 웹 애플리케이션의 설정 파일인 web.xml을 로딩한다.
ContextLoaderListener 생성: web.xml에 등록된 ContextLoaderListener가 생성된다. ContextLoaderListener는 Spring 애플리케이션 컨텍스트를 생성하고 초기화하는 역할을 수행한다.
Root Application Context 생성: ContextLoaderListener는 ApplicationContext.xml(root-context.xml)을 로딩하여 Root Application Context를 생성한다. Root Application Context는 전역적인 설정을 담당하며, 데이터베이스 연결, 서비스 빈 등의 설정을 포함한다. Root Application Context는 여러 개의 서블릿 컨텍스트와 공유될 수 있다.
DispatcherServlet 생성: 웹 애플리케이션의 클라이언트 요청이 발생하면 DispatcherServlet이 생성된다. DispatcherServlet은 클라이언트 요청을 처리하는 주요한 컨트롤러 역할을 수행한다.
Servlet Context 로딩: DispatcherServlet은 Servlet-Context.xml을 로딩한다. Servlet-Context.xml은 해당 서블릿에 대한 설정을 담고 있으며, 컨트롤러 빈 등의 설정을 포함한다.
Web Application Context 생성: Servlet-Context.xml에 등록된 설정을 바탕으로 Web Application Context가 생성된다. Web Application Context는 해당 서블릿에 대한 설정과 관련된 빈들을 관리한다.
컨트롤러 빈 등록: Web Application Context는 Servlet-Context.xml에 정의된 컨트롤러 빈 등을 등록하고, 요청에 따라 해당 빈을 활용하여 클라이언트 요청을 처리한다.
클라이언트 요청 처리: DispatcherServlet은 클라이언트의 요청을 받아 컨트롤러 빈에게 요청을 전달하고, 컨트롤러는 비즈니스 로직을 수행하여 응답을 생성한다.
응답 전송: DispatcherServlet은 컨트롤러가 생성한 응답을 클라이언트에게 전송하고, 웹 애플리케이션의 동작을 마친다.
애플리케이션의 개발과 실행을 담당하는 런타임 환경.
빈(Bean)의 생성, 관리, 의존성 주입 등을 담당하여 개발자가 애플리케이션의 핵심 비즈니스 로직에 집중할 수 있도록 지원
IoC (Inversion of Control) 컨테이너로서 애플리케이션의 객체를 생성하고, 필요한 의존성을 주입하며, 애플리케이션 실행 중에 빈의 상태를 관리한다.
다양한 종류가 있지만 일반적인 형태는 ApplicationContext 이다.
ApplicationContext는 스프링 애플리케이션의 루트 컨테이너로서, 애플리케이션 전반에 걸쳐 사용되는 빈의 라이프사이클 관리와 의존성 주입을 담당한다. 또한, 다양한 기능을 제공하는 스프링의 다른 모듈들과 통합되어 동작한다.