티스토리 뷰

반응형
  • 스프링의 핵심을 담당하는 건, 바로 빈 팩토리 또는 애플리케이션 컨텍스트라고 불리는 것이다.
  • 이 두 가지는 우리가 만든 DaoFactory가 하는 일을 좀 더 일반화한 것이라고 생각하면 된다.

 

오브젝트 팩토리를 이용한 스프링 IoC

애플리케이션 컨텍스트와 설정정보

  • 여기서는 우리가 만든 DaoFacotry를 스프링에서 사용 가능하도록 만들어 볼 것이다.
  • 스프링에서는 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 이라고 부른다.
  • 스프링 빈은 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 말이다.
  • 스프링에서 빈의 생성과 관게설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리 혹은 애플리케이션 컨텍스트라고 부른다.

 

  • 빈 팩토리와 애플리케이션 컨텍스트
    • 빈 팩토리 : 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춘 것이다.
    • 애플리케이션 컨텍스트 : 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진이라는 의미이다.
    • 빈 팩토리의 확장 버전을 애플리케이션 컨텍스트라고 보면 된다.

 

DaoFactory를 사용하는 애플리케이션 컨텍스트

DaoFactory를 스프링의 빈 팩토리가 사용할 수 있는 본격적인 설정정보로 만들어보자.

  1. 먼저 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식하기 위해 @Configuration을 추가한다.
  2. 그 후 오브젝트를 만들어 주는 메소드에는 @Bean을 붙여준다.
    • userDao() 메소드는 UserDao 타입 오브젝트를 생성하고 초기화해서 돌려주는 것이니 당연히 @Bean이 붙여진다.
    • 또한, ConnectionMaker 타입의 오브젝트를 생성해주는 connectionMaker() 메소드에도 @Bean을 붙여준다.
  3. 두 가지 애노테이션 만으로 스프링 프레임워크의 빈 팩토리 또는 애플리케이션 컨텍스트가 IoC 방식의 기능을 제공할 때 사용할 설정정보가 완성 된다.
//1, 2, 3
@Configuration
public class DaoFactory {

    @Bean
    public UserDao userDao() {
        //return new UserDao(new DConnectionMaker());
        return new UserDao(connectionMaker());
    }

        ...

    @Bean
    public ConnectionMaker connectionMaker() {
        return new DConnectionMaker();
    }
}

 

  1. 이제 DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트를 만들어보자
  2. 애플리케이션 컨텍스트는 ApplicationContext 타입의 오브젝트로서, ApplicationContext를 구현한 클래스는 여러가지가 존재하는데, 그 중 @Configuration이 붙은 설정정보로 사용하려면 AnnotationConfigApplicationContext를 이용하면 된다.
  3. 애플리케이션 컨텍스트를 만들 때 파라미터로 DaoFactory 클래스를 넣어주고, ApplicationContext의 getBean()을 통해 UserDao 오브젝트를 가져올 수 있다.
//4, 5, 6
public class UserDaoTest {
    public static void main(String [] args) throws ClassNotFoundException, SQLException {
        ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
        UserDao userDao = context.getBean("userDao", UserDao.class);
    }
}
  • getBean() 메소드는 ApplicationContext가 관리하는 오브젝트를 요청하는 메소드이다.
  • getBean()의 파라미터 중 "userDao"는 ApplicationContext에 등록된 빈의 이름이고, "userDao"는 DaoFactory 설정 정보에서 userDao() 메소드가 존재해야 하고, 해당 메소드에는 @Bean이라는 어노테이션이 붙여있어야 한다.
    • 여기서 userDao라는 이름의 빈을 가져온다는 것은 DaoFactory의 userDao()메소드를 호출하고 그 결과를 가져온다는 것이다.
  • getBean()은 기본적으로 Object 타입으로 리턴하게 되어 있어 매번 캐스팅을 해줘야하는 부담이 있다.

    • 자바 5 이상부터 제네릭 메소드 방식을 사용해서 getBean()의 두번째 파라미터에 리턴 타입을 주면, 지저분한 캐스팅 작업이 나타나지 않는다.
  • 스프링의 기능을 사용했으니, 필요한 라이브러리를 추가해줘야 한다.

    image

 

 

