빈 팩토리(Bean Factory)와 애플리케이션 컨텍스트(Application Context)는 스프링 프레임워크에서 빈(Bean)을 생성하고 관리하는 기능을 제공하는 핵심 컨테이너입니다. 하지만 두 개의 용어는 약간의 차이점이 있습니다.
- 빈 팩토리(Bean Factory):
- 빈 팩토리는 스프링의 핵심 컨테이너로서 빈(Bean)의 생성, 관리, 의존성 주입(Dependency Injection), 라이프사이클 관리 등의 기능을 제공합니다.
- 주요 인터페이스로는 BeanFactory가 있으며, DefaultListableBeanFactory와 같은 구현체가 사용됩니다.
- 빈 팩토리는 스프링의 가장 기본적인 컨테이너로서, 간단한 빈 관리 기능을 제공합니다.
- 애플리케이션 컨텍스트(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에 대해 알아보는데 도움이 될 수 있는 설명입니다
- 빈의 클래스 타입: BeanDefinition은 빈으로 생성될 클래스의 타입 정보를 가지고 있습니다. 이는 스프링 컨테이너가 해당 클래스를 인스턴스화하고 빈으로 등록할 때 사용됩니다.
- 빈의 범위(Scope): BeanDefinition은 빈의 범위를 지정하는 정보를 가지고 있습니다. 스프링은 다양한 범위를 지원하는데, 주로 싱글톤(Singleton)과 프로토타입(Prototype)이 가장 많이 사용됩니다.
- 빈의 의존성(Dependency): BeanDefinition은 빈이 의존하는 다른 빈들과의 관계를 나타내는 정보를 가지고 있습니다. 이를 통해 스프링 컨테이너는 의존성 주입(Dependency Injection)을 수행하여 빈들 간의 관계를 자동으로 설정할 수 있습니다.
- 초기화 메서드와 소멸 메서드: BeanDefinition은 빈의 초기화와 소멸에 관련된 메서드 정보를 가지고 있습니다. 이를 통해 스프링 컨테이너는 빈의 라이프사이클을 관리하며, 빈이 생성될 때 초기화 메서드를 호출하고 소멸될 때 소멸 메서드를 호출할 수 있습니다.
- 추가 속성과 설정 정보: **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들의 메타 정보를 확인할 수 있습니다.
'[ BACKEND] > Spring' 카테고리의 다른 글
[SPRING] 싱글톤 방식의 주의점 💥 (0) | 2023.07.25 |
---|---|
[SPRING] Web Application과 Singleton의 관계 (0) | 2023.07.24 |
[SPRING] 스프링 빈 조회 - 동일한 타입이 2개 이상 (0) | 2023.07.22 |
[SPRING] 스프링 컨테이너와 Bean 조회 (0) | 2023.07.21 |
[SPRING] Redirect와 Fofrward (0) | 2023.07.19 |