들어가기에 앞서 Spring에서의 DI는 대표적으로 3가지 방법이 있다는 것은 많은 사람들이 아는 보편적인 지식입니다.
그리고 3가지 방법중 생성자 주입을 가장 지향하는것 또한 3가지 방법을 안다면 다 아는 사실일것입니다.
나는 한 기업에서 기술면접을 치뤘을때 DI에 관한 질문이 나왔을때 '아는거다' 라는 생각을 하며 굉장히 안도했고 자신감이 있었습니다.
자신있게 답변을 하고, 안도하고 있을때 "그럼 왜 생성자 주입을 지향하나요? 다른 방법들과 무슨 차이가 있나요? 큰 차이가 있나요?"
라는 질문이 들어왔고, 저는 당황하며 정확한 대답을 할 수 없었습니다. 그래서 다시 한번 확실히 정리하고자 합니다.
DI 생성자 주입
먼저 3가지 방법을 모두 살펴보도록 하겠습니다.
1. 필드주입
위의 코드처럼
- 코드가 간결하다는 장점이 있지만,
- 외부에서 변경이 불가능해서 테스트를 진행하기 힘들다는 치명적인 단점이 있습니다.
2. Setter 주입
위처럼 Setter로 주입을 한다면
- 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 거의 없지만
Setter는 언제든지 변경되게 할 위험이 있어 자칫하면 치명적인 버그로 이어질 수 있고,
- public로 열어놔야하기 때문에 언제든지 변경을 할 수 있다는 단점이 있습니다.
그렇다면 생성자 주입은 어떨까요?
3.생성자 주입
위와 같이 생성자로 의존성을 주입한다면
- 생성자 호출 시점에 딱 1번만 호출되는 것이 보장되고,
- 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일 없이 불변하게 설계할 수 있습니다.
- 또한 위의 코드처럼 final 키워드를 추가하면 컴파일 시점에 memberRepository를 설정하지 않는 오류를 체크할 수 있다는
장점도 있습니다.
- 마지막으로 위의 코드처럼 Lombok에서 final 필드에 대해 생성자를 만들어주는 @RequiredArgsConstructor 어노테이션을
활용하여 더욱 간결한 코드로 DI를 진행할 수 있습니다.
'Spring' 카테고리의 다른 글
Singleton(싱글톤) 패턴이란? (0) | 2021.12.20 |
---|---|
[SpringBoot With Aws] Spring 웹 계층 (0) | 2021.07.23 |
[SpringBoot With Aws] JUnit 단위 테스트 (0) | 2021.07.22 |
@Controller 와 @RestController의 차이 (0) | 2021.07.13 |
IoC (Inversion of Control) (0) | 2021.07.03 |