참고 자료 : https://sightstudio.tistory.com/20
Dependency Injection(의존성 주입) 시 스프링에서 공식적으로 특정 방식을 권장하고 있다는 것은 얼핏 알았는데, 그 동안 공부하면서 크게 신경쓰지 않고 필드 주입을 사용했었다. 그런데 자꾸만 하이라이트가 뜨는게 거슬려서 마우스를 가져다 댔더니 추천하는 주입 방식이 아니라고 하는 게 아닌가... 이번 기회에 권장되는 방식이 뭔지 배워야겠다는 생각이 들어서 구글링을 했는데 위에 블로그에 너무 잘 설명이 되어있었다.
우선 나의 지식 리마인드...
Dependency Injection이란 뭔가요?
: 인스턴스 A가 다른 클래스의 인스턴스 B를 내부에서 사용하고 있을 때, 클래스 B의 내용이 변경되면 B를 사용하고 있는 A의 내용도 변경되어 버린다. 이럴때 A는 B에 의존한다고 할 수 있다.(의존성) 그러면 왜 의존성을 외부에서 주입하는지?
사실은 Dependency Injection 이라는 단어에서 방점은 Dependecy가 아니구 Injection에 찍히는 데 걍 의존한다구 해서 객체 만들어서 쓴다? 이러면 싱글톤이 유지가 안되잖아요 그래서 스프링이 관리해주도록 어노테이션이나 생성자를 통해서 싱글톤의 객체를 주입해주는 것이다.
위 레퍼런스 블로그 글 요약
1. Dependency Injection 에는 세가지 방법이 있다
: Field Injection / Setter based Injection / Construction based Injection
각 이름에서 알 수 있다시피 각 방식은
- 클래스의 필드에 객체를 하나 선언하고, Autowired 어노테이션을 붙이는 방법 (가장 간단해서 내가 사용하고 있었음)
- 해당 클래스에 Setter 메서드를 구현해서 의존성을 주입하는 방법 (가장 느슨한 결합이라고 함)
- 해당 클래스에 Constructor를 만들어서 객체 생성시 의존성을 주입하는 방법 (의존하는 인스턴스에 final을 붙여서 Immutable한 상태로 만들어 버려 아주 신뢰할 수 있다.)
요런 특징을 가지고 있는데 세번째인 생성자 주입 방식을 권장하고 있다고 한다.
추가 사항
1. 생성자가 하나밖에 없는 경우에는 @Autowired가 생략이 가능함
2. @RequiredArgsConstructor 를 붙이고 의존대상에 final을 붙여주면 생성자 필드도 생략이 가능해서 필드주입만큼 예쁜 코딩이 가능해진다.
>끝.