[SPRING]DI

Date:     Updated:

카테고리:

태그:

[16] DI

16.1. 용어

16.1.1. DI(Dependency Injection), IoC(Inversion of Control)

  • DI
    • 의존관계주입을 말함.
    • 의존관계는 정적인 클래스의 의존 관계와 실행시점에 결정되는 동적인 객체(인스턴스)의 의존 관계를 분리
  • IoC
    • AppConfig처럼 객체를 생성하고, 관리하면서 의존관계를 연결해 주는 것을 IoC 컨테이너 또는 DI 컨테이너라고 함
    • 의존관계 주입에 초점을 맞추어 최근에는 주로 DI 컨테이너라 한다 또는 어샘블러, 오브젝트 팩토리 등으로 불리기도 함

16.1.2. Bean

  • Java Programming에서는 Class를 생성하고 new를 입력하여 원하는 객체를 직접 생성한 후에 사용하지만, Spring에서는 직접 new를 입력하여 생성한 객체가 아니라, Spring에 의하여 관리당하는 자바 객체를 사용한다. 이렇게 Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 합니다.
  • Spring Bean을 얻기 위하여 ApplicationContext.getBean()과 같은 메서드를 사용하여 Spring에서 직접 자바 객체를 얻어서 사용함.

16.2. 용어

  • DI (Dependency Injection), IoC(Inversion of Control)
    • 스프링이 바닥판처럼 깔려있고, 우리는 그 위에서 멋진 조립(애플리케이션)을 만들면 됨.
  • Bean
    • javaBean
      • 데이터를 저장하기 위한 구조체로 자바 빈 규약이라는 것을 따르는 구조체
      • private 프로퍼티와 getter/setter로만 데이터를 접근함
      • 인수(argument)가 없는 기본 생성자가 있음.
    • 스프링에서의 Bean
      • 스프링 IoC 컨테이너에 의해 생성되고 관리되는 객체
      • 자바에서처럼 new Object()로 생성하지 않음
      • 각각의 Bean들끼리는 서로를 의존(사용)할수 있음
  • 스프링 컨테이너 개요
    • ApplicationContext 인터페이스를 통해 제공되는 스프링 컨테이너는 Bean 객체의 생성 및 Bean들의 조립(상호 의존성 관리)을 담당함
    • Bean의 등록
      • 과거에는 xml로 설정을 따로 관리하여 등록(불편)
      • 현재는 annotation 기반으로 Bean 등록
        • @Bean, @Controller, @Service
    • Bean 등록시 정보
      • Class 경로
      • Bean의 이름
        • 기본적으로 원Class 이름에서 첫문자만 소문자로 변경
        • 원하는 경우 변경 가능
      • Scope (Bean을 생성하는 규칙)
        • singleton : 컨테이너에 단일로 생성
        • prototype : 작업시마다 Bean을 새로 생성하고 싶을 경우
        • request : http요청마다 새롭게 Bean을 생성하고 싶은 경우
  • POJO (Plain Old Java Object)
    • 객체지향 원리에 충실하면서, 특정 환경이나 규약에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 객체.

16.3. 스프링 IoC 컨테이너(Spring IoC Container) & 빈(Beans)

  • 컨테이너는 제어의 역전(IoC) 원리가 적용된 스프링 핵심 컴포넌트임.
  • 컨테이너에 의해 생성 및 조립된 후 관리(초기화, 소멸 등)되는 객체를 빈(Beans)이라 부름.
  • 빈 생성 시 의존관계 주입(DI)이 일어남.
  • 빈 구성정보를 바탕으로 비즈니스 오브젝트를 이용해 애플리케이션 구성하고 생애를 관리함.

16.4. Bean 등록 Annotation

  • @Component
    • 컴포넌트를 나타내는 일반적인 스테레오 타입
    • 태그와 동일한 역할을 함
    • Class-level annotation
    • 등록하려는 빈의 클래스 소스가 편집 가능한 경우 사용
  • @Controller
    • 프리젠테이션 레이어, 웹 애플리케이션에서 웹 요청과 응답을 처리하는 클래스
  • @Service
    • 서비스 레이어, 비즈니스 로직을 가진 클래스
  • @Repository
    • 퍼시스턴스(persistence) 레이어, 영속성을 가지는 속성(파일, 데이터베이스)을 가진 클래스
      • @Repository, @Service, @Controller
        • 더 특정한 유즈케이스
        • @Component의 구체화된 형태임.
      • 컴포넌트는 빈이다.

16.5. Bean 의존관계 주입 Annotation

  • @Autowired
    • 의존하는 객체를 자동으로 주입해 주는 어노테이션임.
    • 정밀한 의존관계 주입 (Dependency Injection)이 필요한 경우에 유용함
    • 프로퍼티, setter 메서드, 생성자, 일반메서드에 적용 가능함
    • 의존하는 객체를 주입할 때 주로 Type을 이용하게 됨
      • 타입으로 먼저 검색, 여러개면 이름으로 검색
    • , 태그와 동일한 역할을 함
  • @Value
    • 단순한 값을 주입할 때 사용되는 어노테이션임
    • 와 동일한 역할을 함

  • @Qualifier
    • @Autowired 어노테이션과 같이 사용되어 짐
    • @Autowired는 타입으로 찾아서 주입하므로, 동일한 타입의 Bean 객체가 여러 개 존재할 때 특정 Bean을 찾기 위해서는 @Qualifier를 같이 사용해야 함.
  • @Resource
    • 애플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용됨
    • 프로퍼티, setter 메서드에 적용 가능함
    • 의존하는 객체를 주입할 때 주로 Name을 이용하게 됨
  • Component Scan을 지원하는 태그
    • 태그
      • @Component를 통해 자동으로 Bean을 등록하고, @Autowired로 의존관계를 주입받는 어노테이션을 클래스에서 선언하여 사용했을 경우에는 해당 클래스가 위치한 특정 패키지를 scan하기 위한 설정을 XML에 해주어야 햠.
      • 태그와 태그를 같이 사용하면 자동 스캔 대상에 포함시키지 않을 클래스와 포함시킬 클래스를 구체적으로 명시할 수 있음.
      • base-package에서부터 모든 @Component 검색
      • 인스턴스화 : 필요한 의존성을 모두 주입
      • 스프링 컨테이너에 등록 : 필요한 곳에 주입

SPRING 카테고리 내 다른 글 보러가기

댓글 남기기