josolha
Servlet Container , Spring Container 본문
서론
시작은 Servlet Container와 Spring Container의 역할을 좀 더 명확하게 이해하는게 목적이였다.
하지만 이를 이해하기 위해서는 사전 개념과 지식이 좀 필요했다.
차차 알아보도록 하자.
개념
우선 웹서버의 개념을 이해 해야한다.
웹서버 :
- 웹 서버는 클라이언트(사용자)로부터 들어오는 HTTP 요청을 받고,
요청된 URL에 해당하는 정적 컨텐츠(예: 이미지, HTML 파일, CSS 파일 등)를 찾아서 클라이언트에게 응답으로 제공한다. - Apache Web Server 는 가장 널리 사용되는 웹 서버이며 MS의 IIS가 그 뒤를 따르고 있으며 Nginx도 좋은 서버이다.
아래에서는 사용자가 웹 브라우저를 통해 'example.com/a01.jpg'라는 URL로 이미지 파일을 요청한다.
과정을 말하자면
- 사용자가 웹 브라우저에 URL을 입력하고 요청을 보내면, 웹 서버는 이 요청을 수신한다.
- 파일 검색: 웹 서버는 요청받은 URL에 해당하는 파일을 서버의 디렉토리에서 검색한다.
여기서는 'a01.jpg' 이미지 파일을 찾게 된다. - 응답 전송: 파일이 서버에 존재하면, 웹 서버는 이 파일을 HTTP 응답의 일부로 사용자에게 전송한다.
웹 브라우저는 이 파일을 받아 사용자에게 이미지를 표시한다.
그렇다면, 웹 컨테이너를 알아보자
웹 컨테이너 = 서블릿 컨테이너
- 웹 컨테이너 웹 컨테이너 = 서블릿 컨테이너, JSP/서블릿 API 지원한다.
- 웹 컨테이너는 서블릿의 생명주기를 관리하고, 특정 URL을 특정 서블릿에 매핑하며,
URL 요청자가 올바른 접근 권한을 가지고 있는지 확인하는 역할을 한다. - 웹 컨테이너는 서블릿 인스턴스를 생성하고, 서블릿을 로드 및 언로드하며,
요청 및 응답 객체를 생성하고 관리하며, 기타 서블릿 관리 작업을 수행한다.
웹 컨테이너는 웹 서버와 달리 사용자가 웹 애플리케이션에 특정 데이터(b01.jpg)와 파라미터(?user=moss)를 요청하면,
서블릿 컨테이너는 적절한 서블릿을 찾아 요청을 처리하고, 동적으로 생성된 컨텐츠를 사용자에게 반환한다.
또한 웹 컨테이너 내부에는 서블릿 필터(Servlet Filter)가 위치하여 요청을 필터링한다.
이 필터는 보안 검사, 로깅, 요청 및 응답 객체에 대한 변형 등의 역할을 수행할 수 있고,
필터링된 요청은 서블릿(Servlet)으로 전달되어 비즈니스 로직이나 데이터 처리가 실행된다
서블릿에서의 처리가 완료된 후, 생성된 응답(Response)은 다시 필터를 거쳐 필요한 경우 추가 처리를 한 후 최종적으로 사용자에게 반환된다.
좀 더 자세하게 보면
서블릿 컨테이너의 역할은 아래에 더 있다.
1. 웹서버와의 통신 지원
서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해주어 소켓을 만들고
(톰캣같은 경우가 이 소켓으로 웹서버와 서블릿 컨테이너를 연결해준다)
Listen, Accept 등을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다
2. 서블릿 생명주기 관리
-서블릿 클래스를 로딩하여 인스턴스화
-초기화 메서드를 호출
-요청이 들어오면 적절한 서블릿 메서드를 호출한다
-서블릿 소멸 시 Garbage Collection(가비지 컬렉션)을 진행
2.1 서블릿 생명주기
1 - 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고 없을 경우 init() 메서드를 호출하여 적재한다. init()메서드는 처음 한번만 실행되기 때문에 서블릿의 쓰레드에서 공통적으로 사용해야하는 것이 있다면 오버라이딩하여 구현한다. 실행 중 서블릿이 변경될 경우 기존 서블릿을 파괴하고 init()을 통해 새로운 내용을 다시 메모리에 적재한다
2 - init()이 호출된 후 클라이언트의 요청에 따라서 service()메서드를 통해 요청에 대한 응답이 doGet()가 doPost()로 분기됩니다 이때 서블릿 컨테이너가 클라이언트의 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response 객체가 제공된다
3 - 컨테이너가 서블릿에 종료 요청을 하면 destroy()메서드가 호출되는데 마찬가지로 한번만 실행되며 종료시에 처리해야하는 작업들은 destroy()메서드를 오버라이딩하여 구현하면 된다
3. 멀티쓰레드 지원 및 관리
클라이언트의 요청은 쓰레드에서 처리한다, 그렇기 때문에 서블릿 컨테이너는 요청이 올때 마다
새로운 자바쓰레드를 알아서 생성한다 메서드를 다 실행하고 나면 쓰레드도 자동을 소멸한다
본래 쓰레드를 직접 관리해야 하지만 서버가 다중 쓰레드를 생성 및 운영해주기 때문에 안정성이 높다
4. 선언적인 보안 관리
서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을
서블릿 또는 자바 클래스에 구현해 놓지 않아도 된다
일반적으로 보안관리 XML 배포 서술자에 기록하므로 보안에 대해
수정할 일이 생겨도 자바 소스코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능하다
마지막으로 WAS(Web Application Server)를 알아보자.
WAS :
- 클라이언트 요청을 받아 동적인 컨텐츠를 응답하는 서버이고
대부분의 WAS는 정적인 컨텐츠를 제공해주기 때문에 WAS는 웹서버를 포함하는 개념이다. - WAS는 위에서 말했던 WebServer와 Web Container로 구성된다.
위 이미지는 웹 애플리케이션 서버(WAS)의 구조를 나타내고 있다.
다시 말하자면 "WAS"는 동적인 웹 페이지나 애플리케이션을 서비스하기 위해 필요한 웹 서버와 웹 컨테이너(서블릿 컨테이너)
기능을 통합한 서버를 의미한다.
또한 WAS는 복잡한 비즈니스 로직을 처리하고 다양한 웹 서비스와 데이터베이스를 연결하여,
최종 사용자에게 원활하고 다이나믹한 웹 경험을 제공하기 위해 설계되어있다.
Tomcat은 가장 널리 사용되는 WAS 중 하나로, Apache Software Foundation에서 개발한 오픈 소스 소프트웨어이며,
Tomcat은 웹 서버 기능뿐만 아니라 서블릿과 JSP를 실행할 수 있는 웹 컨테이너 기능도 제공한다.
이를 통해 Tomcat은 HTTP 요청을 받아 처리하고,
필요에 따라 서블릿을 호출하여 비즈니스 로직을 수행한 후 동적인 웹 페이지를 생성하여 응답할 수 있다.
또한, Tomcat은 데이터베이스와의 연동을 통해 웹 애플리케이션에 필요한 데이터를 관리할 수 있다.
따라서 Tomcat은 단독으로 웹 서버로서의 역할을 수행할 수도 있지만,
대규모 운영 환경에서는 종종 Apache HTTP Server와 같은 전용 웹 서버 앞단에 배치되어,
정적인 컨텐츠는 웹 서버가 처리하고, 동적인 컨텐츠는 Tomcat이 처리하는 구성을 사용한다.
이렇게 구성함으로써 성능 최적화 및 보안 강화를 달성할 수 있다.
Servlet Container , Spring Container
최종적으로 Servlet Container , Spring Container 상호작용되는 흐름이다.
- 사용자 요청: 사용자가 웹 애플리케이션에 요청을 보내면, 이 요청은 먼저 서블릿 컨테이너에 도달한다.
- 서블릿 필터: 서블릿 컨테이너 내의 필터들은 요청을 가공하거나, 검증하거나, 로깅 등의 사전 처리를 수행할 수 있다.
필터 처리를 거친 요청은 이후 서블릿에 전달된다. - 서블릿 처리: 필터를 거친 요청은 서블릿 컨테이너에 의해 생성되고 관리되는 HttpServlet 객체로 전달된다.
이 객체는 서블릿 클래스에 정의된 구성에 따라 초기화되며, 이 과정은 init() 메서드 호출을 통해 한 번만 수행된다.
요청이 객체에 도달하면, service() 메서드가 호출되어 HTTP 요청의 유형(GET, POST 등)을 판단하고,
해당 요청 유형을 처리하는 doGet(), doPost() 등의 메서드로 요청을 위임하여 처리한다. - 스프링 MVC 컨테이너
스프링 기반의 웹 애플리케이션에서는 서블릿 컨테이너가 DispatcherServlet을 초기화하고,
모든 요청을 이 스프링의 컨트롤러에 위임한다.
(DispatcherServlet도 HttpServlet을 상속받아서 동일한 방식으로 서블릿 컨테이너에 의해 생성되고 초기화된다.
엄밀히 따지면 DispatcherServlet는 스프링 구성요소이지만 서블릿 API를 기반으로 구축되어 있어 실행은 서블릿 컨테이너 안에서 이루어진다.)
이후 스프링 컨테이너는 아래와 같은 흐름을 가지고 있다.
4.1 DispatcherServlet는 HandlerMapping을 통해 요청을 처리할 적절한 컨트롤러를 찾는다.
4-2 컨트롤러가 결정되면, DispatcherServlet은 HandlerAdapter를 사용하여 컨트롤러의 메서드를 호출한다.
(HandlerAdapter는 컨트롤러와 DispatcherServlet 사이의 중개자 역할을 하며, 컨트롤러의 메서드를 실행하는데 필요한 정보와 객체를 준비한다)
4.3 그 다음 매핑된 컨트롤러의 메서드가 실행되며, 이 메서드는 필요한 비즈니스 로직을 수행하기 위해 Service 계층을 호출할 수 있다.
4.4 Service 계층은 Repository 계층과 상호 작용하여 필요한 데이터를 데이터베이스에서 가져오거나 데이터베이스에 저장한다.
4.5 처리가 완료되면 컨트롤러는 결과 데이터와 뷰의 이름을 ModelAndView 객체에 담아 DispatcherServlet에 반환하게 된다.
4.6 DispatcherServlet은 ViewResolver를 사용하여 반환된 뷰 이름을 기반으로 실제 뷰 객체를 결정하고
ViewResolver는 뷰 이름을 실제 뷰 구현체로 매핑한다.
4.7 결정된 뷰 객체는 모델 데이터를 사용하여 응답을 생성한다.
(이 응답은 HTML 페이지일 수도 있고, JSON, XML 등 다른 형식의 데이터일 수도 있다)
5.응답 반환: 마지막으로 DispatcherServlet으로 반환된 결과를 서블릿 컨테이너를 통해 사용자에게 응답으로 전달된다.
결론
이렇게 서블릿 컨테이너와 스프링 컨테이너가 어떻게 협력하여 웹 요청을 처리하고 웹 애플리케이션의 동적인 기능을 제공하는지를 살펴보았다.
DispatcherServlet은 스프링 MVC 프레임워크 내에서 서블릿 컨테이너와 스프링 컨테이너 사이의 중요한 연결점으로 작동하며,
요청을 적절한 컨트롤러로 라우팅하고 응답을 처리한다. 그리고 스프링 컨테이너는 비즈니스 로직과 데이터 액세스 로직을 관리하는 빈들을 초기화, 구성 및 조정하고, 애플리케이션의 전반적인 작동을 가능하게 했다.
'Spring' 카테고리의 다른 글
Spring MVC에서 Consumes와 Produces (0) | 2023.12.04 |
---|---|
JPA, Hibernate, Spring Data JPA (0) | 2023.12.04 |
Eco-reading 트러블 슈팅(실시간 알림 기능) (1) | 2023.11.27 |
AWS S3 (이미지 다운로드 에러) (1) | 2023.11.20 |
JPA의 @Builder , @Builder.Default (1) | 2023.11.13 |