Develop/Spring framework

[Spring] ApplicationContext Code

자라선 2020. 7. 31. 11:01

1. ApplicationContext 란

스프링의 IoC Contaner 라고도 하며, bean를 관리해주는 설정정보이다.

2. @Configuration, @Bean

bean을 등록하기 위해서는 해당 클래스를 @Configuraion 어노테이션으로 감싸주고

객체 생성과 반환 기능의 메소드들은 @Bean 으로 정의해준다.

@Configuration
public class DaoFactory {
	
	@Bean
	public ConnectionMaker connectionMaker() {
		return new DConnectionMaker();
	}
	
	@Bean
	public UserDao userDao(){
		ConnectionMaker a = connectionMaker();
		return new UserDao(a);
	}
}
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao userdao = context.getBean("userDao", UserDao.class);

그리고 해당 bean을 호출시 ApplicationContext 인터페이스를 타입으로 받아 객체를 생성해주고

.getBean("메소드명", 반환타입) 으로 객체를 받는다.

그러면 IoC가 적용되어 클라이언트 입장에선 구체적인 코드를 알 필요가 없어지며

생성, 반환 모두 Application이 처리해주는것을 알수 있다.

 

3. SingleTon Registry

ApplicationContext로 설정정보에 등록하여 bean으로 받아와

호출하게 되면 몇번을 호출하던 동일한 인스턴스 객체로 반환된다.

System.out.println(context.getBean("userDao", UserDao.class).hashCode()); //1136497418
System.out.println(context.getBean("userDao", UserDao.class).hashCode()); //1136497418

싱글톤 패턴으로 구현된 것으로 알수 있는데.

스프링은 태생 당시 대규모 엔터프라이즈 서버 프로젝트 기준으로 개발되어있기 때문에

무수히 많은 처리를 감당해야만 했다. 그렇게 때문에 new로 인한 수많은 인스턴스를 서버가 감당할수가 없어

싱글톤으로 개발되었다고 한다.

스프링 컨테이너를 이러한 싱글톤을 관리해주는 SingleTon Registry가 존재한다.

스프링이 아닌 다른 싱글톤 패턴을 적용해야 할때는 private를 사용하여 외부의 접근을 최소화 하다는 단점이 있었는데, SingleTon Registry가 @Configuration과 @Bean을 정의한 객체을 싱글톤으로 생성해줘 별도의 new 인스턴스를 만들수 있다는 장점이 있다.

이러한 SingleTon Registry만 봐도 알듯이 우리는 어떠한 기능이 담겨져 있는지는 모르지만 application에서 알아서 처리해주며 반환해준다. 이것만 봐도 IoC의 개념이 약간 이해가 될것 같다.