Home BeanFactory vs ApplicationContext 차이점
Post
Cancel

BeanFactory vs ApplicationContext 차이점


간단한 실습을 통해 그 차이점을 확인할 수 있습니다.

applicationContext.xml에서 IPhone과 GalaxyPhon을 만들고

id는 겹치지 않도록 설정한 뒤 PhoneUser로 가서 ‘gphone’을 lookup 해봅시다.

  • applicationContext.xml
1
2
3
4
5
6
7
8
9
<?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 class="coupling.IPhone" id="phone"/>
	<bean class="coupling.GalaxyPhone" id="gphone"/>

</beans>
  • PhoneUser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package coupling;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class PhoneUser {
	public static void main(String[] args) {
		AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
		
		Phone phone = (Phone)factory.getBean("gphone");//gphone lookup
		
		phone.powerOn();
		phone.volumeUp();
	
		factory.close();
	}
}
  • 실행결과
1
2
3
아이폰 생성됨
갤럭시 전원 ON
갤럭시 소리 ++

실행결과를 보면 GalaxyPhone을 요청했는데도 ‘아이폰 생성됨’이 출력된 것을 확인할 수 있습니다.

BeanFactory와 ApplicationContext의 차이점을 확실히 보여주는 결과입니다.

BeanFactory


BeanFacotory는 컨테이너가 실행될 때 바로 객체가 생성되는 것이 아닙니다.

클라이언트가 객체를 요청했을 때 그때 객체를 생성합니다.

컨테이너 동작과 객체를 만드는 행위를 완전 다른 행위라고 보는 겁니다.

장점은 메모리 낭비를 하지 않을 수 있지만

단점은 사용자가 해당 스탭 때 필요한 객체들을 전부 알고 있어야 한다는 것입니다.

BeanFactory처럼 클라이언트가 객체를 요청했을 때 생성하는 것을 ‘지연로딩’이라고 합니다.

그리고 별도의 추가기능을 지원하지 않고 개발자가 만든대로 딱 객체를 지급하는 용도 정도로만 쓰입니다.

BeanFactory는 메모리를 아낄 수 있는 장점이 있지만, 그 장점을 applicationContext에서 각종 설정으로 충분히 해결할 수 있습니다.

때문에 일반적으로 많이 쓰이진 않지만 필요한 부분에서 필요한 만큼 쓰이기도 합니다.

ApplicationContext


ApplicationContext를 구현한 클래스들 중 GenericXmlApplicationContext를 선택해서 썼는데, 뭔가를 상속받았기 때문에 기능들이 다 갖춰져 있을 거라는 것을 예상할 수 있습니다.

그래서 개발자가 필요한 언어처리, 트랜잭션 등 다양한 기능을 지원해줍니다.

ApplicationContext는 실습에서 볼 수 있었던 것처럼 <bean>으로 등록한 모든 객체를 미리 생성해놓고 골라서 씁니다. 이런 것을 ‘즉시로딩’이라고 합니다.

장점은 객체를 미리 다 생성해두기 때문에 사용자가 어떤게 필요한지 고르지 않아도 됩니다.

단점은 한번 쓰거나, 안 쓰는 것들도 다 로드하기 때문에 메모리가 낭비되는 경향이 있습니다. 하지만 이런 단점들도 설정으로 충분히 해결할 수 있기 때문에 BeanFactory보다 많이 사용되고 있습니다.

스프링 공식 문서를 찾아보니 두 컨테이너 중 특별한 이유가 없다면 ApplicationContext를 사용해야 한다고 나와있습니다.

이유는 BeanFactory를 상속받았기 때문에 BeanFactory의 모든 기능을 포함하는 것은 물론이고 추가 기능들을 제공하기 때문입니다.

This post is licensed under CC BY 4.0 by the author.