Spring Framework

스프링(2) - 빈 빌더

다미르 2019. 3. 22. 11:37

스프링(2) - 빈 빌더


빈 Def 객체가 어떤 구조로 구성되어있는지 봤으니.. 실제로 어떻게 생성되는지 봐야지

빈 생성은 구조를 살펴보니 Factory 패턴이 많다. 

팩토리 패턴은 따로 정리하고, 여기서는 빈 def 빌더에 대해서 정리해보자.


 

빈 생성 과정을 대략적으로 상상해보자.

xml 설정 파일 parsing > 빈 def 객체 생성 > factory가 빈 def 설정을 읽어서 빈 객체 생성.

 

스프링 처음 배울 때 sqlSession, 즉 myBatis가 이렇게 생성되는 것을 보고 많이 의아했다.

 

일반적인 myBatis 설정 방식은

1. xml에 DataSource 설정

2. DataSource 참조하여 SqlSessionFactoryBean 생성

3. SqlSessionFactory 참조하여 SqlSessionTemplate 생성


결국 최종적으로 사용하는 것은 Template 객체인데 저기서 new()를 안하고

뭣하러 def 객체 만들고, factory 만들어서 Template를 생성하는지 이해를 못 했다.

지금은 조금 알 것 같다.

 

JDBC 연동을 위해서는 db, driver, url, id, pw 등의 정보가 필요하고

이것의 case는 굉장히 많다.

하지만 한 번 connection이 생성되고 나면, 

그 후의 작업 가령 query를 보내고 결과값을 받아오는 작업은 db와 상관없이 동일하다.

 

그러기에 마이바티스의 Template 객체는 db에 연결하는 작업을 Factory에 위임하고,

어느 db에 연결되었는가는 상관없이 작업을 하려는 의도겠지.

 

본론으로 돌아와서 빈 빌더는 팩토리 패턴과 빌더 패턴의 결합이다.

지난 시간에 살펴본 3가지의 빈 def 객체(RootBeanDefinition, GenericBeanDefinition, ChildBeanDefinition)는

다른 곳에서 호출될 때 각각 new()로 인스턴스 되지 않고, 빌더를 통해서 생성된다.

 

 

예를 들어 다른 모듈에서 GenericBeanDefinition 객체를 생성할 경우

new GenericBeanDefinition() 이런식으로 인스턴스를 하지 않는다.

BeanDefinitionBuilder.genericBeanDefinition() 이런 식으로 인스턴스하여 빌더 객체를 통해서 속성값을 핸들링한다.

 

 

BeanDefinitionBuilder 객체를 자세히보자.

먼저 빈 def를 생성할 수 있는 팩토리 static method가 존재한다.그 아래에 빌더패턴을 적용한 setter들을 볼 수 있다.

왜 이런 builder를 제공할까..

개인적인 생각이지만 빈 def의 종류 및 다양한 속성을 빌더라는 하나의 객체를 통해서 생성하는

Wrapper 클래스의 성격이 강한 것 같다.