본문 바로가기
Dev/Spring Framework

『Spring Core』 DI (Dependency Injection)

by 세대교체 2024. 11. 7.

DI (Dependency Injection)

의존성 주입은 객체 간의 의존성을 설정하는 방법이다.

Spring 컨테이너에 여러 컴포넌트를 빈(Bean)으로 등록하여 객체의 생명주기 관리를 위임하고 빈으로 등록된 객체를 주입받아서 사용할 수 있다.

 

 

의존성 주입 방법

의존성 주입에는 다음과 같은 방법들이 있다.

  1. 생성자 주입 (Constructor Injection)
  2. 세터 주입 (Setter Injection)
  3. 필드 주입 (Field Injection)
  4. 일반 메서드 주입 (Method Injection)

이 중에서 생성자 주입을 가장 많이 사용하며 Spring에서도 공식적으로 권장하는 방법이다.

 

 

생성자 주입

생성자를 통해 의존성을 주입하는 방법이다. 생성자 호출 시점에 딱 한 번만 호출되며 이후에는 변경이 불가능하다.

주로 불변(immutable)하고 필수적인 의존관계에 사용된다.

 

✅ 생성자가 하나뿐이면 @Autowired를 생략해도 자동으로 주입된다.

✅ Lombok의 @RequiredArgsConstructor를 사용하면 private final로 선언된 필드를 대상으로 생성자를 자동으로 생성한다.

 

 

세터 주입

세터 메서드를 이용하여 의존성을 주입하는 방법이다. 선택적(optional)이고 변경 가능성이 있는 의존관계에 사용된다.

필수 의존성이 설정되지 않아도 객체가 생성될 수 있으므로, 런타임 시점에 NullPointerException이 발생하기에 잘 사용하지 않는다.

 

 

필드 주입

필드에 직접 주입하는 방법이다. 의존성이 숨겨져 있어 테스트나 유지보수가 어려운 단점이 있어 잘 사용하지 않는다.

예를 들어 단위 테스트 시에 Mock 객체 등을 주입하기 어렵다.

 

 

일반 메서드 주입

일반적인 메서드를 이용하여 의존성을 주입하는 방법이다. 한 번에 여러 필드를 주입할 수 있다.

필드 주입과 마찬가지로 잘 사용되지 않는다.

 

 

생성자 주입을 사용하는 이유

Spring에서 공식적으로 생성자 주입을 권장하는 이유는 다음과 같다.

 

불변성 보장

생성자 주입을 사용하면 의존성을 private final로 선언하여 객체 생성 이후에는 의존성이 변경되지 않도록 할 수 있다.

 

의존성 명시화

생성자를 통해 필요한 의존성을 명확하게 표시할 수 있다.

 

테스트 용이성

생성자 주입을 사용하면 DI 컨테이너 없이도 순수 자바 코드로 객체를 생성하여 테스트할 수 있다.

 

순환 참조 방지

생성자 주입을 사용하면 순환 참조가 있을 경우 애플리케이션 구동 시점에 빨리 발견할 수 있다. 반면에 필드 주입이나 세터 주입은 순환 참조를 허용하기 때문에 문제가 런타임 시점에 발견된다.