→ 클라이언트(브라우저)에서 HTTP Request를 요청하면, 웹 서버(정적)와 WAS(동적)를 통해 요청을 처리하고, HTTP Response를 반환
→ 스프링 부트는 내장 톰캣을 통해 해당 요청들을 처리
-
하드웨어: 웹 서버의 소프트웨어(아파치, Nginx…)와 구성요소 파일을 저장하는 컴퓨터
-
소프트웨어: HTTP 서버를 의미 → URL(웹 주소) 및 HTTP(프로토콜 주소)를 이해하는 소프트웨어
⇒ 도메인 이름, 퍼블릭 IP 등을 통해 액세스 할 수 있으며, 호스팅 된 웹 사이트의 컨텐츠를 클라이언트의 요청에 따라 반환하는 역할을 수행
⇒ 올바른 웹 서버(하드웨어-컴퓨터)에 요청이 도달하면, HTTP서버(소프트웨어-Nginx, Apache)가 요청을 수락하고, 요청된 문서 혹은 파일을 찾아 HTTP를 통해 브라우저로 전송
⇒ 이때, HTTP Status를 통해 요청 처리의 결과를 확인할 수 있다!
⇒ 즉, 아파치서버, Nginx 서버는 클라이언트의 HTTP 요청을 처리하는 웹 서버이며, 정적 데이터만을 처리하기 때문에 동적인 역할(DB 연결, 다른 응용프로그램과 상호작용)을 하기 위한 WAS(Web Application Server)가 필요
→ Spring Boot는 내장 톰캣(WAS)를 사용한다
WAS(Web Application Server)
→ 대표적으로 Apache의 Tomcat이 있으며, JBOSS / SAS / Jeus .. 등등
- 컨테이너 / 웹 컨테이너 / 서블릿 컨테이너라고도 부르는 WAS
<aside>
💡 컨테이너(Container)
→ 동적인 데이터들을 가공하여 정적인 파일로 만들어주는 모듈
서블릿(Servlet)
→ 클라이언트의 요청을 받고, 요청을 처리하여, 결과를 클라이언트에게 제공하는 자바 인터페이스
서블릿 컨테이너(Servlet Container)
→ 서블릿들을 모아 관리하며, 새로운 요청이 들어올 때마다 새로운 쓰레드 생성
+ 작업이 끝난 쓰레드는 자동 제거
→ 서버 사이드에서 서블릿을 활용하여 동적으로 웹 페이지를 생성하기 위한 개념
→ 서블릿과 웹 서버 간의 통신 담당 + 서블릿 생성-실행-소멸 등의 생명주기 관리
WAS(Web Application Server)
→ DB 연결 및 조회 + 로직 처리 등 동적 타입을 제공하는 소프트웨어 프레임워크
<톰캣의 요청 처리 과정>
클라이언트 요청 → 웹 서버로 전달 → 서블릿 컨테이너로 요청 전달 → 요청을 처리할 서블릿 탐색 → 서블릿의 요청 처리 → 클라이언트로 요청에 대한 응답 반환
<스프링 컨테이너 동작 과정>
- 웹 애플리케이션 실행 → Tomcat(WAS)에 의해 web.xml 로딩
- web.xml에 등록된 ContextLoaderListener(Java Class) 생성
→ ContextLoaderListener는 ServletContextListener 인터페이스의 구현체이며, ApplicationContext를 생성하는 역할 수행
- 생성된 ContextLoaderListener는 applicationContext.xml 로딩
- applicationContext.xml 에 등록된 설정에 따라 Spring Container 구동 시작
→ 이때, Entity, Service, Controller 등등 객체 생성
- 클라이언트의 HTTP Request 요청 발생
- DispatcherServlet 생성 → DispatcherServlet 은 FrontController의 역할 수행
→ FrontController - 클라이언트의 요청을 분석하여 알맞은 PageController에 전달한 뒤, 요청에 대한 응답을 받는다 (HandlerMapping / ViewResolver 클래스)
- PageController에 따라 Model(비즈니스 로직 처리)과 협업하여, DB 조회 및 데이터 가공을 한 후, 데이터를 View로 전송하여 HTML 파일 혹은 요청에 맞는 정보(RestController)를 전달
⇒ 클라이언트(브라우저)의 HTTP 요청은 서블릿 컨테이너에 의해 해석되고, 재조합되어 프로그래머가 작성한 Servlet으로 전달되는 과정을 거친다.
<정리>
- 웹 애플리케이션 배포:
- 웹 애플리케이션이 서블릿 컨테이너에 배포됩니다.
- 배포된 웹 애플리케이션은 서블릿 컨테이너에 의해 시작됩니다.
- 서블릿 컨테이너 초기화:
- 서블릿 컨테이너는 웹 애플리케이션의 초기화를 수행합니다.
- 이때 웹 애플리케이션의 구성 요소들을 로드하고 초기화합니다.
- ContextLoaderListener 실행:
- web.xml에 등록된 ContextLoaderListener가 생성됩니다.
- ContextLoaderListener는 ApplicationContext를 생성하고 초기화하는 역할을 수행합니다.
- 첫 번째 Spring Container 구동:
- ContextLoaderListener가 applicationContext.xml을 로딩하여 첫 번째 Spring Container를 구동합니다.
- applicationContext.xml에 등록된 빈들(예: DAO, Service)이 생성되고 초기화됩니다.
- DispatcherServlet 생성:
- 클라이언트로부터의 HTTP 요청을 처리할 DispatcherServlet이 생성됩니다.
- DispatcherServlet은 웹 애플리케이션의 Front Controller 역할을 수행합니다.
- 두 번째 Spring Container 구동:
- DispatcherServlet이 servlet-context.xml을 로딩하여 두 번째 Spring Container를 구동합니다.
- servlet-context.xml에 등록된 빈들(예: Controller, Handler)이 생성되고 초기화됩니다.
- 클라이언트 요청 처리:
- 클라이언트로부터의 HTTP 요청이 DispatcherServlet에 도착합니다.
- DispatcherServlet은 요청을 처리할 알맞은 컨트롤러(Controller)나 핸들러(Handler)를 찾아 호출합니다.
- 첫 번째 Spring Container와 두 번째 Spring Container 협업:
- 요청 처리 과정에서, 두 번째 Spring Container가 첫 번째 Spring Container에서 생성된 빈들을 참조하여 작업을 수행할 수 있습니다.
</aside>