Singleton Scope
특징
- 스프링 컨테이너당 하나의 인스턴스(빈)만 생성
- 기본 스코프
- 상태를 공유하므로 주의 필요
📌 핵심: 스프링 컨테이너가 관리하는 객체의 "하나뿐인 인스턴스"생성되는 객체들
- ApplicationContext
- Spring Core Containers
- Service Layer Beans
- Repository Layer Beans
- Configuration Beans
- Spring Security Configurations
Application Scope
특징
- 웹 애플리케이션당 하나의 인스턴스
ServletContext와 유사한 생명주기
📌 핵심: 웹 애플리케이션 전체에서 공유되는 데이터 저장용생성되는 객체들
- 애플리케이션 전역 설정
- 캐시 매니저
- 전역 카운터
- 공유 리소스 관리자
- 애플리케이션 이벤트 리스너
애플리케이션 스코프는 웹 서버가 돌아가는 전체적인 범위(웹 컨테이너)에서 생성되는 인스턴스로, 애플리케이션 전체에서 공유되는 데이터를 저장하는 용도로 사용됨.
싱글톤 스코프는 스프링 컨테이너에서 딱 하나만 존재하는 빈(인스턴스)으로, 스프링 컨테이너가 관리하는 객체를 담는 용도임.
이 둘은 관리 주체와 사용 목적에서 차이점이 나타난다.
애플리케이션 스코프는 모든 사용자 세션에서 공유되기 떄문에 애플리케이션 전체에서 공유해야 하는 데이터를 저장할 때 사용한다.
싱글톤 스코프는 서비스나 레포지토리 계층에서 의존성 주입 등 필요한 곳에 똑같은 인스턴스를 주입하는 용도로 많이 사용된다.
해당 스코프들을 관리하는 곳과 목적이 다르기 때문에 구분할 필요가 있다.
애플리케이션 스코프는 웹 컨테이너에서 사용되는데, 이 웹 컨테이너는 http요청에 알맞는 서블릿을 관리하고 요청하는 역할을 하면서 사용자 세션에서 공통으로 사용되는 데이터들을 저장하는 인스턴스로 사용된다.
싱글톤 스코프는 해당 웹 컨테이너에서 디스패처 서블릿을 호출할 때, 이 디스패처 서블릿이 스프링 컨테이너를 초기화하게 되는데 이 때 생성되는 스프링 빈 객체를 관리하기 위한 인스턴스로 사용된다.
ServletContext와 ApplicationContext는 각각 웹 컨테이너와 스프링 컨테이너가 관리하는 전역 컨텍스트로, 생명주기에서 차이점이 있음.
ServletContext는 웹 컨테이너에서 관리되며 애플리케이션이 배포되고 시작할 때 생성되고, 애플리케이션이 종료될 때 소명됨. ( 애플리케이션 생명주기와 동일하게 유지됨)
ApplicationContext는 스프링 프레임워크가 관리하는 컨테이너로 디스패처 서블릿이 초기화될 때 생성되고 스프링 컨텍스트가 종료될 때 소멸함.
DI를 사용하면 객체 간의 결합도가 낮아지고, 코드의 유연성을 높여주어서 재사용성이 높아진다.
DI가 없다면, 클래스가 자신의 의존 객체를 직접 생성하게 되는데, 이 경우 강한 결합도가 발생하게된다. 결합도가 높아지면 클래스 간의 관계가 매우 밀접해지고 변경이 어려워진다. 한 객체의 구현이 변경되면, 그 객체를 사용하는 모든 객체도 수정이 필요할 수 있어서 유지보수가 어려워진다.
DI가 없다면, 클래스가 자신의 의존 객체를 직접 생성하게 되어서 래스 내부에서 다른 클래스를 직접 참조하고 생성하는 구조가 되어, 클래스 간의 관계가 매우 밀접해지고 변경이 어려워진다. 한 객체의 구현이 변경되면, 그 객체를 사용하는 모든 객체도 수정이 필요할 수 있음.
@Lazy 어노테이션을 사용하거나 인터페이스 분리하는 방법이 있다.
Application Context
스프링의 핵심 컨테이너로서, 스프링 애플리케이션 전체에 걸쳐 스프링 빈의 생성, 관리, 라이프사이클을 담당
ApplicationContext 인터페이스를 구현하는 다양한 컨텍스트 구현체들이 있으며 주로 사용되는 것으로는
AnnotationConfigApplicationContext,ClassPathXmlApplicationContext,FileSystemXmlApplicationContext등이 있다.
Web Application Context
웹 애플리케이션에서 사용되는 스프링 컨텍스트로 , ApplicationContext 인터페이스를 확장한 WebApplicationContext 인터페이스를 구현한다.
웹 애플리케이션의 라이프사이클과 웹 관련 기능을 제공주로 사용되는 것으로는
XmlWebApplicationContext,AnnotationConfigWebApplicationContext등이 있다.
ApplicationContext는 스프링의 기본 컨테이너로 빈을 관리하는 역할을 하고,
WebApplicationContext는 이를 확장해 웹 환경에서 ServletContext 접근, DispatcherServlet 연동, ViewResolver 설정 등 웹에 특화된 기능을 담당하는 컨테이너이다.
관심사 분리 원칙을 따르기 위해 스프링은 일반적인 빈 관리 영역과 웹에 특화된 빈 관리 영역을 명확하게 구분하고자 나누어서 관리함.
Web 컨텍스트는 루트 컨텍스트를 상속 받는 구조라서
자신이 가지고 있지 않은 빈이 요청될 경우, 부모 컨텍스트(루트)에게 빈을 위임할 수 잇음.
web.xml을 통해 ContextLoaderListener와 DispatcherServlet을 설정한다. ContextLoaderListener가 먼저 실행되어 ApplicationContext가 초기화되며, 비즈니스 로직과 관련된 Service나 Repository 빈들이 이 컨텍스트에 등록된다. DispatcherServlet이 실행되면서 WebApplicationContext가 초기화되고, Controller나 ViewResolver와 같은 웹 관련 빈들이 이 안에 포함된다.Application과 Web 두 컨텍스트는 서로 계층적으로 연결되어 있으며, Web Context는 ApplicationContext의 빈을 참조할 수 있습니다.서블릿 컨테이너 = 웹 컨테이너
이 웹 컨테이너는 http요청에 알맞는 서블릿을 관리하고 요청하는 역할을 하면서 사용자 세션에서 공통으로 사용되는 데이터들을 저장하는 인스턴스로 사용된다.
디스패처 서블릿이 스프링 컨테이너를 초기화하게 되는데 이 때 생성되는 스프링 빈 객체를 관리하기 위한 인스턴스로 사용된다.
스프링 부트는 기존 스프링 MVC의 복잡한 설정을 자동화하여 하나의 ApplicationContext에서 Root와 Web Context를 통합하거나 확장하면서 훨씬 간편하게 컨테이너를 초기화한다.
1.애플리케이션은 main() 메서드 내에서 SpringApplication.run() 메서드를 호출하면서 시작되며, 이 과정에서 내장 톰캣과 같은 웹 서버가 자동으로 구동된다. 2.@SpringBootApplication 어노테이션을 기준으로 컴포넌트 스캔이 이루어지고, 그 결과로 단일한 ApplicationContext가 생성되어 모든 빈을 등록하고 의존성 주입을 수행한다.
3. DispatcherServlet도 자동으로 등록되며, Web Context 역할까지 자동 설정되므로 개발자가 직접 web.xml이나 수동 설정을 하지 않아도 된다.