DI 컨테이너인 스프링 컨테이너가 생성되는 과정과 컨테이너에 등록되는 객체인 스프링 빈을 조회하는 방법에 대해 알아보겠습니다.

스프링 컨테이너가 생성되는 과정

스프링 컨테이너 생성

  • ApplicationContext스프링 컨테이너라 합니다.
  • ApplicationContext 는 인터페이스입니다.
    • XML 기반 , 애노테이션 기반 생성 가능
    • AnnotationConfigApplicationContext (구현체)
  • 더 정확히는 BeanFactory, ApplicationContext 로 구분합니다.

스프링 빈 등록

  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록합니다.
  • 빈 이름
    • 빈 이름은 메서드 이름을 사용한다.
    • 빈 이름을 직접 부여할 수도 있다.
      • @Bean(name=”orderService2”)
  • 빈 이름항상 다른 이름을 부여해야합니다. 같은 이름을 부여하면 다른 빈이 무시되거나, 기존 빈을 덮어버리거나 설정에 따라 오류가 발생합니다!
    • 실무 항상 심플하고 헷갈리지않게 해야합니다!

스프링 빈 의존관계 설정 준비

스프링 빈 의존관계 설정 완료

  • 위의 이미지는 빈들간의 의존관계입니다.
    • 현재 AppConfig 는 UserRepository를 DI 받아 사용하기 때문에 저렇게 표현해주었습니다.
    • @Configuration엔 @Component가 붙어있어 AppConfig 또한 스프링 빈입니다.
  • 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI) 합니다.
  • 단순히 자바 코드를 호출하는 것 같지만, 차이가 있습니다.
    • 싱글톤 컨테이너라는 점 입니다(Proxy, CGLIB).

이렇듯 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있습니다.

하지만 모든 빈을 생성하고 그 다음에 의존관계를 주입하는 것이 아니고, 생성자 주입의 경우 생성자를 통해 빈을 생성하면서 의존관계 주입이 한번에 처리되는 형태입니다.


컨테이너에 등록된 모든 빈 조회

  • 모든 빈 조회하기
    • ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회
    • ac.getBean() : 빈 이름으로 빈 객체를 조회
  • 애플리케이션 빈 조회하기
    • BeanDefinition.getRole()
    • ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
    • ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈

스프링 빈 조회 - 기본

  • ac.getBean(빈이름, 타입)
  • ac.getBean(타입)
  • 조회 대상 스프링 빈이 없으면 예외 발생
    • NuSuchBeanDefinitionException

스프링 빈 조회 - 동일한 타입이 둘 이상

  • 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다. 이때는 빈 이름을 지정해야 합니다.
  • ac.getBeanOfType() 을 사용하면 해당 타입의 모든 빈을 조회할 수 있습니다.

스프링 빈 조회 - 상속관계

  • 부모 타입으로 조회하면, 자식 타입도 함께 조회합니다.
    • Object 타입으로 조회하면 모든 스프링 빈을 조회할 수 있습니다.

Reference.

  • 스프링 핵심 원리 기본편 (김영한)
profile
ProblemOverFlow

0개의 댓글

Powered by GraphCDN, the GraphQL CDN