-
Spring: 의존관계 주입(DI, Dependency Injection) 방식 네 가지 요약각종 학습 요약/Spring 2022. 6. 16. 15:37
Spring: 의존관계 주입(DI, Dependency Injection) 방식 네 가지 요약
이 글에서는 Spring Framework의 의존관계 주입(이하 'DI') 방식 네 가지를 살펴보고, 각각의 방식이 어떤 특징을 가지고 있는지 요약해보겠습니다.
DI의 네 가지 방식
Spring Framework에서 컨테이너가 관리하고 있는 Bean 객체에 의존관계를 주입하는 방법에는 크게 네 가지가 있습니다.
- 생성자 주입
- 세터(수정자) 주입
- 필드 주입
- (일반)메서드 주입
1. 생성자 주입
생성자 주입은 아주 자주 사용됩니다. 왜 자주 사용되는지, 어떤 특징이 있는지 잘 알아둘 필요가 있습니다.
- 단 한 번만 호출되는 것을 보장합니다(생성 시).
- 불변 객체를 만들 수 있습니다. 생성 시점(컨테이너에 빈을 등록하는 시점)에 연관관계를 주입하기 때문이에요.
2-1. 주의: 불변 객체로 사용하려고 만들었으면 세터(수정자) 메서드를 절대로 만들지 말자! - 생성자가 하나일 때는
@Autowired
어노테이션을 생략할 수 있습니다. 두 개 이상이 되면 명시해주어야 합니다.
앞서 말했듯 생성자 주입은 가장 많이 사용되는 방식이고 권장되는 방식입니다. 정확히는, 생성자를 하나 두어서
@Autowired
를 생략하는 방식으로 말이죠.
또한 생성자에서 파라미터로 받는 값들은 값을 세팅해주는 것이 관례라고 합니다.2. 세터(수정자) 주입
수정자는 자바빈 규약에 명시된 메서드예요. 제게는 세터라는 이름이 더 익숙해서 세터로 표기하겠습니다.
- 세터 메서드는 컨테이너에 빈이 등록되고 난 이후, 그 다음 연관관계를 설정하는 단계에서 동작합니다.
- 그러다보니 불변이 주요한 특징이었던 생성자 주입과는 다르게 선택적, 변경 가능 등의 키워드들이 주요 특징이 되겠습니다.
생성자 주입 파트에서 말했던 주의 사항이 이제 이해가 되시나요? 세터는 생성시점 보다는 실행시점에 가깝게 주입이 일어나기 때문에, 불변할 거라고 기대한 생성자 주입 객체에 변경을 일으킬 수 있습니다. 생성자로 주입을 마쳐놨는데 세터로 다시 다른 연관관계를 주입하면, 애초에 기대했던 동작과 다르게 동작할 수 있겠죠?
3. 필드 주입
말 그대로 필드 자체에 코드로 명시해놓는 방식입니다. 하지만 사용하지 않는게 좋겠죠. 개방 폐쇄 원칙(OCP)과 의존성 역전 원칙(DIP)를 위반하게 됩니다. 즉 애플리케이션 코드가 경직되어 수정과 유지보수가 어렵게 됩니다.
외부에서 변경할 방법이 전혀 없기 때문에 자체적으로는 테스트가 어렵고, 테스트를 위한 코드가 따로 존재해야 하는데, 그 코드는 세터 메서드입니다. 고로 필드 주입 방식을 쓰려고 고민하고 있었다면 그냥 세터 메서드를 쓰시면 됩니다!4. 일반 메서드 주입
세터 메서드와 동일합니다. 하지만 규약은 괜히 규약인게 아니죠. 혼자 모든 코드를 짜고 관리할 게 아니라면, 아니 그렇다고 해도 굳이 규칙이 없이 사용할 필요는 없기 때문에 이 경우에도 세터 메서드를 고려하는 편이 낫겠습니다.
결론
어렵고 복잡한 시간이었을 수도 있을 것 같아요. 가장 많이 사용되는 방식이 생성자 주입 방식이라고는 하지만, 생성자 주입 방식도 단점이 없는 것은 아니에요.
위에 소개한 네 가지 방식이 '대표적인' 방식인거고, 다른 응용 방법들도 있으니까 여러모로 알아보고 상황에 맞게 사용하시면 좋겠습니다!'각종 학습 요약 > Spring' 카테고리의 다른 글
Spring: Proxy를 통한 Spring Data Repository 초기화와 설정 (2) 2022.07.01 Spring: AOP의 기본적인 개념 & SpringAOP 훑어보기 (2) 2022.06.20 Error Handling: Spring에서 Exception 대응하기 (0) 2022.06.17 Spring: IoC와 DI를 예시로 쉽게 이해해보자 (0) 2022.06.16 Spring: Spring Container와 Bean (0) 2022.06.16 Framework와 Library의 차이 (0) 2022.06.14