- 앞에서 작성한
AppConfig.java
파일에 Bean설정 내용을 입력하면, 실행 시점에 스프링 컨테이너가 Bean을 생성해서 유지한다고 했다.
(이를 통해DIP / OCP
를 지킬 수 있었음)
- 테스트 코드를 작성할 때에 우리는 아래 코드 처럼 의존성 주입을 해야한다!
(실제 의존성이 들어가는 코드에서는 인터페이스를 바라보므로 수정 X)
[ 간단 설명 ]
- 위에서 사용한
ApplicationContext
가 바로 스프링 컨테이너 이다.
- 스프링 컨테이너는 Bean을 관리하여 DI를 하는 것 말고도 다양한 역할을 한다(여러 인터페이스를 상속받기 때문)
- 사실 스프링 컨테이너는
BeanFactory
와ApplicationContext
로 분리하여 부르기도 한다.
(자세한 설명은 뒤에서)
- 스프링 컨테이너는 다양한 방법으로 설정 파일을 만들 수 있다
(java / xml / groovy 등등) - 현재 실무에선 모두 java로 사용
[ BeanFactory와 ApplicationContext ]
- BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- 스프링 빈을 관리하고 조회하는 역할 담당
(getBean()
/getBeansOfType()
등)
- ApplicationContext
BeanFactory
을 상속받아서 빈을 관리하는 기능을 제공- 그 외에도 애플리케이션 개발을 위한 다양한 부가기능이 존재
(다양한 인터페이스들을 상속받는다)
MessageSource
를 활용한 국제화 기능
: 들어오는 나라에 따라 한국어, 영어 등으로 언어별로 출력EnvironmentCapable
: 실제 개발을 할 때에는 크게 3가지 환경이 존재하는데 이러한 환경들 마다 환경변수를 설정하고, 서로다른 DB나 외부 클라우드 연결을 달리할 수 있음
(환경 3가지 -로컬 / 개발 / 운영
)ApplicationEventPublisher
: 이벤트를 발행하고 구독하는 모델을 편리하게 지원ResourceLoader
: 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
[ 의존관계 주입 절차 ]
1) 스프링 컨테이너는
@Configuration
이 붙은 파일을 찾아서 설정 정보로 인식
2)@Bean
어노테이션이 있는 모든 메서드를 호출해서 반환된 객체를 스프링 컨테이너에 등록
3) 각@Bean
간에 의존관계를 설정해서 사용할 수 있게 한다
[ 다양한 스프링 설정 & BeanDefinition ]
- 앞서 했던 것 처럼
AppConfig.java
는 java를 사용한 스프링 설정파일을 만드는 방법- 이 외에도 xml / groovy등으로 설정파일을 만들 수 있다
--> 하지만, 현재 실무에서는 잘 안씀 (레거시 프로젝트 유지보수 정도만)- 이렇게 다양한 설정파일을 할 수 있게 하는 원리의 중심에는
BeanDefinition
이 있다.- BeanDefinition
- 최종적으로 스프링 컨테이너가 참조하는 설정파일의 메타정보
(java로 하든, xml로 하든 결국BeanDefinition
이 된다)- 스프링 컨테이너는 결국
BeanDefinition
이라는 파일만 참조하므로 다양한 방식으로 설정파일을 만들어도 사용할 수 있는 것!
( 정리 )
ApplicationContext
는BeanFactory
기능을 상속받아 빈을 관리할 수 있다
BeanFactory
를 직접 사용할 일은 없어서 그 외 부가 기능을 추가로 가진ApplicationContext
를 보통 스프링 컨테이너라고 한다
- 스프링 컨테이너는 빈을 관리하며, DI를 할 수 있게 해준다!
- 스프링 컨테이너는 최종적으로
BeanDefinition
을 참조해서 설정하므로, 다양한 방법으로 빈 설정을 할 수 있다.
[ Bean 조회 ]
- Bean을 직접 조회할 일은 많지 않지만 알아두면 좋다.
- Bean을 조회하는 방법
- Type으로 조회
- name으로 조회
- 실제 Bean을 조회하면 2가지 Bean이 조회된다
- 스프링 자체에서 필요로 인해 넣어주는 Bean
- 개발하기 위해 필요해 만든 Bean
- 개발하기 위해 우리가 만든 Bean만 출력하기 위해 Role()로 검사할 수 있다.
[ Bean의 상속 관계 ]