의존성 주입 방법

지노·2021년 6월 19일
0

DI(Dependency Injection)

  • Spring Conatiner는 Lifecycle 뿐 아니라, 의존성 주입까지 담당한다.

의존성 주입 방법

생성자 주입(Constructor-Based Dependency Injection)

  • 생성자 주입은 생성자에 의존성 주입을 받고자 하는 field를 나열하는 방법으로, 권고되는 방법의 하나

장점

  • 필수적으로 사용해야 하는 레퍼런스 없이는 인스턴스를 만들지 못하도록 강제함
  • Spring 4.3 이상부터는 생성자가 하나인 경우 @Autowired 를 사용하지 않아도 됨
  • Circular Dependency / 순환 참조2 의존성을 알아 차릴 수 있음
  • 생성자에 점차 많은 의존성이 추가 될 경우 리패토링 시점을 감지 할 수 있음
  • 의존성 주입 대상 필드를 final로 불변 객체 선언할 수 있음
  • 테스트 코드 작성시 생성자를 통해 의존성 주입이 용이함

단점

  • 어쩔 수 없는 순환 참조는 생성자 주입으로 해결하기 어려움
    • 가급적이면 순환 참조가 발생하지 않도록 하는 것이 더 중요

필드 주입(Field-Based Dependency Injection)

  • member field에 @Autowired annotation을 선언하여 주입

장점

  • 가장 간단한 선언 방식

단점

  • 의존 관계가 눈에 잘 보이지 않아 추상적이고, 이로 인해 의존성 관계가 과도하게 복잡해질 수 있음
    • 반대로 Constructor injection과 Setter injection은 의존성을 명확하게 커뮤니케이션 함
  • 이는 SRP / 단일 책임 원칙에 반하는 안티패턴?
  • DI Container와 강한 결합을 가져 외부 사용이 용이하지 않음
    • 단위 테스트시 의존성 주입이 용이하지 않음
  • 의존성 주입 대상 필드가 final 선언 불가

Setter 주입(Setter-Based Dependency Injection)

장점

  • 의존성이 선택적으로 필요한 경우에 사용
  • 생성자에 모든 의존성을 기술하면 과도하게 복잡해질 수 있는 것을 선택적으로 나눠 주입 할 수 있게 부담을 덜어줌
  • 생성자 주입 방법과 Setter 주입 방법을 적절하게 상황에 맞게 분배하여 사용

단점

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

profile
Spring Framework를 이용한 웹 개발과 AWS 서비스, Container를 사용한 CI/CD 인프라에 관심이 있습니다.

0개의 댓글