Spring/스프링 핵심 원리 - 기본편

[스프링 핵심 원리] 04. 스프링 컨테이너와 스프링 빈 - BeanFactory와 ApplicationContext & 다양한 설정 형식 지원(자바 코드, XML)

HSY_mumu 2022. 5. 16. 23:49
728x90

(인프런) 김영한님의 스프링 핵심 원리-기본편을 공부하고 리뷰한 글입니다.

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를 사용한다.

- BeanFactoryApplicationContext스프링 컨테이너라 한다.

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>
728x90