강의를 들으며 내가 알고 있는 내용을 점검하고,
새로 배운 내용을 정리하며,
궁금한 내용을 알아가며 학습해나가는 것을 목표로 합니다.
기존에는 사용자가 어떤 클래스를 사용하여 객체를 생성할 건지에 대해 결정했다면,
제어의 역전이란 거꾸로 프레임워크가 애플리케이션 코드를 사용하여 어떤 객체를 생성할 건지에 대해 결정하는 것 입니다.
즉, 사용자가 자신이 사용할 객체를 스스로 선택하는 방식이 아닌 프레임워크에 의해 결정되는 것 입니다.
이러한 방식을 제어 흐름의 역전, 제어의 역전이라고 부릅니다.
이를 The Hollywood Principle이라고도 합니다.
Spring에서는 생성에 대한 책임을 IoC 컨테이너에게 부여하여 객체의 생명주기를 관리하게 합니다.
IoC 컨테이너에서는 개별 객체들의 의존 관계 설정이 자동으로 이루어지며 객체들의 인스턴스를 만들어주고,
컨테이너가 객체들의 생명주기를 관리합니다.
스프링에서는 BeanFactory를 상속받는 Application Context라는 Interface를 제공합니다.
이 Application Context를 통하여 생성 정보와 연관 관계 정보에 대한 설정을 읽어 처리 합니다.
여기서 Bean은 어플리케이션 컨텍스트, 빈팩토리, IoC 컨테이너에 의해 관리 되어지는 객체를 의미합니다.
즉 Application Conetxt는 클라이언트가 Bean을 요청하면 @Configuration
이 붙은 클래스를 호출하여 @Bean
생성을 요청하고, 빈을 반환 합니다.
Application Context는 Bean 정보를 설정 메타데이터로부터 받아옵니다.
이 메타데이터를 이용해서 IoC 컨테이너에 의해 관리되는 객체를 생성하고 구성합니다. 어플리케이션에서 객체들의 도면이라고 볼 수 있습니다.
인터페이스인 Application Context가 어떤 메타데이터를 받느냐에 따라 각기 다른 구현체로 구현 할 수 있습니다.
GenericXmlApplicationContext
AnnotationConfigApplicationContext
IoC는 다양한 패턴들을 지원합니다.
의존성 주입은 IoC를 구현하는 하나의 패턴이라고 할 수 있습니다.
생성자를 통해서 객체를 주입 받는 패턴을 생성자 주입 패턴(Constructor-based DI)이라고 합니다.
이 외에 스프링은 세터(setter-based Di)기반의 패턴도 지원합니다.
생성자 주입방식은 아래와 같은 장점을 가집니다.
BeanCurrentlyInCreationException
컴포넌트 스캔은 스프링이 직접 클래스를 검색하여 빈으로 등록해주는 기능입니다.
설정 클래스에 빈으로 직접 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있습니다.
스프링이 자동으로 등록할 대상을 찾게 하기 위하여 @StereoType
으로 스캔 할 대상을 지정할 수 있습니다.
스테레오타입 어노테이션이 특정 요소를 상황이나 도메인에 맞게 분류해 주는 것입니다.
자동으로 주입 가능한 빈이 두 개 이상이면 어떤 빈을 주입 할지 스프링에게 알려줘야 합니다.
@Primary
로 우선순위를 지정할 수 있습니다.
@Qualifier(”use_case”)
또는 우선순위가 동등하다면 역할을 구분해서 사용할 수 있습니다.
@Configuration
또한 컴포넌트 스캔의 대상이 되기 때문에 설정을 여러 파일로 분리하고 메인이 되는 클래스에서 컴포넌트 스캔으로 불러 오는 방식을 주로 사용합니다.
스프링에서 빈은 기본적으로 싱글톤이지만, 필요에 따라 다른 스코프로 구성할 수 있습니다.
source : (https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes)
빈의 생명주기는 생성, 의존 설정, 초기화, 소멸의 단계를 거칩니다.
Bean Factory는 기본적인 DI를 지원하는 가장 간단한 형태의 컨테이너입니다.
getBean() 메서드가 호출 되면 빈을 생성합니다.
Application Context는 BeanFactory를 상속한 컨테이너 입니다.
context가 시작 하기 전 모든 빈을 생성하고 로딩하여, 원하는 시기에 사용할 수 있습니다.
@PostConstruct
이 적용된 메소드 호출@Bean
의 initMethod에 설정한 메소드 호출 @PreDestory
이 적용된 메소드 호출@Bean
의 destroyMethod에 설정한 메소드 호출