서블릿 컨테이너와 스프링 컨테이너
spring security를 보다 보면 필터들을 볼수 있는데 이를 서블릿 필터라고 한다.
보통 클라이언트의 요청이 서블릿에 도착하기 전이나 서블릿에서 클라이언트로 응답이 나가기 전에 공통적인 작업을 처리하기 위해 존재한다.
예시: 인코딩, 보안 및 인증, XSS 방어 등등
Delegating Filter Proxy
security를 사용할때 delegatingFilterProxy라는 것을 사용하는데 이는 servlet filter에서는 의존성 주입을 받지 못하기 때문에 DI와 IoC(Inversion of Controll)를 담당하는 스프링 컨테이너(Appication Context)에게 위임하여 securityFilterChain을 주입받아 보안 및 인증과 관련된 filter들을 수행하고 다시 Servlet Container으로 돌아와 마저 남은 filter를 처리하는 논리구조를 가지게 된다.
Servlet Container

서블릿 컨테이너는 웹 서버와 직접 통신하며 서블릿의 생명주기를 관리하는 전문 소프트웨어이다.
핵심 역할
- HTTP 통신: 외부의 HTTP 요청을 받고, 그에 대한 응답을 보낸다. TCP/IP 소켓 연결, 요청 파싱 등의 저수준 작업을 대신 처리해준다.
- 서블릿 생명주기 관리: 서블릿 클래스를 찾아 객체로 만들고, 요청이 올 때마다 service 메소드를 호출하며, 더이상 필요 없으면 파괴하는 모든 과정을 관리한다.
- 멀티 스레딩 지원: 스레드 풀을 생성하고 관리한다.
- 웹환경 제공: HttpServletRequest, HttpServletResponse 객체를 생성하여 서블릿에 전달하고, 세션관리, 보안관리 등 웹 애플리케이션에 필요한 기본적인 환경을 제공한다.
Spring Container
스프링 컨테이너(Application Context)는 자바 객체(Bean)의 생성과 소멸, 그리고 객체 간의 의존관계를 관리하는 스프링 프레임워크의 핵심 엔진이다.
핵심 역할
- 객체(Bean) 생명 주기 관리: 개발자가 정의한 일반 자바객체(POJO)를 Bean이라는 단위로 생성하고 관리
- 의존성 주입(DI /IoC): 객체가 다른 객체를 필요로 할 때, 직접 생성하지 않고 스프링 컨테이너가 자동으로 연결 해준다. 이를 통해 객체간 결합도를 낮추어 유연하고 테스트하기 쉬운 코드 만들 수 있다.
- AOP지원: 트랜잭션, 로깅, 보안과 같은 여러 객체에 공통적으로 필요한 부가기능을 분리하여 적용할 수 있게 지원
AOP: Aspect-Oriented Programming의 약자로, 우리말로는 관점 지향 프로그래밍 핵심 비지니스 로직과는 직접적인 관련은 없지만 꼭 필요한 부가기능 시간측정, 모든 DB작업에 트랜잭션 적용 등 AOP가 없으면 모든 코드에 복사 붙여넣기를 해야하는데 AOP를 지원하므로 그럴 필요없이 공통 부가기능을 하나의 모듈로 빼낼 수 있다.