애플리케이션 컨텍스트의 동작박싱

  • 기존 오브젝트 팩토리(DaoFactory)에 대응되는 것이 바로 스프링의 애플리케이션 컨텍스트이다.

  • 스프링에서는 이 애플리케이션 컨텍스트를 IoC 컨테이너 혹은 스프링 컨테이너, 빈 팩토리라고 부른다.

  • DaoFactory는 UserDao를 비롯한 DAO 오브젝트를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적인 역할을 하는 것에 반해, 애플리케이션 컨텍스트에서는 모든 오브젝트에 대한 생성과 관계설정을 담당한다.

    • 애플리케이션 컨텍스트에는 DaoFactory와 달리 직접 오브젝트를 생성하고 관계를 맺어주는 코드가 없고, 이런 생성정보와 연관관계 정보를 별도의 설정정보를 통해 얻는다.
    • @Configuration이 붙은 DaoFactory는 이 애플리케이션 컨텍스트가 활용하는 IoC설정정보이다.
    • 애플리케이션 컨텍스트가 DaoFactory의 userDao() 메소드를 호출해서 오브젝트를 가져온 것을 클라이언트가 getBean()을 요청할 때 전달해주는 것이다.

 

  • 애플리케이션 컨텍스트가 동작하는 방식을 살펴보자

    image

 

 

DaoFactory를 그대로 사용하는 대신, 애플리케이션 컨텍스트를 사용하는 이유

  • DaoFactory와 같은 오브젝트 팩토리에서 사용했던 IoC 원리를 그대로 적용하는 데도 불구하고 애플리케이션 컨텍스트를 사용하는 이유는 다음과 같다.
  1. 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
    • 여러 오브젝트가 추가되고 클라이언트가 필요한 오브젝트를 가져오려면 어떤 팩토리 클래스를 사용해야할 지 알아야하고, 필요할때 마다 펙토리 오브젝트를 생성해야 하는 번거로움이 있다.
    • 애플리케이션 컨텍스트를 사용하면 오브젝트 팩토리가 아무리 많아져도 이를 알아야하거나 직접 사용할 필요가 없다.
  2. 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.
    • 애플리케이션 컨텍스트의 역할은 단지 오브젝트 생성과 다른 오브젝트와의 관계설정만이 전부가 아니다.
    • 오브젝트가 만들어지는 방식, 자동생성, 오브젝트에 대한 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉팅 등 오브젝트를 활용할 수 있는 다양한 기능을 제공한다.
  3. 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
    • 애플리케이션 컨텍스트의 getBean() 메소드는 빈의 이름을 이용해 빈을 찾아준다.
    • 타입 만으로 빈을 검색하거나 특별한 애노테이션 설정이 되어 있는 빈을 찾을 수도 있다.

 

 

스프링 IoC의 용어 정리

Bean

  • 빈 또는 빈 오브젝트는 스프링이 IoC 방식으로 관리하는 오브젝트라는 뜻이다.
  • 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만 빈으로 선정된다.

 

Bean Factory

  • 스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다.
  • 빈을 등록, 생성, 조회, 반환 및 그 외 빈을 관리하는 기능을 담당한다.
  • 보통은 이 빈 팩토리를 바로 사용하지 않고, 이를 확장한 애플리케이션 컨텍스트를 이용한다.

 

애플리케이션 컨테스트

  • 빈 팩토리를 확장한 IoC 컨테이너이다.
  • 빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일하고, 스프링이 제공하는 각종 부가 서비스를 추가로 제공한 것이다.
  • 빈 팩토리와 애플리케이션 컨텍스트의 차이
    • 빈 팩토리라 부를 땐 주로 빈의 생성과 제어의 관점에서 이야기 하는 것
    • 애플리케이션 컨텍스트라고 할 때는 빈 팩토리 기능을 추가로 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함해서 이야기 하는 것
  • 스프링에서 ApplicationContext라고 적을 시 애플리케이션 컨텍스트가 구현해야하는 기본 인터페이스를 가리키는 것이기도 하다
    • AppilcationContext는 BeanFactory를 상속한다.

 

설정정보/ 설정 메타정보

  • 스프링의 설정정보(Configuration)란 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다.
  • 스프링의 설정정보는 컨테이너에 어떤 기능을 세팅하거나 조정하는 경우에도 사용하지만, 그 보다는 IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할 때 사용된다.

 

컨테이너 또는 IoC 컨테이너

  • IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라고도 한다.
    • IoC 방식 : 오브젝트의 생성, 관계설정, 사용의 다른 이에게(빈 팩토리) 넘겨주는 방식
  • IoC 컨테이너는 주로 빈 팩토리의 관점에서 이야기 하는 것이고, 컨테이너는 주로 애플리케이션 컨텍스트 관점에서 이야기 한 것으로 보면 된다.

 

스프링 프레임워크

  • 스프링 프레임워크는 IoC 컨테이너, 애플리케이션 컨텍스트를 포함해서 스프링이 제공하는 모든 기능을 통틀어 말할 때 사용한다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함