필드 주입? 생성자 주입?

의존주입에 대해서 학습하면서 정리한 글입니다.

Field Injection

@Autowired를 통한 자동주입

1
2
3
4
5
6
7
8
@Component
public class FieldInjection {
@Autowired
private Service1 service1;
@Autowired
private Service2 service2;
...
}
  • 위와 같은 방법은 불필요한 코드없이 간결하게 보이기 때문에 좋아보일 수 있다.

Constructor Injection

1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
public class FieldInjection {
private final Service1 service1;
private final Service2 service2;

@Autowired
public FieldInjection(Service1 service1, Service2 service2) {
this.service1 = service1;
this.service2 = service2;
}

...
}
  • 생성자의 파라미터가 늘어날수록 책임에 대한 위기감이 생기게 된다.
  • 의존을 추가할 때마다 생성자에 추가해줘야하기 때문에 번거로울 수 있지만 조심할 수 있다.
  • Spring 4.3 버전부터는 단일 생성자일 때 @Autowired를 쓰지않아도 된다.

왜 Field Injection보다 Constructor Injection인가?

  1. 불변성 위반 - Field Injection은 final을 선언할 수 없기 때문에 객체가 변경가능한 상태가 된다.
  2. 단일 책임의 원칙 위반 - 필드주입은 의존주입이 쉬워져서 책임에 대한 위기감이 덜 느껴지게된다.
  3. Field Injection은 숨은 의존성만 제공한다. -
  4. 필요한 의존성을 가진 클래스를 곧바로 인스턴스화 시킬 수 없다.
  5. 생성자를 통한 주입은 순환의존성인지를 알 수 있다.

    순환의존성?

    • 의존하는 것들끼리 꼬리에 꼬리를 물어서 A->B->C->A 와 같은 형태를 말한다.

앞으로 생성자를 통한 의존주입을 하자!


0%