스프링 컨테이너는 스프링 프레임워크의 핵심중 핵심 모듈로 객체의 초기화부터 소멸까지 관리해준다.
자바는 객체를 직접 생성하고 호출했었는데 스프링에선 컨테이너 덕분에 비즈니스 로직에 집중할 수 있다.
스프링 컨테이너 즉 Application Context
의 클래스 다이어그램이다.
여기서 눈여겨 봐야할 것은 BeanFactory
이다. 스프링 컨테이너는 기본적으로 BeanFactory
와 부가기능으로 이루어져 있다. (이벤트, 환경변수 등등)
스프링 컨테이너의 최상위 인터페이스로 스프링 빈을 관리 및 조회할 수 있다.
BeanFactory
의 설명을 보자 요약하면 다음과 같다.
BeanFactory는 애플리케이션의 중앙 레지스트이며, 객체 생성, 의존성 주입, 소멸을 한 곳에서 관리할 수 있다.
객체를 생성할 땐 BeanDefinition
에 따라서 인스턴스화 한 뒤 의존성 주입(DI)을 권장한다. (객체가 필요할때마다 직접 가져오는 pull방식은 권하지 않는다.)
Bean으로 등록될땐 Key Value 형식으로 저장되며 Key는 Bean의 이름, Value는 인스턴스가 저장된다.
일반적으로 구성소스(Annotation, XML등)를 읽어 생성된 것이다. 여기서 재밌는점은, 구성소스를 읽고 Java 객체를 반환하기만 하면 되기 때문에 어떻게 이루어져있던지 상관없다.
Definition의 요소는 BeanName, factoryBeanName, factoryMethodName, Scope, lazyInit여부, Constructor argument 등의 정보를 가지고 있다.
Scope는 보통 싱글톤 또는 프로토타입 패턴을 사용한다. (이것 외에도 request, session등 있다.)
한국어로 의존성 주입이라고 하며, 객체간의 의존관계를 정의하고, 의존성을 객체 내부가 아닌 외부에서 주입하는 방법을 뜻한다.
BeanFactory에서 DI를 권장하는 이유는 몇가지 장점이 있기 떄문이다.
의존성 주입 방법으론 생성자 주입, Setter 주입, 필드 주입이 있다. 보통의 상황에선 생성자 주입을 권장한다.
직접 Config 파일을 만들어도 되지만, 어노테이션을 사용하면 별도의 코드 없이 애플리케이션을 구성할 수 있다.
SpringBoot 프로젝트를 생성하면 기본 Application 클래스에 @SpringBootApplication
어노테이션이 붙어있다. 이는 의존성에 대한 설정 및 빈 등록을 자동으로 해준다.
SpringBootApplication은 몇가지 어노테이션을 포함한다.
해당 클래스가 애플리케이션의 Configuration을 담당하는 클래스임을 나타낸다.
컴포넌트
를 찾고, 빈으로 등록한다. 기본 설정은 주어진 클래스 패키지 및 하위 패키지다.
자바 설정 파일에 있는 빈을 자동으로 구성하고 등록한다.
ComponentScan의 (빈으로 등록될)대상임을 알리는 어노테이션이다.
@SpringBootApplication에 붙은 어노테이션을 설명해주신 부분 좋네요! 잘 읽고 갑니다~