[Spring] DI시 생성자 주입 방식을 사용해야 하는 이유

김형진·2023년 3월 27일
1

스프링으로부터 의존주입을 받는 방식으로는 크게 세 가지가 있다.

  1. 생성자 주입
  2. 필드 주입
  3. setter(혹은 일반 method) 주입

실무에서는 무조건 1번 생성자 주입 방식만을 사용하는데, 이유는 이러하다.

  1. 2번의 필드주입 방식을 사용할 시, 스프링 없는 순수 자바 테스트가 불가능하다.
    테스트 대상이 되는 객체가 의존하는 다른 객체 필드는 외부에서는 접근 불가능한데, 이로 인해 Spring의 DI없이는 개발자가 필드를 직접 주입할 수 있는 방법이 없기 때문이다.

  2. 3번의 setter 방식을 사용할 시, 순수 자바 테스트는 가능하지만 (setter 메소드를 호출하여 테스트 대상 객체가 의존하는 객체를 직접 주입할 수 있다.) 개발자의 실수로 에러가 발생할 가능성이 있다.

    setter방식을 사용할 경우, 먼저 new 연산자를 통해 빈 인스턴스 생성 후 setter메소드를 호출하여 의존을 주입해야 하지만 이를 강제하지 않기 때문에 의존주입이 이뤄지지 않아도 컴파일에러가 나지 않아 빌드 후 테스트가 이뤄지기까지 문제를 발견하지 못할 가능성이 있다.

  3. 생성자 주입 방식을 사용하면, new 연산자 사용 시 필드주입을 강제하기 때문에 테스트코드를 작성하는 개발자는 이를 인지하고 바로 의존 주입을 이뤄준다.
    덧붙여 필드에 final키워드를 붙임으로써 인자로 전달받은 인스턴스를 생성자 내에서 필드로 주입하지 않는 것 또한 컴파일 에러를 발생하게 하여 실수를 줄일 수 있다.

TDD는 기본이니 생성자 주입을 사용하도록 하자!

profile
히히

0개의 댓글