Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

일상기록

BeanFactory와 ApplicationContext 본문

Spring

BeanFactory와 ApplicationContext

너 구 나 2023. 4. 9. 17:33

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스다.
  • 스프링 빈을 관리하고 조회하는 역할을 담당한다.
  • getBean() 을 제공한다.

ApplicationContext

  • BeanFactory 기능을 모두 상속받아서 제공한다.
  • 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까?
  • 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다.

ApplicationContext가 제공하는 기능

메시지소스를 활용한 국제화 기능

예를 들어서 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력

환경변수

로컬, 개발, 운영등을 구분해서 처리

애플리케이션 이벤트

이벤트를 발행하고 구독하는 모델을 편리하게 지원

편리한 리소스 조회

파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회

 

정리

ApplicationContext는 BeanFactory의 기능을 상속받는다.
ApplicationContext는 빈 관리기능 + 편리한 부가 기능을 제공한다.
BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다.
BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다.

다양한 설정 형식 지원 - 자바 코드, XML

ApplicationContext의 구현체를 다양하게 지원한다 그중 가장 많이 사용한느것이 AnnotationConfigApplicationContext이다.

 

애노테이션 기반 자바 코드 설정 사용

  • 기존에 사용해 온 방식의 설정
  • new AnnotationConfigApplicationContext(AppConfig.class)
  • AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다.

XML 설정 방식

  • 최근 스프링 부트를 많이 사용하면서 모습을 감추었다. 예전의 레거시 프로젝트에서 볼 수 있다.
  • XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장점도 있으므로 한번쯤 배워두는 것도 괜찮다.
  • GenericXmlApplicationContext 를 사용하면서 xml 설정 파일을 넘기면 된다.

 

xml 기반의 appConfig.xml 스프링 설정 정보와 자바 코드로 된 AppConfig.java 설정 정보를 비교해보면 거의 비슷하다는 것을 알 수 있다.

xml 기반으로 설정하는 것은 최근에 잘 사용하지 않으므로 이정도로 마무리 하고, 필요하면 스프링 공식 레퍼런스 문서를 확인하자.

/src/main/resources/appConfig.xml 

경로에 appConfig.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>
<!--    id(빈이름) -->
    <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>
@Test
void xmlAppContext() {
    ApplicationContext ac = new
            GenericXmlApplicationContext("appConfig.xml");
    MemberService memberService = ac.getBean("memberService",
            MemberService.class);
    assertThat(memberService).isInstanceOf(MemberService.class);
}

.xml로 빈 설정 가능

BeanFactory와 ApplicationContext의 빈 생성 시기 차이점

BeanFactory는 Bean을 미리 생성하지 않는다. 그러면 언제 생성되는가? getBean을 사용해서 호출된 시점에 빈을 생성한다.

ApplicationContext는 App을 실행할 떼 Context초기화시점이 있는데 이 시점에 모든 Singleton(싱글톤) 빈을 미리 다 생성하고, Application이 시작된 이후에는 빈이 이미 다 생성되어있기 때문에 빈을 지연없이 제공하고 받는다.

 

싱글톤 객체가 사라지는 시점은 Applicaton이 종료되는 시점이다.

@Configration이 싱글톤을 지원 한다.

 

References

Spring 입문 by 김영한

Spring Reference

'Spring' 카테고리의 다른 글

Singleton 사용시 주의점  (0) 2023.04.14
싱글톤 정리  (0) 2023.04.13
Bean 조회 관련  (0) 2023.04.09
Spring DI(Dependency Injection), loC(Inversion of Control)란  (0) 2023.04.09
새로운 변경사항 발생시 의존관계  (1) 2023.04.08