평범한 연구소

[Spring] 의존 DI(Dependency Injection) 본문

Spring Framework

[Spring] 의존 DI(Dependency Injection)

soyeonisgood 2022. 11. 9. 20:50

의존의 개념을 알기 전, 꼭 알아야할 개념들이 있다.

 

컨테이너 (Container)

컨테이너는 어플리케이션을 관련 라이브러리 및 종속 항목과 함께 패키지로 묶어 SW 서비스 구동을 위한 격리 환경을 제공한다. 보통 인스턴스의 생명주기 관리와 추가적인 기능을 제공한다.

Servlet 컨테이너는 Servlet의 생성, 생성 후 초기화, 서비스 실행, 소멸에 관한 모든 권한 갖는다. 개발자가 직접 Servlet을 생성하고 서비스하지 않는다. 

스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치. 종속 객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다.

 

제어의 역전 (IoC, Inversion of Control)

IoC는 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 의미한다.

즉, 인스턴스 생성에서 소멸까지의 생명주기 관리를 컨테이너가 담당한다. (개발자가 담당 X)

컴포넌트 의존 관계 결정, 설정(configuration) 및 생명주기를 해결하기 위한 디자인 패턴.

객체 간의 결합도를 줄이고 유연한 코드를 작성하게 하여 가독성코드의 중복, 유지보수를 편하게 할 수 있다.

 

IoC 구현 방법

- DL (Dependency Lookup, 의존성 검색)

  • 저장소에 저장된 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup
  • EJB, Spring 등에서 지원

- DI (Dependency Injection, 의존성 주입)

  • 각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결.
  • 의존성 주입 방법
    • Constructor Injection (생성자를 이용한 주입)
    • Method(Setter) Injection (setter나 일반 메소드를 이용한 의존성 주입)
    • Field Injection (필드를 통한 의존성 주입)
  • Spring, PicoContainer 에서 지원

 

DI (Dependency Injection, 의존성 주입)

객체 자체가 아닌, Framework에 의해 객체의 의존성이 주입되는 설계 패턴이다. 각 클래스간의 의존 관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결한다.

Framework에 의해 동적으로 주입되므로 모듈 간의 결합도가 낮아지고 유연성이 높아진다.

주로 생성자를 이용하여 의존성을 주입한다. setter, 필드를 이용한 의존성 주입은 실행 중 값이 변경될 가능성이 있으므로 안전하지 않아서 잘 사용하지 않는다.

 

DI(의존성 주입) 의 장점

- Dependency Reduction : 객체 상호 간 의존성 관계 줄어듬.

- Reusable Structure : 코드의 재사용과 조합이 용이.

- Readability : 코드들이 분리되어 가독성이 높다.

- Loose Coupling & Easy to change : 구조는 변화에 민감하지 않다.

- 기타 테스트가 용이하고 다양한 패턴을 적용하는데에 유연하다.