Next-Squad / Interview-Question

주니어 백엔드 개발자 면접 시에 물어볼 수 있는 질문에 대해서 같이 공부하고, 공유하고자 합니다.
168 stars 11 forks source link

[Spring] 6. DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요? #19

Open CMSSKKK opened 2 years ago

CMSSKKK commented 2 years ago

DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요?

키워드

@Autowired, bean, Constructor, Field, Property

CMSSKKK commented 2 years ago

DI는 다른 질문에서 다루기에, 설명하지않겠습니다.

Spring에서 DI 방식은 3가지 방식이 있습니다.

Field Injection, Setter Injection, Constructor Injection 입니다.

Fielid Injection 은 Spring과 관련해 오래전에 작성된 블로그들과 책을 보다 보면, 간간히 볼 수 있습니다.

현재는 좋은 방식이 아니라고 알고 있기 때문에, TestCode를 작성할 때 이외에는 사용하지않습니다. (인텔리제이에서도 Filed Injection을 사용하면 다른 방식을 추천합니다(노란줄))


먼저 3가지 방식에 대해서 사용법을 살펴보겠습니다.

Filed Injection은 DI를 주입받기 위한 필드에 대해서 @Autowired 어노테이션을 붙여주는 것입니다.

Constructor Injection 생성자에 @Autowired 어노테이션을 붙이는 것입니다. 스프링 4.3 버전부터는 단일 생성자의 경우에는@Autowired 어노테이션이 생략 가능합니다.

Setter Injection은 setter Property에 @Autowired 어노테이션을 붙이는 것입니다.

Field에도 @Autowired 어노테이션, setter에도 @Autowired 어노테이션이 붙어있다면??

스프링은 Setter Injection합니다.


그렇다면 왜 Constructor Injection을 권장하는지 알아보겠습니다.

먼저 객체를 생성할 때, 생성자에서 의존성이 필요한 파라미터리스트가 주어진다면, 우리는 의존성이 주입되지 않는 객체를 생성할 수 없다는 것을 확신할 수 있습니다.

스프링 컨테이너(IoC컨테이너) 입장에서도 의존성으로 주입할 bean을 체크할 다른 로직이 필요없어지기 때문에 NPE를 방지할 수 있습니다.

두 번째로, 개발자로 하여금 나쁜 code smell 즉, SRP 원칙을 위반하지는 않는지 확인하게 합니다. 너무나 많은 종속성이 필요한다면 단일책임원칙을 위반하지는 않는지 확인하게되고 리팩토링하게 만드는 것입니다.

마지막으로 Constructor Injection을 하게되면, 의존성 주입이 필요한 객체를 final로 할 수 있어서, 불변성을 가질 수 있게 됩니다.

모든 의존성을 주입해야만 객체를 생성할 수 있고, setter를 통한 의존성의 변경을 방지합니다.

불변객체의 의미와 필요성에 대해서 더 공부해봅시다. 멀티 스레드 환경과도 관련...

References

https://reflectoring.io/constructor-injection/