[Spring] 의존성 주입의 세 가지 방법

1. 필드 주입

  • Field Injection

  • 필드에 바로 의존 관계를 주입하는 방법이다.

  • @Autowired필드에 붙어있다.

  • 코드가 간결해보이지만, 외부에서 변경이 불가능한 문제가 있다.

  • 동작 과정

    • 주입받으려는 빈의 생성자를 호출해서 빈을 찾거나 빈 팩토리에 등록한다.
    • 생성자 인자에 사용하는 빈을 찾거나 만든다.
    • 필드에 주입한다.
  • 주입할 빈이 없어도 빈 생성이 가능하다. ➡️ 에러가 발생하지 않는다.

  • 앱이 실행되고 testService에 접근할 때 NPE(NullPointerException) 발생

    @Controller
    public class TestController {
      @Autowired
      private TestService testService;
    
    }

2. 생성자 주입

  • Constructor Injecton

  • 생성자를 통해 의존 관계를 주입하는 방법이다. ➡️ 한 번만 호출되는 것을 보장

  • @Autowired생성자에 붙어있다.

  • 해당 클래스에 생성자가 하나 밖에 없으면 @Autowired를 생략할 수 있다.

  • 객체 생성 시점에 빈을 주입하기 때문에 주입할 빈이 없으면 에러가 발생한다. ➡️ 즉시 에러 확인 가능

  • 주입 받을 필드에 final 키워드를 붙일 수 있다. ➡️ 불변성 보장

  • 순환 참조를 방지할 수 있다.

    @Controller
    public class TestController {
      private TestService testService;
    
      @Autowired
      public TestController(TestService testService) {
        this.testService = testService;
      }
    }

3. 수정자 주입

  • Setter Injection

  • 필드 값을 변경하는 setter()를 통해 의존 관계를 주입하는 방법이다.

  • @Autowiredsetter()에 붙어있다.

  • 필드 주입처럼 주입할 빈이 없어도 빈 생성이 가능하다. ➡️ 에러가 발생하지 않는다.

    @Controller
    public class TestController {
      private TestService testService;
    
      @Autowired
      public void setTestService(TestService testService) {
        this.testService = testService;
      }
    }

결론

  • 가장 좋은 방법은 생성자 주입 방식이다!

참고