DI(Dependency Injection)

  • 클래스들간에 직접적인 의존 관계를 맺는 것보단 느슨하게 인터페이스를 통해 의존관계를 맺어, 결합도를 낮추는 것이 중요
  • 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴
  • 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입
  • DI컨테이너를 통해 서로 강하게 결합된 두클래스를 분리 및 두 객체간의 관계를 결정하여 결합도를 낮추고 유연성을 확보

장점

  • 의존관계 설정이 컴파일시가 아닌 실행시에 이루어져 모듈들간의 결합도를 낮출 수 있다.
  • 코드 재사용성이 높음
  • 모의 객체 등을 이용한 단위 테스트의 편의성을 높여준다.

의존성 주입의 종류

생성자 주입, 필드 주입, Setter 주입

 

생성자 주입

생성자에 @Autowired Annotation(어노테이션)을 붙인다.

장점

  • 필수적으로 사용해야 하는 레퍼런스 없이는 인스턴스를 만들지 못하도록 강제함
  • 테스트 코드 작성시 생성자를 통해 의존성 주입이 용이
  • 의존성 주입 대상 필드를 final로 불변 객체 선언할 수 있음

단점

  • 순환참조는 생성자 주입으로 해결하기 어려움리커시브 형태
  • primary 어노테이션 조사해보기

필드 주입

변수 선언부에 @Autowired 어노테이션을 붙인다.

장점

  • 가장 간단한 방식

단점

  • 의존관계가 추상적이고, 의존관계가 복잡해질 수 있음
  • DI Container와 강한 결합을 가져 외부 사용이 용이하지 않음
  • 단위 테스트시 의존성 주입이 용이 하지 않음
  • 의존성 주입 대상 필드가 final선언 불가

Setter 주입

Setter 메소드에 @Autowired 어노테이션을 붙인다.

장점

  • 생성자에 선택적으로 나눠 주입할수 있어 부담을 덜어줌
  • 생성자 주입 방법과 Setter 주입 방법을 적절하게 상황에 맞게 분배하여 사용

단점

  • 의존성 주입 대상 필드가 final선언 불가

 

참고

'JAVA & Spring > Spring' 카테고리의 다른 글

JPA EntityManager의 Thread-safe 이해하기  (0) 2024.06.02
JPA의 동작 원리  (0) 2024.05.20
JPA 구성요소와 기본 이해  (0) 2023.09.18

+ Recent posts