SpringBoot/기본 원리

[spring boot 기본 원리] 스프링 컨테이너와 스프링 빈

송승현(SSH) 2022. 8. 7. 23:59

1.  스프링 컨테이너

스프링 컨테이너는 아래와 같은 코드로 만들 수 있다.

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(설정 클래스이름.class);

- 이 ApplicationContext를 스프링 컨테이너라고 부른다.
- ApplicationContext는 인터페이스 이며 XML 기반으로 만들 수 있고, 자바 설정 클래스로 만들 수 있다.

 

2. 스프링 컨테이너의 생성 과정

2-1 스프링 컨테이너 생성

스프링 컨테이너는 다음과 같은 순서로 생성된다.

1) new를 하여 스프링 컨테이너를 만든다.
2) 스프링 컨테이너 안에는 스프링 빈 저장소라는 것이 있는데 스프링 빈이 여기에 저장된다. 이때 빈 이름이 Key, 빈 객체가 Value가 된다.
3) 스프링 컨테이너를 생성할 때는 구성 정보(설정 정보)를 지정해주어야 하는데 여기서는 AppConfig.class이다.
4) 이 AppConfig.class를 보고 스프링 빈 저장소에 등록한다.


2-2 스프링 빈 등록

1) 설정 정보에 있는 정보를 스프링 빈 저장소에 등록한다. 이때 @Bean(수동 빈)이 붙은 객체를 등록한다.
2) 이때 빈 이름은 메서드 이름을 사용하며 빈 이름을 직접 부여할 수 도 있다.
3) * 빈 이름은 항상 다른 이름을 부여해야 한다.


2-3 스프링 빈 의존관계 설정 

1) 스프링 컨테이너는 빈을 등록한 다음 의존 관계를 주입한다. (DI)
2) 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있다.
3) @Bean(수동 빈)으로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리된다. 



3. 스프링 빈의 사용

3-1 스프링 빈의 조회

- ac.getBean(빈 이름, 타입) OR ac.getBean(타입)
- 만약 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이라면 오류가 발생하기 때문에, 이때는 빈 이름을 지정해주면 해결할 수 있다.

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

// ac.getBean(빈 이름, 타입)
MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class);

// ac.getBean(타입)
MemberServiceImpl memberService = ac.getBean(MemberServiceImpl.class);



3-2 스프링 빈 조회 - 상속 관계

- 스프링 빈은 부모 타입으로 조회하면 그 자식 타입까지 한꺼번에 조회된다.
- 그래서 모든 자바 객체의 부모인 Object 타입으로 조회하면 모든 스프링 빈이 조회된다.

 

4. BeanFactory와 ApplicationContext

 

1) BeanFactory

- 스프링 컨테이너의 최상위 인터페이스이며 스프링 빈을 관리하고 조회하는 역할을 담담한다.
- ac.getBean()을 제공한다.


2) ApplicationContext

- BeanFactory를 상속받아 제공하며 부가적인 기능을 제공한다.

1) MessageSource : 메시지 소스를 활용한 국제화 기능
2) EnvironmentCapable (환경 변수) : 로컬, 개발, 운영 등을 구분하여 처리
3) ApplicationEventPublisher(애플리케이션 이벤트) : 이벤트를 발행하고 구독하는 모델을 편리하게 지원
4) ResourceLoader(편리한 리소스 조회) : 파일, 클래스 패스, 외부 등에서 리소스를 편리하게 조회



5. 다양한 설정 형식 지원

- 스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있게 설계되여 유연하게 설정이 가능하다. (class, xml 등등

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
본 포스팅은 인프런의 '스프링 핵심 원리 - 기본편 : 김영한 강사님'의 강의와 자료를 참고하였습니다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------