Spring/스프링 핵심 원리 - 기본편

[스프링 핵심 원리] 04. 스프링 컨테이너와 스프링 빈 - 스프링 빈 설정 메타 정보(BeanDefinition)

HSY_mumu 2022. 5. 17. 00:35
728x90

BeanDefinition (인프런) 김영한님의 스프링 핵심 원리-기본편을 공부하고 리뷰한 글입니다.

8. 스프링 빈 설정 메타 정보(BeanDefinition)

Q. 스프링이 다양한 설정 형식을 지원할 수 있는 이유는?

그 중심에는 바로 BeanDefinition이라는 추상화가 있다.

즉, 설정 정보 역할구현을 개념적으로 분리한 것으로 설정 정보를 추상화시켰다.

스프링 컨테이너BeanDefinition(역할)만 알고 자바 코드인지, XML 인지(구현)은 몰라도 된다.

  • XML 을 읽어 BeanDefinition 만듦
  • 자바 코드를 읽어 BeanDefinition 만듦

BeanDefinition = 빈 설정 메타정보

- @Bean / <bean>  하나당 하나씩 메타 정보가 생성된다.

- 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.

<코드 레벨로 깊이있게 들어가기>

어려우면 그냥 그런가보다하고 넘어가도 되는 부분이다.

- AnnotationConfigApplicationContextAnnotatedBeanDefinitionReader 를 사용해서 AppConfig.class 를 읽고 BeanDefinition 을 생성한다.

- GenericXmlApplicationContext XmlBeanDefinitionReader 를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition 을 생성한다.

- 새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서 BeanDefinition 을 생성하면 된다.

 

1. BeanDefinition 살펴보기

1) BeanDefinition 정보

 

2) BeanDefinitionTest 코드 작성

빈 설정 메타 정보(BeanDefinition)를 확인하는 테스트 코드다.

package hello.core.beandefinition;

import hello.core.AppConfig;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class BeanDefinitionTest {

    // getBeanDefintion을 하기 위해 ApplicationContext로 선언하지 않음
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
    //GenericXmlApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");

    @Test
    @DisplayName("빈 설정 메타정보 확인")
    void findApplicationBean() {
        // 모든 빈 이름 조회
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            // 빈 이름으로 beanDefintion 조회
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
            // 사용자가 등록한 빈의 메타정보만 출력
            if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                System.out.println("beanDefinitionName = " + beanDefinitionName +
                        " beanDefinition = " + beanDefinition);
            }
        }
    }
}

 

3) 결과

 

<정리>

- BeanDefinition을 직접 생성해서 스프링 컨테이너에 등록할 수 도 있다. 하지만 실무에서 BeanDefinition을 직접 정의하거나 사용할 일은 거의 없으니 어려우면 그냥 넘어가자!

- BeanDefinition에 대해서는 너무 깊이있게 이해하기 보다는, 스프링이 다양한 형태의 설정 정보 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다.

- 가끔 스프링 코드나 스프링 관련 오픈 소스의 코드를 볼 때, BeanDefinition 이라는 것이 보일 때가 있다. 이때 이러한 메커니즘을 떠올리면 된다.

728x90