의존성 주입 방법들
- 생성자 주입
가장 많이 보게 되는 생성자 주입방식이다.
생성자를 통해 객체를 주입해주며 Spring 프레임워크 자체에서도 생성자주입을 권장하기 때문에
생성자가 하나만 존재한다면 자동으로 주입을 해준다.
만약 생성자가 여러개인 경우에는 빈 등록에 쓰일 생성자에 @Autowired를 붙여주어야 한다.
- 수정자(Setter) 주입
다음은 수정자 setter를 만들어주어 주입을 해주는 방식이다.
변동가능성이 있기 때문에 객체에 final이 빠졌고 스프링 초기에는 자바 기본 스펙이 get, set 이었으므로 수정자 주입을 많이 사용했다고 한다.
객체를 변경할 일이 혹시라도 있으면 수정자 주입을 사용해야할 것이다.
- 필드 주입
마지막으로 그냥 알아서 때려박아달라는 필드 주입이다. 이것도 final 사용이 불가능하고 아예 추천하지를 않는단다.
필드 주입은 Spring이 알아서 해주기 때문에 외부에서 수정이 불가능므로 이는 테스트 코드에 부적합한 방식이다.
또한 프레임워크에 굉장히 의존적이므로 별루다.
- 생성자 주입의 장점
1. 객체의 불변성 확보
수정자 주입과 필드 주입은 일단 final 사용이 불가능하므로 단일 객체를 보장할 수 없고, 변경가능성이 존재한다.(수정자는 게다가 public...)
정말 필요한 경우가 아니라면 의존 관계가 변할 일은 거의 없으므로 생성자 주입을 통해 불변성을 보장하는 것이 유리하다.
2. 테스트 코드 작성의 편리함
필드 주입은 @Autowired가 필요하기 때문에 Spring 프레임워크에 의존적이다. (@Autowired없이는 아예 null이 뜬다.)
테스트 코드는 순수 자바로 작성하는 것이 좋으므로 생성자 주입이 유리하다.
3. 순환 참조 에러 방지
UserService가 PostService에 의존하고 PostService가 UserService에 의존하는 것을 순환 참조라고한다.
Bean으로 등록되기 위해 서로가 서로를 필요로 하는 Deadlock같은 상황이 벌어진다.
@Autowired는 모든 객체가 생성된 후에 의존관계 주입이 처리되기 때문에 어플리케이션이 일단 실행이 된다.
그 후 상대 객체를 통해 호출하는 메소드들이 계속 쌓이면서 stack overflow가 발생하게 된다.
그에 비해 생성자 주입은 객체의 생성과 의존관계 주입이 동시에 일어나기 때문에 compile 상황에서 미리 순환 참조를 확인할 수 있다.
Reference
https://mangkyu.tistory.com/125
'Spring' 카테고리의 다른 글
[Spring] DI(의존성 주입)는 무엇일까 (0) | 2023.12.12 |
---|