오봉이와 함께하는 개발 블로그
Spring - 스프링 컨테이너와 빈 - 4(BeanFactory와 ApplicationContext, XML 기반 appConfig) 본문
BE/Spring
Spring - 스프링 컨테이너와 빈 - 4(BeanFactory와 ApplicationContext, XML 기반 appConfig)
오봉봉이 2022. 6. 6. 18:04728x90
BeanFactory와 ApplicationContext
BeanFactory
- 스프링 컨테이너의 최상위 컨테이너
- 스프링 빈을 관리하고 조회하는 역할을 담당함
- getBean()을 제공함
- 전에 작성했던 예제 코드들은 모두 BeanFactory에서 제공받은 기능
ApplicationContext
- BeanFactory 기능을 상속 받아서 제공됨
- BeanFactory에서 부가 기능을 더한 인터페이스
- 빈을 관리하고 검색하는 기능은 BeanFactory가 제공해 주는데, 둘의 차이는???
- 앱을 개발할 때는 관리, 조회는 물론 수 많은 부가기능이 필요하다
ApplicatonContext가 제공하는 부가기능
(사진)
- 메시지 소소를 활용한 국제화 기능(MessageSource)
- 한국에서 들어오면 한국어, 영어권에서 들어오면 영어로 출력
- 애플리케이션에서 언어를 kor로 설정하면 한국어로 된 애플리케이션, eng로 설정하면 영어로 된 애플리케이션(물론 파일을 따로 구현해야 함)
- 환경변수(EnvironmentCapable)
- 로컬, 개발, 운영등을 구분해서 처리
- 로컬 : 내 PC
- 개발 : 여러 시스템을 엮어 테스트 서버에 띄우는 환경
- 운영 : 실제 Production이 나가는 운영 환경
- 스테이징 : 실제 운영과 비슷한 환경
- 로컬, 개발, 운영등을 구분해서 처리
- 애플리케이션 이벤트(ApplicationEventPublisher)
- 이벤트를 발행하고 구독하는 모델을 편리하게 지원
- 편리한 리소스 조회(ResourceLoader)
- 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
- 추상화 하여 편리하게 사용할 수 있게 해줌
정리
- ApplicationContext는 BeanFactory의 기능을 상속받음
- ApplicationContext는 빈 관리기능 + 편리한 부가 기능을 제공함
- BeanFactory를 직접 사용할 일은 거의 없음
- 주로 부가기능이 포함된 ApplicationContext를 사용함
- BeanFactory나 ApplicationContext를 스프링 컨테이너라 함.
다양한 설정 형식 지원 - 자바, XML
- 스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있게 설계되어 있다
- Java, XML, Groovy 등
어노테이션 기반 자바 코드 설정 사용
- 지금까지 예제로 진행 했던 코드들임.
- new AnnotationConfigApplicationContext(AppConfig.class)
- AnnotationConfigApplicationContext클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다.
XML 설정 사용
- 최근 스프링 부트를 많이 사용하며 XML기반 설정은 잘 사용하지 않음.
- 하지만 많은 Legacy들이 존재하고, XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장점이 존재하기 때문에 알아두면 좋다.
- GenericXmlApplicationContext를 사용하면서 xml 설정 파일을 넘기면 된다.
package hello.core.xml;
import hello.core.member.MemberService;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class XmlAppContext {
@Test
void xmlAppContext() {
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService", MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
}
}
<?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
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemoryMemberRepository memberRepository() {
return new 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" />
<!--
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
-->
</beans>
- xml 기반의 코드들의 주석을 보면 자바로된 AppConfig와 비슷하다는 것을 알 수 있다.
출처 : 인프런 김영한 지식공유자님의 스프링 완전 정복 로드맵 강의
728x90
'BE > Spring' 카테고리의 다른 글
Spring - 싱글톤 컨테이너(웹 애플리케이션과 싱글톤, 싱글톤 패턴) (0) | 2022.06.07 |
---|---|
Spring - 스프링 컨테이너와 빈 - 5(스프링 빈 설정 메타 정보 - BeanDefinition) (0) | 2022.06.06 |
Spring - 스프링 컨테이너와 빈 - 3(스프링 빈 조회 - 상속관계) (0) | 2022.06.06 |
Spring - 스프링 컨테이너와 빈 - 2(스프링 빈 조회 기본, 동일한 타입 둘 이상) (0) | 2022.06.06 |
Spring - 스프링 컨테이너와 빈 - 1(스프링 컨테이너 생성, 컨테이너에 등록된 빈 조회) (0) | 2022.06.05 |
Comments