본문 바로가기
Spring

Spring의 DI는 왜 생성자 주입으로?

by sangfeeeeel 2021. 12. 14.

들어가기에 앞서 Spring에서의 DI는 대표적으로 3가지 방법이 있다는 것은 많은 사람들이 아는 보편적인 지식입니다.

그리고 3가지 방법중 생성자 주입을 가장 지향하는것 또한 3가지 방법을 안다면 다 아는 사실일것입니다. 

나는 한 기업에서 기술면접을 치뤘을때 DI에 관한 질문이 나왔을때 '아는거다' 라는 생각을 하며 굉장히 안도했고 자신감이 있었습니다.

자신있게 답변을 하고, 안도하고 있을때 "그럼 왜 생성자 주입을 지향하나요? 다른 방법들과 무슨 차이가 있나요? 큰 차이가 있나요?"

라는 질문이 들어왔고, 저는 당황하며 정확한 대답을 할 수 없었습니다. 그래서 다시 한번 확실히 정리하고자 합니다.

 

DI 생성자 주입


먼저 3가지 방법을 모두 살펴보도록 하겠습니다.

 

1. 필드주입

위의 코드처럼 

- 코드가 간결하다는 장점이 있지만,

- 외부에서 변경이 불가능해서 테스트를 진행하기 힘들다는 치명적인 단점이 있습니다.

 

 

2. Setter 주입

위처럼 Setter로 주입을 한다면

- 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 거의 없지만

Setter는 언제든지 변경되게 할 위험이 있어 자칫하면 치명적인 버그로 이어질 수 있고,

- public로 열어놔야하기 때문에 언제든지 변경을 할 수 있다는 단점이 있습니다. 

 

그렇다면 생성자 주입은 어떨까요?

 

 

3.생성자 주입

위와 같이 생성자로 의존성을 주입한다면

- 생성자 호출 시점에 딱 1번만 호출되는 것이 보장되고,

- 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일 없이 불변하게 설계할 수 있습니다.

- 또한 위의 코드처럼 final 키워드를 추가하면 컴파일 시점에 memberRepository를 설정하지 않는 오류를 체크할 수 있다는

장점도 있습니다.

- 마지막으로 위의 코드처럼 Lombok에서 final 필드에 대해 생성자를 만들어주는 @RequiredArgsConstructor 어노테이션을 

활용하여 더욱 간결한 코드로 DI를 진행할 수 있습니다.