(인프런) 김영한님의 스프링 핵심 원리-기본편을 공부하고 리뷰한 글입니다.
6. BeanFactory와 ApplicationContext
1. BeanFactory
BeanFactory는 스프링 컨테이너의 최상위 인터페이스다.
- 스프링 빈을 관리, 조회하는 역할을 담당한다.
- 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다. e.g. getBean()
2. ApplicationContext
- BeanFactory 기능을 모두 상속받아 제공한다.
- 빈을 관리, 조회하는 기능에 추가로 부가 기능을 제공한다.
3. ApplicationContext가 제공하는 부가기능
1) 메시지소스를 활용한 국제화 기능(MessageSource)
e.g. 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력
2) 환경변수(EnvironmentCapable)
- 로컬 환경(내 PC), 개발(테스트) 환경, 운영 환경 등을 구분해서 처리
e.g 환경에 따라 어떤 데이터 베이스에 연결해야할지
3) 애플리케이션 이벤트(ApplicationEventPublisher)
- 이벤트를 발행하고 구독하는 모델을 편리하게 지원
4) 편리한 리소스 조회(ResourceLoader)
- 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
<정리>
- ApplicationContext는 BeanFactory의 기능을 상속받는다.
- ApplicationContext는 빈 관리기능 + 편리한 부가 기능을 제공한다.
- BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다.
- BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다.
7. 다양한 설정 형식 지원(자바 코드, XML)
스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있게 유연하게 설계되었다.
e.g. 자바 코드, XML, Groovy 등
1. 애노테이션 기반 자바 코드 설정 사용
지금까지 해왔던 것으로 주로 이 방식을 사용한다.
AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다.
new AnnotationConfigApplicationContext(AppConfig.class)
2. XML 설정 사용
최근에는 스프링 부트 사용으로 XML 기반의 설정은 잘 사용하지 않는다.
아직 많은 레거시 프로젝트들이 XML로 되어있고 XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장점도 있으므로 한번쯤 배워두는 것도 좋다.
GenericXmlApplicationContext를 사용하면서 xml 설정 파일을 넘기면 된다.
1) XmlAppConfig 사용 자바 코드
스프링 컨테이너를 생성하는 방식만 달라졌고 빈을 조회하고 검증하는 코드는 동일하다.
package hello.core.xml;
import hello.core.member.MemberService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import static org.assertj.core.api.Assertions.*;
public class XmlAppContext {
@Test
void xmlAppContext() {
// xml 설정파일로 스프링 컨테이너 생성
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
2) xml 기반의 스프링 빈 설정 정보(src/main/resources/appConfig.xml)
xml 기반의 appConfig.xml 스프링 설정 정보와 자바코드로 된 AppConfig.java 설정 정보는 거의 비슷하다.
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="hello.core.member.MemberServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository" />
</bean>
<bean id="memberRepository"
class="hello.core.member.MemoryMemberRepository" />
<bean id="orderService" class="hello.core.order.OrderServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository" />
<constructor-arg name="discountPolicy" ref="discountPolicy" />
</bean>
<bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy" />
</beans>
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[스프링 핵심 원리] 05. 싱글톤 컨테이너 - 웹 애플리케이션과 싱글톤 & 싱글톤 패턴 (0) | 2022.05.17 |
---|---|
[스프링 핵심 원리] 04. 스프링 컨테이너와 스프링 빈 - 스프링 빈 설정 메타 정보(BeanDefinition) (0) | 2022.05.17 |
[스프링 핵심 원리] 04. 스프링 컨테이너와 스프링 빈 - 스프링 빈 조회(상속 관계) (0) | 2022.05.16 |
[스프링 핵심 원리] 04. 스프링 컨테이너와 스프링 빈 - 스프링 빈 조회(동일한 타입이 둘 이상) (0) | 2022.05.16 |
[스프링 핵심 원리] 04. 스프링 컨테이너와 스프링 빈 - 스프링 빈 조회(기본) (0) | 2022.05.16 |