Framework & Platform/Spring

spring - AnnotationConfigApplicationContext getBean

linuxism 2013. 8. 5. 22:49


Spring에서 Bean의 생성과 Bean들의 관계설정 같은 제어를 담당하는 IoC 오브젝트를 BeanFactory라고 한다.
보통 BeanFactory를 확장한 ApplicationContext를 사용하는데 ApplicationContext는 IoC방식을 따라 만들어진 일종의 BeanFactory라고 생각하면 된다.

BeanFactory의 종류 중 하나 AnnotationConfigApplicationContext
@Configure Annotation을 이용한 Java Code를 설정정보로 사용하려면 AnnotationConfigApplicationContext 를 이용한다.

public class DaoFactory {

   public UserDAO userDAO() {

       return new UserDAO(connectionMaker());

   }

   public ConnectionMaker connectionMaker() {

       return new DConnectionMaker(); // DB 커넥션 오브젝트를 리턴해준다.

   }

}

위와 같은 Factory Class가 있다.
이 Class를 설정정보로 이용하려면 아래와 같은 규칙을 따르면 된다.
- Class 선언 위에 @Configuration 이라는 Annotation을 추가한다.
- 객체(Bean)를 생성해 주는 메소드에는 @Bean이라는 Annotation을 추가한다.

package applicationcontext.factory;


import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;


import applicationcontext.connectionmaker.ConnectionMaker;

import applicationcontext.connectionmaker.DConnectionMaker;

import applicationcontext.dao.UserDAO;


@Configuration

public class DaoFactory {

   @Bean

    public UserDAO userDAO() {

        return new UserDAO(connectionMaker()); // Bean 생성

    }

   @Bean

    public ConnectionMaker connectionMaker() {

        return new DConnectionMaker(); // Bean 생성

    }

}

 
이제 위 DaoFacory 클래스를 AnnotationConfigApplicationContext 클래스를 이용해 읽어들이고 UserDAO Bean을 가져오는 코드를 만들어 보겠다.

package applicationcontext.test;


import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;


import applicationcontext.dao.UserDAO;

import applicationcontext.factory.DaoFactory;


public class UserDAOTest {

    public static void main(String[] args) {

        ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);

        UserDAO dao = context.getBean("userDAO", UserDAO.class);

        System.out.println(dao.toString());

    }

}


=====> applicationcontext.dao.UserDAO@d08633 

 
context.getBean의 첫번째 파라미터 userDAO는 DaoFactory 클래스의 userDao라는 메소드의 이름이다. 
두번째 파라미터 UserDAO.class는 userDAO라는 메소드에서 리턴해주는 class 이다.

실행해보면 정상적으로 Bean을 가져오는 것을 확인해 볼 수 있다. 

스프링을 적용하긴 했지만 그냥 DaoFactory를 직접 사용한 것과 기능적으로 다를게 없다.
오히려 번거로운 준비작업과 코드가 필요하다.
그렇다면 굳이 스프링을 사용하지 않고 그냥 DaoFactory와 같은 오브젝트 팩토리를 만들어서 사용하면 되는게 아닐까?
(@Configure 없는 초기 버전의 Factory클래스 같은 클래스들을 오브젝트 팩토리라고 한다.)
스프링은 DaoFactory와 같은 오브젝트 팩토리만으로는 얻을 수 없는 많은 방법과 기능을 제공해 준다. 
앞으로 이러한 것에 대해 공부해 볼 것이다.



출처 - http://babtingdev.tistory.com/288