[Spring] 스프링 컨테이너 와 스프링 빈(2)

JJoSuk·2023년 5월 31일
0

본 프로젝트 자료는 김영한님의 스프링 핵심 원리 - 기본편 참고 제작됐음을 알립니다.

스프링 컨테이너를 알아보자

컨테이너란 인스턴스의 생명주기를 관리, 추가적인 기능 제공과 객체의 생성/소멸을 컨트롤 한다.

오늘 배운 내용인 컨테이너는 스프링 컨테니어로

  • 자바 객체를 담고 있다.
  • 언제든지 스프링 컨테이너로 부터 필요한 객체를 가져와 사용할 수 있다.
  • Bean들의 생명주기를 관리한다.
  • Spring Container 는 어플리케이션을 구성하는 Bean 들을 관리하기 위해 loC를 사용

스프링 컨테이너 종류 중 하나인 어플리케이션 컨텍스트 ApplicationContext 를 먼저 설명하고자 한다.


어플리케이션 컨텍스트 ApplicationContext

ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);

ApplicationContext 는 BeanFactory를 확장한 향상 된 컨테이너로 일반적으로 ApplicationContext 를 스프링 컨테이너라 부른다.

  • 기본적인 기능은 빈 팩토리와 동일하고 스프링이 제공하는 각종 부가서비스를 추가로 제공
    • 국제화가 지원되는 텍스트 메시지를 관리해 준다.
    • 이미지같은 파일 자원을 로드 할 수 있는 포괄적인 방법을 제공해준다.
    • 리너스로 등록된 빈에게 이벤트 발생을 알려준다.

스프링 컨테이너 생성 과정

ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);

new AnnotationConfigApplicationContext(AppConfig.class) 라는 스프링 컨테이너를 생성할 때 AppConfig.class 를 지정해서 구성 정보를 넘겨주면 된다.

AppConfig.class 에 구성정보를 @Bean 으로 지정해주고 스프링 컨테이너로 넘온 모습을 볼 수 있다.

AppConfig의 구성정보를 넘겨받은 스프링 컨테이너는 의존관계를 주입한다.


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

스프링 컨테이너에 실제 스프링 빈들이 잘 등록 됐는지 확인해보자

public class ApplicationContextInfoTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("모든 빈 출력하기")
    void findAllBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("name = " + beanDefinitionName + " object = " + bean);
        }
    }

    @Test
    @DisplayName("애플리케이션 빈 출력하기")
    void findApplicationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            // BeanDefinition 은 내부의 모든 정부
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

            // 개발자가 애플리케이션을 개발하기 위해 등록한 Bean
            // Role ROLE_APPLICATION : 직접 등록한 애플리케이션 빈
            // Role ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
            if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name = " + beanDefinitionName + " object = " + bean);
            }
        }
    }
}

모든 빈 출력하기

  • 실행하면 스프링에 등록된 모든 빈 정보를 출력할 수 있다.
  • ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다.
  • ac.getBean() : 빈 이름으로 빈 객체(인스턴스)를 조회한다.

애플리케이션 빈 출력하기

  • 스프링이 내부에서 사용하는 빈은 제외하고, 내가 등록한 빈만 출력해보자.
  • 스프링이 내부에서 사용하는 빈은 getRole() 로 구분할 수 있다.
    • ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
    • ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈

여기서 스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법은

  • ac.getBean(빈이름, 타입)
  • ac.getBean(타입)

만약 스프링 컨테이너에 빈이 없으면 예외 발생한다.

  • NoSuchBeanDefinitionException: No bean named 'xxxxx' available
profile
안녕하세요

0개의 댓글