Dependency Injection Methods
Dependency Injection Methods
- 의존 관계 주입은 다음과 같이 네 가지 방법으로 수행 가능
- 생성자 주입
- 수정자(setter) 주입
- 필드 주입
- 일반 메서드 주입
- 각 주입 방식마다 장단점이 존재
- 최근 대부분의 DI 프레임워크에서는 생성자 주입 사용
생성자 주입
- 객체가 생성될 때, 생성자를 통해 의존 관계를 주입받는 방법
- 생성자 호출은 한 번만 되므로, 무조건 한 번만 실행된다는 것이 보장됨
필수적
이며, 변하지 않는
의존 관계에 주로 사용- 대부분의 의존 관계는 변하면 안되는 경우가 많으므로, 생성자 주입이 적극 권장됨
- 이 방법만 필드에
final
키워드를 사용 가능
- Spring bean의 경우 생성자가 1개만 있으면
@Autowired
를 생략해도 됨 - 예제 코드
public class A {
private final SomeInterface i;
@Autowired
public A(SomeInterface i) {
this.i = i;
}
}
수정자(setter) 주입
- 필드의 값을 변경하는
setter
메소드를 통해 의존 관계를 주입받는 방식 - 생성자 주입과 달리 여러 번 호출 가능
선택적
이며, 변할 수 있는
의존 관계에 사용- public으로 메소드를 열어두기 때문에 누군가 의도치 않게 변경 가능함
- 이런 점 때문에 최근에는 사용이 지양됨
- 예제 코드
public class A {
private SomeInterface i;
@Autowired
public void setSomeInterface(SomeInterface i) {
this.i = i;
}
}
필드 주입
- 의존 관계를 필드에 바로 주입하는 방식
@Autowired
를 필드에 붙여 자동으로 의존관계를 주입- 코드가 간결하다는 장점이 있지만 외부에서 변경이 힘들다는 치명적 단점 존재
- 특별한 용도로 일부에서만 사용하고, 웬만해서는 사용을 지양할 것
- 예제 코드
public class A {
@Autowired
private SomeInterface i;
}
일반 메서드 주입
setter
가 아닌 일반 메소드를 통해 의존 관계를 주입받는 방식- 한 번에 여러 필드를 주입받을 수 있지만, 일반적으로 잘 사용하지 않음
public class A {
private SomeInterface1 i1;
private SomeInterface2 i2;
@Autowired
public void init(SomeInterface1 i1, SomeInterface2 i2) {
this.i1 = i1;
this.i2 = i2;
}
}
References
- 스프링 핵심 원리 기본편 - 김영한 (https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard)