개발일지/Spring

스프링 빈 설정 메타 정보 - BeanDefinition

꾸주니=^= 2025. 2. 13. 13:57

이 포스트는 인프런 사이트에 김영한 - 스프링 핵심원리 강의를 보고 정리한 포스터입니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

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

김영한 | , 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢 수강 전 확인해주세요! 본 강의는 자바 스프링 완전 정복 시리즈의 두 번째 강의입니다. 우아한형제들 최연

www.inflearn.com

 

 

스프링 빈 설정 메타 정보 'BeanDefinition'에 대해 알아보겠습니다.


스프링은 어떻게 다양한 설정 형식을 지원하는 걸까요?
그 중심에는 BeanDefinition이라는 추상화가 있습니다.

 


🔆 스프링 빈 설정 메타 정보 - BeanDefinition

🔹 BeanDefinition이란?

스프링이 다양한 설정 형식을 지원할 수 있는 핵심 개념은 BeanDefinition이라는 추상화 덕분입니다.

▪️ 역할과 구현을 분리하는 개념입니다.
▪️ XML을 읽어도, 자바 코드를 읽어도 BeanDefinition을 만들어 컨테이너에 등록하면 됩니다.
▪️ 스프링 컨테이너는 XML인지 자바 코드인지 신경 쓰지 않고 BeanDefinition을 기반으로 빈을 생성하고 관리합니다.

 

 

🔹 BeanDefinition을 활용한 빈 설정 정보

@Bean 또는 <bean> 한 개당 하나의 BeanDefinition이 생성됩니다. 스프링 컨테이너는 이 메타 정보를 기반으로 빈을 생성하고 의존관계를 설정합니다.

 


스프링 컨테이너(Spring Container)와 BeanDefinition의 관계는 다음과 같습니다.

🔸 (1) 스프링 컨테이너(Spring Container)

스프링 컨테이너는 설정 정보를 읽고, 이를 바탕으로 빈을 생성하고 관리합니다.
설정 정보가 XML이든, 자바 클래스이든 상관없이 컨테이너는 이를 BeanDefinition으로 변환하여 관리합니다.

 

🔸 (2) BeanDefinition

BeanDefinition은 스프링 컨테이너가 빈을 생성할 때 필요한 메타데이터를 담고 있는 객체입니다.
자바 설정(AppConfig.class), XML 설정(appConfig.xml), 혹은 기타 설정(appConfig.xxx)을 BeanDefinition으로 변환하여 사용합니다.

 

🔸 (3) 설정 정보에서 BeanDefinition 생성

AppConfig.class, appConfig.xml, appConfig.xxx 같은 다양한 설정 정보를 읽고 공통된 구조(BeanDefinition)로 변환합니다.
스프링 컨테이너는 BeanDefinition을 기반으로 빈을 생성하기 때문에 설정 방식에 구애받지 않습니다.

 

 핵심 포인트

설정 방식(XML, 자바 클래스, 기타)이 달라도, 내부적으로는 BeanDefinition으로 통일해서 관리합니다.
스프링 컨테이너는 직접 자바 코드나 XML을 다루지 않고, BeanDefinition을 참조하여 빈을 생성하고 의존 관계를 주입합니다.


 

 

 ApplicationContext의 동작 원리를 보다 상세히 알아보겠습니다.

🔸 (1) ApplicationContext

스프링 컨테이너의 핵심 인터페이스로, 다양한 구현체(AnnotationConfigApplicationContext, GenericXmlApplicationContext, XxxApplicationContext)를 제공합니다.
설정 방식에 따라 다른 구현체를 사용할 수 있습니다.

 

🔸 (2) AnnotationConfigApplicationContext

AppConfig.class와 같은 자바 기반 설정을 읽습니다.
AnnotatedBeanDefinitionReader를 사용하여 설정 정보를 BeanDefinition으로 변환합니다.

 

🔸 (3) GenericXmlApplicationContext

ppConfig.xml과 같은 XML 기반 설정을 읽습니다.
XmlBeanDefinitionReader를 사용하여 설정 정보를 BeanDefinition으로 변환합니다.

 

🔸 (4) XxxApplicationContext

새로운 설정 방식(appConfig.xxx)을 추가할 경우, 별도의 XxxBeanDefinitionReader를 만들어 BeanDefinition을 생성할 수 있습니다.
즉, 새로운 설정 방식을 추가해도 스프링 컨테이너는 BeanDefinition을 통해 일관되게 처리할 수 있습니다.

 

 핵심 포인트

다양한 ApplicationContext 구현체가 존재하지만, 결국 모두 BeanDefinition을 생성하는 방식으로 통합됩니다.
새로운 설정 방식이 필요할 경우, XxxBeanDefinitionReader만 추가하면 됩니다.
ApplicationContext는 설정 파일(XML, 자바 코드 등)에 관계없이 BeanDefinition을 기반으로 빈을 관리합니다.

 

 

🔹 BeanDefinition의 주요 속성

속성명 설명
BeanClassName 생성할 빈의 클래스 명
factoryBeanName 팩토리 역할의 빈 이름 (예: appConfig)
factoryMethodName 팩토리 메서드 명 (예: memberService)
Scope 싱글톤(기본값)
lazyInit 빈을 사용할 때까지 생성 지연 여부
InitMethodName 초기화 메서드 명
DestroyMethodName 소멸 메서드 명
Constructor arguments, Properties 의존 관계 주입에서 사용

 

 

🔹 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;

public class BeanDefinitionTest {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("빈 설정 메타정보 확인")
    void findApplicationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
            if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                System.out.println("beanDefinitionName=" + beanDefinitionName +
                        " beanDefinition = " + beanDefinition);
            }
        }
    }
}

위 코드를 실행하면 스프링 컨테이너에 등록된 각 빈의 BeanDefinition 정보를 출력할 수 있습니다.

 


정리

1️⃣ BeanDefinition 스프링이 다양한 설정 방식을 지원하는 핵심 개념입니다.
2️⃣ AnnotationConfigApplicationContext AnnotatedBeanDefinitionReader를 사용해 AppConfig.class를 읽고 BeanDefinition을 생성합니다.
3️⃣ GenericXmlApplicationContext XmlBeanDefinitionReader를 사용해 XML을 읽고 BeanDefinition을 생성합니다.
4️⃣ 실무에서 BeanDefinition을 직접 다룰 일은 거의 없지만, 스프링이 내부적으로 어떻게 빈을 설정하는지 이해하는 데 도움이 됩니다.