이 포스팅은 인프런 강의 중 김영한님의 '스프링 핵심 원리 - 기본편' 중
섹션 4의 내용 일부를 정리한 것입니다.
코드 및 사진 이미지 모두 해당 강의를 참고하였습니다.
스프링 핵심 원리 - 기본편 링크
//스프링 컨테이너 생성
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext는 스프링 컨테이너라 한다.
(정확히는 BeanFactory와 ApplicationContext로 구분짓지만 BeanFactory를 직접 사용하는 경우가 거의 없어서 일반적으로 ApplicationContext를 스프링 컨테이너라 한다.)
스프링 컨테이너는 XML 기반으로 만들 수 있고, 에노테이션 기반의 자바 설정 클래스로 만들 수 있지만 전 포스팅에서 작성한 것처럼
AppConfig를 사용했던 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다.
1. 스프링 컨테이너 생성
출처: (인프런) '김영한'
스프링 핵심 원리 - 기본편
여기서 키는 빈의 이름이 되고, 값은 빈의 객체가 된다.
이러한 내부의 빈 저장소가 있다.
따라서 스프링 컨테이너를 생성할 때에는 구성 정보를 지정해주어야 한다.
이 구성 정보는 AppConfig를 뜻한다.
2. 스프링 빈 등록
출처: (인프런) '김영한'
스프링 핵심 원리 - 기본편
스프링 컨테이너가 빈 저장소에 AppConfig 설정 정보를 넘긴 것을 보고
@Bean이 붙은 것을 호출해서 메서드 네임을 키로 가지고
new로 반환하는 객체를 빈 객체로 등록하여 스프링 빈에 등록한다.
스프링 컨테이너는 설정 정보를 참고하여 동적인 의존관계를 주입(DI)한다.
↗️정적 vs 동적 의존관계란?
정적인 의존관계는 코드상에서 클래스 간의 의존관계를 나타내는 것으로, 직접 코드에서 의존하는 클래스를 호출하는 방식입니다. 여기에서는 OrderServiceImpl 클래스가 MemberRepository와 DiscountPolicy 인터페이스에 의존하는 것을 확인할 수 있습니다.
동적인 의존관계는 스프링 컨테이너에서 의존하는 객체를 주입받는 방식입니다. 스프링 컨테이너는 객체 생성과 의존성 주입을 담당하며, 주입 받을 객체의 타입을 스프링 컨테이너에 알려주면 컨테이너가 해당 타입의 객체를 생성하여 주입해줍니다.
출처: (인프런)스프링 핵심 원리 - 기본편 Q&A