728x90
728x90

3. IoC 컨테이너 분류체계

DL(Dependency Lookup)

모든 IoC 컨테이너는 각 컨테이너에서 관리해야 하는 객체들을 관리하기 위한 별도의 저장소를 가진다.

Bean에 접근하기 위하여 컨테이너에서 제공하는 API를 이용하여 사용하고자 하는 Bean을 Lookup 하는 것으로 컨테이너 API와 의존관계를 많이 가지면 가질수록 어플리케이션 컨테이너에 종속되는 단점이 있다.

 

DI(Dependency Injection)

DI는 Spring에서 새롭게 지원하는 IOC의 한 형태이다.각 계층 사이, 각 class 사이에 필요로 하는 의존관계가 있다면 이를 컨테이너가 자동 적으로 연결시켜 주는 것으로 각 class 사이의 의존관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해 주는 것이다.

 

  - Setter Injection : class 사이의 의존관계를 연결시키기 위해 setter 메소드를 이용하는 방법.
  - Constructor Injection : class 사이의 의존관계를 연결시키기 위해 생성자를 이용하는 방법.
  - Method Injection : Method Injection은 Setter Injection과 Constructor Injection이 가지고 있는 한계점을

    극복하기 위하여 Spring 프레임워크 1.1 버전에서 새롭게 지원하고 있는 DI의 한 종류이다. 

4. 의존성 풀(Dependency Pull)

IoC 타입중 가장 익숙한 타입으로 필요할 때 마다 레지스트리에서 의존성을 가지고 온다. 

EJB의 경우 JNDI API를 통해 EJB 컴포넌트를 룩업 한다.

5. 컨텍스트화된 의존성 룩업(Contextualized Dependency Lookup)

레지스트리가 아니라 리소스를 관리하는 컨테이너를 대상으로 룩업을 수행하며 보통 정해진 시점에 룩업이 수행된다.

컨테이너는 내부 WAS(톰캣, JBOSS등)나 스프링프레임워크에서 제공한다.

6. Injection vs Lookup

어떤 IoC 방식을 사용할지는 별로 어렵지 않다. 스프링의 경우 초기 빈 Lookup을 제외하면 의존성이 항상 Injection 형태의 IoC를 사용하게 된다. 대부분의 환경에서 DI를 사용해서 모든 객체를 연결할 수는 없으며 초기 컴포넌트에 접근 시 DL을 사용해야 하는 경우가 많다.

 

예를 들어 일반 자바APP에서는 main에서 스프링 컨테이너를 부트스트랩하고 ApplicationContext 인터페이스를 통해 의존객체를 가져와야 한다. 즉 스프링에서는 DI를 사용할 수 있으면 사용하고 그렇지 못한 경우라면 DL을 사용하면 된다.

 

의존성 풀 방식의 코드는 레지스트리에 대한 참조를 가지고 있어야 하고 레지스트리와 연동해서 의존성 객체를 가지고 와야 한다. 또한 CDL을 사용시 특정 인터페이스를 구현해야 하고 모든 의존성을 직접 가지고 와야 한다.

 

하지만 의존성 주입(Dependency Injection)을 사용하면 적절한 생성자, 메소드, 세터 등을 통해 의존성을 주입 받기만하면 된다.

7. Spring을 통한 의존성 주입

BeanFactory

- 스프링의 의존성 주입의 핵심 인터페이스
- Bean의 생성과 소멸 담당(의존성과 생명주기 및 관리 담당)
- 객체를 관리하는 고급 설정 기법 제공
- DI 지원 기능만 필요하다면 BeanFactory 인터페이스를 이용해 스프링 DI 컨테이너와 직접 연동할 수 있다. 이 경우 애플리케이션은 BeanFactory 인터페이스를 구현한 클래스의 인터페이스를 생성하고 이 인스턴스에 빈과 의존성 설정 정보를 저장해야 한다.
- BeanFactory를 프로그래밍적으로 설정할 수도 있지만 대부분 설정 파일을 통해 외부에서 설정하는 방식을 사용한다. 
- 스프링에서 기본적으로 제공하는 두개의 메인 BeanFactory는 BeanDefinitionRegistry를 구현하고 있다.
- PropertiesBeanDefinitionReader는 프로퍼티 파일에서 Bean정의를 읽고 XmlBeanDefinition Reader는 XML 파일에서 Bean정의를 읽는다.

 

ApplicationContext

BeanFactory의 모든 기능 제공(BeanFactory 인터페이스를 상속)
권장하는 방식으로 스프링 DI 뿐 아니라 트랜잭션, AOP 서비스, 국제화를 위한 메시지소스, 애플리케이션 이벤트 처리 Spring Framework2.5 이상부터 ApplicationContext 설정시 자바 애노테이션을 지원


XML ? Annotation 방식
  - XML 설정 방식을 쓰면 모든 설정을 자바코드로 부터 외부 XML에 둠
  - 애노테이션 방식의 경우 자바코드 내에서 DI 설정을 정의
  - 둘 동시에 사용되는 경우 XML 설정이 우선
  - 주로 데이터소스, 트랜잭션매니저, JMX, JMS커넥션팩터리등 애플리케이션
    인프라스트럭처에는 XML 파일에 저장하고 DI 설정은 애노테이션에서 정의.


Context 시작 시 모든 Singleton Bean을 미리 로딩(preloading) 시킴-> 초기에 설정 및 환경에 대한 에러 발견 가능함
다수의 ApplicationContext 구현 클래스 제공, 다양한 Resource 로딩 방법 제공
(XmlWebApplicationContext,FileSystemXmlApplicationContext,ClassPathXmlApplicatio
nContext)


org.springframework.context
Spring의 AOP기능, 메시지 자원 핸들링, 이벤트 위임, 웹 어플리케이션에서 사용하기 위한  WebApplicationContext와 같은 특정 어플리케이션 컨텍스트를 이용한 통합과 같은 다른 기능을 추가 제공한다

 

ApplicationContext(어노테이션 기반 스프링 설정 XML 파일)

- beans를 기본 네임스페이스로 설정
- context 네임스페이스 : ApplicationContext 설정지원
- p 네임스페이스 : 세터주입을 쉽게 하기 위한 DI설정 제공
- c 네임스페이스 : 생성자주입을 쉽게 하기 위한 DI설정 제공
- util 네임스페이스 : DI설정에 유용한 유틸리티 제공

 

728x90
300x250