BeanFactory와 ApplicationContext의 차이점

ILLION·2023년 3월 10일
0

Spring Framework

목록 보기
3/5
post-thumbnail

이번 글을 이해하기 위해선 스프링 빈(Bean)의 대한 기초적인 지식이 필요합니다.
모르고계시면 빈(Bean)에 대해서 검색하시거나 이걸 참고하시면 될거같습니다.

먼저 둘이 어떤 공통점이 있는지 말씀드리겠습니다.

1. BeanFactory와 ApplicationContext의 공통점

1. 빈(Bean)을 생성하고 관리하는 기능을 제공.

Spring Framework에서 빈(Bean)은 애플리케이션에서 사용되는 객체를 말합니다.빈(Bean)을 생성하고 관리하는 기능은 객체를 생성하고 필요한 시점에 사용 가능한 상태로 만들어주며, 빈(Bean)의 종속성을 해결해주는 등의 역할을 수행합니다.

2. 빈(Bean)의 라이프사이클(생명주기)을 관리하는 기능을 제공.

빈(Bean)의 라이프사이클을 관리하는 기능을 제공합니다. 빈(Bean)의 라이프사이클은 생성, 초기화, 소멸 등의 단계를 말하며, 이러한 단계에서 빈(Bean)을 초기화하거나 소멸시키는 작업을 수행합니다.

3. 빈(Bean) 스코프를 관리.

BeanFactory와 ApplicationContext는 빈(Bean)의 스코프를 관리합니다. 스코프는 빈(Bean)의 생명주기와 관련되며, 빈(Bean)이 생성되고 소멸되는 시점을 결정합니다. 스프링 프레임워크에서는 다양한 스코프를 지원합니다.

4. 의존성 주입(Dependency Injection)을 지원.

BeanFactory와 ApplicationContext는 의존성 주입(Dependency Injection)을 지원합니다. 의존성 주입은 객체 간의 의존성을 외부에서 설정해주는 것을 말합니다. 이를 통해 빈(Bean)들 간의 의존성을 해결하고 객체 간의 결합도를 낮출 수 있습니다.

2. BeanFactory와 ApplicationContext의 차이점

둘은 많은 차이점이 존재하지만 개인적으로 더 중요한 차이점만 말씀드리겠습니다.

  1. 로딩 방식
    BeanFactory : Lazy Loading 방식으로 Bean을 로딩.
    즉, 실제로 필요한 Bean이 요청되기 전까지 Bean을 로딩하지 않음.
    ApplicationContext : Eager Loading 방식으로 Bean을 로딩.
    즉, ApplicationContext가 생성될 때 모든 Bean이 미리 로딩되어 메모리에 적재됨.

xml파일을 이용해 빈 객체를 로드하는 방식

// BeanFactory를 사용하는 코드
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("application-context.xml"));
MyBean bean = factory.getBean(MyBean.class); // MyBean 객체는 실제로 사용되는 시점에 생성.

// ApplicationContext를 사용하는 코드
ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
MyBean bean = context.getBean(MyBean.class); // MyBean 객체는 컨테이너 초기화 시점에 생성.

BeanFactory를 사용하는 경우에는 getBean() 메소드가 호출될 때마다 빈 객체가 생성되며, ApplicationContext를 사용하는 경우에는 컨테이너가 초기화될 때 모든 빈 객체가 생성됩니다.


자바 클래스 파일로 빈 객체를 로드하는 방식

TestService클래스

public class TestService {

    private static boolean isLoaded;

    public TestService() {
        isLoaded = true;
    }

    public static boolean isIsLoaded() {
        return isLoaded;
    }
}
@Test
    void beanFactoryTest() { // Lazy Loading방식
        GenericApplicationContext context = new GenericApplicationContext(); //스프링 컨테이너 생성
        context.refresh();

        context.registerBean("testService", TestService.class);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println("beanDefinitionName = " + beanDefinitionName);
            BeanDefinition beanDefinition = context.getBeanDefinition(beanDefinitionName);
            System.out.println("bb = " + beanDefinition);
        }
        Assertions.assertFalse(TestService.isIsLoaded());

        TestService testService = (TestService) context.getBean("testService"); // 최초로 빈 요청 시점에 빈 생성
        Assertions.assertTrue(TestService.isIsLoaded());
        }
       
// ------------------------------------------------------------------------------
	void AppicationContextTest() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(config.class); // 스프링 컨테이너 생성
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
            System.out.println(beanDefinition);
        }
        System.out.println();
        TestService testService = ac.getBean("testService", TestService.class);
        Assertions.assertTrue(TestService.isIsLoaded());
        }
  1. Bean 스코프 : 빈의 생성과 사용 범위
    BeanFactory : Singleton과 Prototype 스코프를 지원
    Singleton 스코프는 하나의 빈 인스턴스만 생성하고 DI(의존성 주입)할 때마다 같은 인스턴스를 반환합니다. Prototype 스코프는 빈(Bean) 인스턴스를 요청할 때마다 새로운 인스턴스를 생성합니다.
    BeanFactory에서는 기본적으로 싱글톤(Singleton) 스코프를 사용.
    ApplicationContext : BeanFactory와 마찬가지로 Singleton과 Prototype 스코프를 지원.
    이외에 Request, Session, GlobalSession, Application 등 다양한 스코프를 지원합니다.
    Request 스코프는 HTTP 요청마다 새로운 인스턴스를 생성.
    Session 스코프는 HTTP 세션마다 새로운 인스턴스를 생성.
    GlobalSession 스코프는 포털 애플리케이션의 전역 세션마다 새로운 인스턴스를 생성.
    Application 스코프는 애플리케이션 전체에서 하나의 인스턴스만 생성

3. 정리

  1. 기본적으로 스프링 프레임워크의 빈은 싱글톤(Singleton) 스코프로 생성

  2. 빈의 로딩 방식 중 Lazy loading방식은 빈 객체를 처음 사용할 때까지 생성을 미루는 방식으로 최초 요청 시 한번만 초기화되고 이후 요청에서는 기존에 생성된 객체를 반환

  3. eager loading방식은 애플리케이션 시작 시점에 모두 생성되는 방식으로 스프링 애플리케이션이 생성될 때 자동으로 컨테이너를 생성하는데 그 시점에 등록된 빈들을 생성함으로써 빈 요청이 있을 때 초기화 작업없이 바로 사용 가능

profile
결과를 중요시하기보단 과정을 중요하게 생각하는 마음가짐

0개의 댓글