스프링 의존성 주입 (Dependency Injection)



의존성 주입 (Dependency Injection)

IoC 컨테이너가 BeanDefinition(xml, annotation 으로 명시된)정보를 바탕으로
클래스간 ‘의존관계를 자동으로 연결(=주입)’ 하는 것.

  • 객체 레퍼런스를 IoC 컨테이너로 부터 주입 받아서, 실행 시에 ‘동적으로 의존관계’ 가 생성.
  • 코드가 단순해지고, 컴포넌트간 결합도가 낮아짐.

여기서 의존 관계란 ? [ 스프링 의존 관계 (Dependency) ]


주입 유형

  1. 메서드를 통한 주입
    • 의존성을 입력 받는 일반 메서드를 통해 의존성을 주입 받음.
  2. setter를 통한 주입
    • 의존성을 입력 받는 setter 메서드를 통해 의존성을 주입 받음.
  3. 생성자를 통한 주입
    • 의존성을 포함하는 클래스 생성자를 통해 의존성을 주입 받음.


Bean Factory
Spring DI 컨테이너가 관리하는 객체를 빈(Bean)이라 하며, 이 빈을 관리한다는 의미로 해당 컨테이너를 빈 팩토리(Bean Factory)라 부른다.

  • 객체의 생성, 객체 사이의 런타임 관계를 DI 관점에서 볼 때는 컨테이너를 Bean Factory라 한다.
  • Bean Factory에 여러 컨테이너 기능을 추가하여 ApplicationContext 라고 부른다.
    • Bean Factory
      • 빈 등록, 생성, 조회, 반환을 관리
      • getBean() 메서드 정의되어 있음
      • 보통 확장된 ApplicationContext으로 사용
    • ApplicationContext
      • 빈 팩토리 기능을 이어받아 사용
      • 스프링이 제공하는 ApplicationContext 구현 클래스가 여러가지 있음
      • StaticApplicationContext, GenericXmlApplicationContext, WebApplicationContext 등…

애플리케이션 컨텍스트는 BeanDefinition으로 만들어진 메타정보를 담은 오브젝트를 사용해 IoC와 DI 작업을 수행한다.

그림 1


BeanDefinition 인터페이스 정의
IoC 컨테이너가 사용하는 빈 메타정보는 대략 다음과 같다.

  • 빈아이디, 이름, 별칭 : 빈오브젝트를 구분 할 수 있는 식별자
  • 클래스 또는 클래스 이름 : 빈으로 만들 POJO 클래스 또는 서비스 클래스 정보
  • 스코프 : 싱글톤, 프로토타입과 같은 빈의 생성 방식과 존재 범위
  • 프로퍼티 값 또는 참조 : DI에 사용할 프로퍼티 이름과 값 또는 참조하는 빈의 이름
  • 생성자 파라미터 값 또는 참조 : DI에 사용할 생성자 파라미터 이름과 값 또는 참조할 빈의 이름
  • 지연된 로딩 여부, 우선 빈 여부, 자동와이어링 여부, 부모 빈 정보, 빈팩토리 이름

빈은 오브젝트 단위로 등록되고 만들어지기 때문에 같은 클래스 타입이더라도 하나 이상의 빈으로 등록할 수 있다.