코딩 하는 가든

spring - 의존성 주입을 받는 여러 가지 방법 본문

Spring (boot)

spring - 의존성 주입을 받는 여러 가지 방법

가든리 2020. 8. 2. 02:28

의존성 주입을 받는 여러 가지 방법

스프링 프레임워크에서는 IoC 컨테이너를 통해 의존성 주입을 받는다는 것을 이전 글에서 알아보았습니다.

 

앞선 글에서는 컨테이너에서 꺼낸 배터리 빈을 Toy의 생성자로 넣어 주었습니다. 이는 의존성 주입의 한 종류라고 볼 수 있겠습니다.

 

스프링 프레임워크에서 의존성을 주입 받는 방법은 크게 3가지 정도가 있습니다.

 

1. 생성자를 통한 주입

2. Setter를 통한 주입

3. 필드를 통한 주입

 

각각의 방법에 차근차근 알아보겠습니다.

 

우선 세 방법에 대해 보기 전에 @Autowired 어노테이션에 대해 알아야 합니다.

 

이전 글에서 우리는 Battery Bean을 찾아 Toy 객체에 직접 넘겨주는 작업을 했습니다.

프로젝트에는 무수히 많은 Bean과 그들의 의존 관계가 있을 것입니다.

 

그 모든 Bean을 직접 찾아 의존 관계에 맞게 주입을 해주는 것은 매우 힘든 일 일 것입니다.

 

하지만 우리는 @Autowired 어노테이션 덕분에 이런 귀찮은 작업을 하지 않아도 됩니다.

 

@Autowired 어노테이션은 스프링 프로젝트 실행 시 스프링에 의해 스캔된 컴포넌트에 해당 어노테이션이 있을 시 자동으로 의존성을 주입해 주도록 도와줍니다.

 

그럼 @Autowired 어노테이션과 함께 어떻게 의존성 주입이 되는지 살펴보겠습니다.

1. 생성자를 통한 의존성 주입

생성자 위에 @Autowired 어노테이션을 붙여 주면 자동으로 객체가 생성될 때 자동으로 의존성 주입이 됩니다.

생성자를 통한 의존성 주입은 특히 주입받을 객체를 final 키워드를 통해 객체가 변하지 않도록 보장할 수 있습니다.

 

우리가 스프링 부트 프로젝트에서 많이 보는 아래와 같은 형태입니다.

 

lombok 같은 라이브러리를 사용한다면 위 코드처럼 생성자를 생략할 수 있지만 여기서는 넘어가도록 하겠습니다.

 

2. Setter를 통한 의존성 주입

다음은 Setter를 통한 의존성 주입입니다.

 

생성자 주입과 마찬가지로 Setter 메소드 위에 @Autowired 어노테이션을 적어주면 자동으로 의존성 주입이 됩니다.

하지만 Setter를 통한 의존성 주입은 생성자 주입에 비해 권장되는 방법은 아닙니다. Setter를 이용한 의존성 주입을 할 경우 컴파일 타임에 순환 참조 같은 문제를 잡아낼 수 없습니다. 관련 내용은 참고했던 링크를 남겨둡니다.(https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/)

 

3. 필드를 통한 의존성 주입

마지막으로 필드를 통한 의존성 주입입니다.

마찬가지로 멤버 변수 위에 @Autowired 어노테이션을 적어주면 됩니다.

 

필드 주입 방식은 전혀 권장되지 않는 방법입니다.

 

필드 주입 방식은 마치 아래와 같습니다.

toy.battery = battery;

객체 지향적인 관점에서도 절대 지양해야 할 방식입니다.

 

이 같은 방식은 IoC컨테이너와의 결합도가 매우 높아지고 수정이나 확장을 방해합니다.

 

꼭 필요해야 할 경우가 아니라면 지양하고 만약 필요한 상황이 생겼다면 어딘가 설계가 잘못된 것은 아닐지 의심해봐야 합니다.

 

이상으로 스프링에서 의존성 주입을 어떻게 해주는가에 대해 알아보았습니다.