nyximos.log

[Spring] @Configuration, @Bean, 스프링 컨테이너 본문

Programming/Spring

[Spring] @Configuration, @Bean, 스프링 컨테이너

nyximos 2022. 1. 12. 00:10

@Configuration

설정을 구성한다는 뜻

스프링 설정 클래스를 선언한다.

IoC Container에게 해당 클래스를 Bean 구성 Class 임을 알려준다.

 

@Bean

스프링 컨테이너에 스프링 빈으로 등록

@Configuration을 안 붙여도 빈으로 등록이 가능하지만 싱글톤을 보장받지 못한다.

 

스프링 컨테이너

ApplicationContext를 스프링 컨테이너라 한다.

XML이나 애노테이션 기반의 자바 설정 클래스로도 만들 수 있다.

 

객체 생성과 DI를 스프링 컨테이너를 통해 한다.

@Configuration이 붙은 애를 설정(구성)정보로 사용한다.

@Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. → 스프링 빈

이전에는 개발자가 필요한 객체를 직접 조회했지만,

이제부터는 스프링 컨테이너를 통해서 applicationContext.getBean() 메서드를 사용하여 필요한 스프링 빈(객체)을 찾을 수 있다.

 

 

🧙‍♂️ 스프링 컨테이너 생성

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

ApplicationContext는 인터페이스이다.

자바 설정 클래스를 기반으로 스프링 컨테이너를 만들었다.

 

스프링 컨테이너 생성과정

1. 스프링 컨테이너 생성

    : 생성할 때 구성정보를 지정해줘야 됨

2. 스프링 빈 등록

   : 파라미터로 넘어온 설정 클래스 정보(스프링 컨테이너 생성시 지정한 구성 정보)를 사용해 @Bean 붙은 애들을 스프링 빈을 등록한다.

     빈 이름은 보통 메서드 이름을 사용하지만 직접 부여할 수도 있다. 그러나 빈 이름이 같으면 오류가 발생하니 주의하자

3. 스프링 빈 의존관계 설정

    스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입한다.

 

 

BeanFactory와 ApplicationContext

둘다 스프링 컨테이너

[그림 첨부]

 

BeanFactory

스프링 컨테이너의 최상위 인터페이스

스프링 빈을 관리하고 조회

getBean() 제공

 

ApplicationContext

BeanFactory를 상속받아 스프링 빈을 관리하는 기능도 제공하며

MessageSource : 메시지소스를 활용한 국제화 기능

EnvironmentCapable : 환경변수

ApplicationEventPublisher : 애플리케이션 이벤트

ResourceLoader : 편리한 리소스 조회

등 부가기능도 제공해서 BeanFactory보다 많이 사용한다.

 

스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있도록 유연하게 설계되어있는데

BeanDefinition이라는 빈 설정 메타 정보 때문이다.

 

1. 어쩌구ApplicationContext 는어쩌구BeanDefinitionReader를 사용해 설정정보를 읽고

2. 빈 설정 메타정보인 BeanDefinition을 생성한다.

(어쩌구에 Annotated, Xml 등등이 들어가게 된다.)

그 후에 스프링 빈은 BeanDefinition만 알면 메타 정보를 기반으로 스프링 빈을 생성해준다.

 

BeanDefinition에는 어떤 정보들이 있을까?

  • BeanClassName: 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
  • factoryBeanName: 팩토리 역할의 빈을 사용할 경우 이름
  • factoryMethodName: 빈을 생성할 팩토리 메서드 지정
  • Scope: 싱글톤(기본값)
  • lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연처리 하는지 여부
  • InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
  • DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
  • Constructor arguments, Properties: 의존관계 주입에서 사용한다. (자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)

 

참조

@Configuration - https://galid1.tistory.com/494

김영한, 스프링 핵심 원리 - 기본편 https://inf.run/ryWP

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com