오봉이와 함께하는 개발 블로그

Spring - 스프링 컨테이너와 빈 - 4(BeanFactory와 ApplicationContext, XML 기반 appConfig) 본문

BE/Spring

Spring - 스프링 컨테이너와 빈 - 4(BeanFactory와 ApplicationContext, XML 기반 appConfig)

오봉봉이 2022. 6. 6. 18:04
728x90

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
Comments