의존성 주입

suye 22·2023년 2월 23일

기술면접 준비하기

목록 보기
8/16

DI의 방식 중 필드 vs 생성자 주입 방식

의존성 주입(Dependency Injection)

사용할 객체를 직접 생성 하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식이다.

의존성

  • 서로 다른 객체 사이에 의존 관계가 있다는 것이다. 의존하는 객체가 수정되면 다른 객체에도 영향을 줄 수 있다.

주입

  • 외부에서 객체를 생성하여 넣는 것을 말한다.
의존성을 가진 코드가 많이 존재한다면?
- 의존성을 가지는 객체들과 함께 수정해야 하는 문제점이 높아진다. 
의존성 주입을 해야하는 이유? 
- 각 클래스간 의존하지 않게 하여 한 클래스에서 문제가 생기더라도 해당 클래스만 고치면 되기 때문 

의존성 주입 방법

생성자 주입

  • 단일 생성자인 경우에는 @Autowired 어노테이션을 붙이지 않아도 되지만 생성자가 2개 이상인 경우에는 생성자에 어노테이션을 붙여줘야 한다

필드 주입

  • @Autowired 어노테이션을 붙여주면 자동으로 의존성이 주입된다.
  • 어노테이션만 붙이면 되기 때문에 코드가 간결해지는 장점이 있다.
  • 외부에서 변경이 불가능하여 테스트가 어렵도록 하는 원인이 된다.

    SRP 위반(Single Responsibility Principal)?
    객체지향 설계의 5대 원칙 SOLID의 단일 책임 원칙을 위반하게끔 만든다.

    • 하나의 클래스는 오직 하나의 책임을 가진다.
    • 클래스는 단 한가지의 변경 이유만을 가져야 한다.

Setter 메서드를 통한 주입(수정자 주입)

  • 런타임에 주입받는 객체가 변경될 가능성이 있는 경우에 사용된다.
    • 런타임에 체크하기 때문에 NPE가 발생할 가능성이 있기 때문에 주의해야 한다.
    • 주입이 필요한 객체가 주입이 되지 않아도 얼마든지 객체를 생성할 수 있다는 것이 문제이다.

      객체 생성 이후에도 객체를 변경시킬 수 있다.

  • setxxx 메서드를 public으로 열어둬야하여서 언제든지 변경이 가능하다.

필드주입방식과 수정자 주입방식

생성자 주입방식

<생성자 주입방법을 권장하는 이유?>

개발을 하다 보면 여러 컴포넌트 간에 의존성이 생긴다. 그중에서도 A가 B를 참조하고, B가 다시 A를 참조하는 순환 참조도 발생할 수 있다.

<장점>

  • 테스트에 용이하다
    • 필드주입에 비해 테스트 작성이 쉽다. 필드 주입 시에는 단위 테스트를 할 때 의존성을 가지는 객체를 생성해서 주입하는 것이 불가능하기 때문이다. 스프링에서는 Ioc 컨테이너가 이를 수행하지만, 단위 테스트에서는 그렇지 않다.
  • 순환 참조를 방지 할 수 있다.
    • 순환 참조시 빌드가 중단되어 이를 예방한다.
  • 객체를 불변으로 만들 수 있다.
    • setter를 사용하는 주입은 실행 중 언제든지 객체를 변경할 수 있지만, 생성자 주입은 객체를 final로 선언하였기 때문에 불변하다
    • 누군가 해당 파일 안에서 조정할 수 없다.
    • 실행중에 객체가 변하는것을 막을 수 있다
    • 오류를 사전에 방지 할 수 있다.
    • 불변객체나 null이 아님을 보장할 때는 반드시 생성자 주입을 사용해야 한다.

출처
https://faith-developer.tistory.com/147
https://gyuios.tistory.com/224
의존성주입 참고
의존성 주입

0개의 댓글