Open CMSSKKK opened 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를 통한 의존성의 변경을 방지합니다.
불변객체의 의미와 필요성에 대해서 더 공부해봅시다. 멀티 스레드 환경과도 관련...
DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요?
키워드
@Autowired
,bean
,Constructor
,Field
,Property