1.Spirng Container와 Bean의 의미를 이해할 수 있다.
2. 빈 스코프(Bean Scope)와 싱글톤(Singleton)에 대해 이해하고 실습할 수 있다.
- DI
✔︎ 내부에 또 다른 컴포넌트를 가지고 있는 어떤 컴포넌트를 의미
✔︎ 먼저 객체를 생성하고 객체를 서로 연결
✔︎ 생명주기 전반을 관리
✔︎ 객체의 의존성을 확인해 생성한 뒤 적절한 객체에 의존성 주입
✔︎ 스프링은 스프링 컨테이너를 통해 객체 관리
✔︎ 스프링 컨테이너에서 관리되는 객체를 Bean이라고 함
✔︎ Bean들의 생명주기(Life Cycle)를 관리 (Bean들의 생성, 관리, 제거 등)
✔︎ 관리하기 위해 IoC를 사용
✔︎ BeanFactory, ApplicationContext 두 개의 컨테이너로 DI가 이루어진 빈들을 제어하고 관리
✔︎ BeanFactory
✔︎ ApplicationContext
✔︎ Bean
✔︎ Java Bean (🆚 Spring Bean)
✔︎ 속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할 지 결정
✔︎ Spring Container는 BeanDefinition이라는 추상화를 통해 Spring Bean 생성
ApplicationContext ac = new AnnotationConfigApplicationContext(DependencyConfig.class);
// DependencyConfig.class를 파라미터로 ac(ApplicationContext)를 생성하게 되면
// 내부적으로는 DependencyConfig.class 정보를 바탕으로
// BeanDefinition 인터페이스의 구현체 중 하나인 객체를 만듦
// 이를 바탕으로 스프링은 빈을 생성
// AnnotationConfigApplicationContext에 DependencyConfig.class를 넘겨줬을 때
// BeanDefinition의 구현체인 AnnotatedGenericBeanDefinition을 만들게 됨
// 해당 객체에서 Bean 메타정보를 가지고 Spring Container에서 Bean을 생성
✔︎ Bean이 존재할 수 있는 범위를 의미
✔︎ 특정 Bean 정의에서 생성된 개체에 연결할 다양한 의존성 및 구성 값뿐만 아니라, 특정 Bean 정의에서 생성된 개체의 범위도 제어 가능
✔︎ Spring Framework는 6개의 범위를 지원하며, 그 중 4개는 ApplicationContext를 사용하는 경우에만 사용 가능
✔︎ Bean은 여러 범위 중 하나에 배치될 수 있도록 정의할 수 있음
✔︎ 구성을 통해 개체의 범위를 선택할 수 있기 때문에 강력하고 유연
✔︎ 사용자 정의 범위도 생성 가능
✔︎ 해당 빈의 인스턴스를 오직 하나만 생성해서 사용하는 것을 의미
✔︎ 스프링 컨테이너에서 빈 스코프의 기본값
✔︎ 스프링 컨테이너의 시작과 함께 생성되어서 종료될 때까지 유지
✔︎ 싱글톤 빈의 하나의 공유 인스턴스만 관리
(private 생성자를 통해 외부에서 임의로 new를 사용하지 못하도록 막아야 함)
✔︎ 싱글톤 스코프의 스프링 빈은 여러 번 호출해도 모두 같은 인스턴스 참조 주소값을 가짐
✔︎ 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴
✔︎ 문제점 🚨
✔︎ 객체 인스턴스를 싱글톤으로 관리
✔︎ 여러 클라이언트가 하나의 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 무상태로
설계되어야 함
☞ 앞서 배운 DI를 바탕으로 스프링 컨테이너와 빈, 빈 스코프 중에서도 싱글톤 스코프에 대해 알아봤다. 솔직히 읽고 실습을 해보아도 100%까진 와닿지 않는 어렵고 심오한 내용이었다. 🤯 외우기보단 이해 위주로 실습과 복습을 반복해야겠다. 😤
・ DI (Dependency Injection)