728x90

 

빈 팩토리(Bean Factory)와 애플리케이션 컨텍스트(Application Context)는 스프링 프레임워크에서 빈(Bean)을 생성하고 관리하는 기능을 제공하는 핵심 컨테이너입니다. 하지만 두 개의 용어는 약간의 차이점이 있습니다.

  1. 빈 팩토리(Bean Factory):
    • 빈 팩토리는 스프링의 핵심 컨테이너로서 빈(Bean)의 생성, 관리, 의존성 주입(Dependency Injection), 라이프사이클 관리 등의 기능을 제공합니다.
    • 주요 인터페이스로는 BeanFactory가 있으며, DefaultListableBeanFactory와 같은 구현체가 사용됩니다.
    • 빈 팩토리는 스프링의 가장 기본적인 컨테이너로서, 간단한 빈 관리 기능을 제공합니다.

  2. 애플리케이션 컨텍스트(Application Context):
    • 애플리케이션 컨텍스트는 빈 팩토리의 기능을 확장한 컨테이너로서, 빈 팩토리의 모든 기능을 포함하며 추가적인 기능을 제공합니다.
    • 주요 인터페이스로는 ApplicationContext가 있으며, AnnotationConfigApplicationContext, ClassPathXmlApplicationContext, WebApplicationContext 등이 사용됩니다.
    • 메세지 소스를 활용한 국제화 기능 - 한국에서 들어오면 한국어, 영어권에서 들어오면 영어로 출력해주는 기능입니다. ( 국제화(i18n) 지원 )
    • 환경변수 - 로컬, 개발, 운영등을 구분해서처리합니다.
    • 애플리케이션 이벤트 - 이벤트 발행 및 구독하는 모델을 편리하게 지원합니다.
    • 편리한 리소스 조회 - 파일이나 클래스 패스같은 외부 url 같은 곳에서 파일을 불러와서 쓸 때, 편하게 사용할 수 있는 기능을 제공합니다.
    • 또한, 애플리케이션 컨텍스트는 빈을 지연 로딩(lazy-loading)하거나 프로토타입 스코프의 빈을 여러 번 생성하는 등의 더 복잡한 빈 관리 기능을 제공합니다.

즉, 빈 팩토리는 스프링의 가장 기본적인 빈 관리 기능을 제공하는 컨테이너이며, 애플리케이션 컨텍스트는 빈 팩토리의 모든 기능을 포함하고 추가적인 기능을 제공하는 확장된 형태의 컨테이너입니다. 애플리케이션 개발 시 일반적으로 애플리케이션 컨텍스트를 사용하는 것이 더 편리하며, 빈 팩토리는 특별한 상황에서나 좀 더 가볍게 사용될 수 있습니다.'


XML로 만드는 Bean

 

xml기반의 appconfig.xml 스프링 설정정보와 코드로 된 Appconfig.java 설정 정보를 비교해보면 유사하다는 걸 알 수 있습니다. xml 기반으로 설정하는 것은 최근에 잘 사용하지 않으므로 필요하면 공식 문서를 확인해보시면 좋습니다. https://spring.io/projects/spring-framework

        👉 XML로 bean 생성하는 코드 (.xml파일)
        
        <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

        <bean id="memberService" class="Spring.core.member.MemberServiceImpl">
            <constructor-arg name ="memberRepository" ref="memberRepository" />

        </bean>
        <bean id="memberRepository" class="Spring.core.member.MemoryMemberRepository"/>
        <bean id="orderService" class="Spring.core.order.OrderServiceImpl" >
            <constructor-arg name="memberRepository" ref="memberRepository" />
            <constructor-arg name="discountPolicy" ref="discountPolicy"/>
        </bean>
        <bean id="discountPolicy" class="Spring.core.discount.RateDiscountPolicy"/>
</beans>



        👉 xml 형식의 bean을 소환하여 작성한 TEST 코드 test 실행

        public class XmlAppContext {

            @Test
            void XmlAppContext() {
                ApplicationContext ac = new GenericXmlApplicationContext("appconfig.xml");
                MemberService memberService = ac.getBean("memberService", MemberService.class);
                assertThat(memberService).isInstanceOf(MemberService.class);
            }
        }

테스트코드가 실행이 완료되며, xml로 입력된 bean이 생성됨을 확인할 수 있습니다. 스프링의 싱글톤 빈으로 생성이 완료되었습니다

 

스프링 빈 메타 정보 - BeanDefinition

스프링에서 빈 메타 정보는 BeanDefinition이라는 개념을 통해 표현됩니다. BeanDefinition스프링 컨테이너가 빈(Bean)을 생성하고 관리하기 위해 필요한 정보를 담고 있는 객체입니다. 앞서 설명한 역할과 구현을 개념적으로 나눈 것입니다. BeanDefinition을 설정 메타 정보라 하고, @Bean 또는 <Bean> 당 각각 하나씩 메타정보가 생성됩니다. 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성합니다.

다음은 BeanDefinition에 대해 알아보는데 도움이 될 수 있는 설명입니다

  1. 빈의 클래스 타입: BeanDefinition은 빈으로 생성될 클래스의 타입 정보를 가지고 있습니다. 이는 스프링 컨테이너가 해당 클래스를 인스턴스화하고 빈으로 등록할 때 사용됩니다.
  2. 빈의 범위(Scope): BeanDefinition은 빈의 범위를 지정하는 정보를 가지고 있습니다. 스프링은 다양한 범위를 지원하는데, 주로 싱글톤(Singleton)과 프로토타입(Prototype)이 가장 많이 사용됩니다.
  3. 빈의 의존성(Dependency): BeanDefinition은 빈이 의존하는 다른 빈들과의 관계를 나타내는 정보를 가지고 있습니다. 이를 통해 스프링 컨테이너는 의존성 주입(Dependency Injection)을 수행하여 빈들 간의 관계를 자동으로 설정할 수 있습니다.
  4. 초기화 메서드와 소멸 메서드: BeanDefinition은 빈의 초기화와 소멸에 관련된 메서드 정보를 가지고 있습니다. 이를 통해 스프링 컨테이너는 빈의 라이프사이클을 관리하며, 빈이 생성될 때 초기화 메서드를 호출하고 소멸될 때 소멸 메서드를 호출할 수 있습니다.
  5. 추가 속성과 설정 정보: **BeanDefinition**은 다양한 추가 속성과 설정 정보를 포함할 수 있습니다. 예를 들어, 빈의 이름, 별칭, 프로파일, 지연 로딩 여부 등의 정보를 포함할 수 있습니다.

BeanDefinition은 스프링 컨테이너가 빈을 생성하고 관리하는 중요한 메타 정보를 담고 있습니다. 이를 통해 스프링은 빈의 생성, 초기화, 의존성 주입 등을 자동으로 처리할 수 있고, 개발자는 빈의 구체적인 설정과 관계를 중심으로 애플리케이션을 개발할 수 있습니다.

        👉 **스프링 빈 메타 정보를 확인해 보는 코드 작성**

        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("beanDefinition = " + beanDefinition + "beanDefinition = " + beanDefinition);
                    }
                }
            }    
            }

 

 

해당 TEST 코드를 실행하면 AppConfig.class에 등록 되어 있는 bean들의 메타 정보를 확인할 수 있습니다.

728x90
반응형

+ Recent posts