DI (Dependency Injection)
의존성 주입은 객체 간의 의존성을 설정하는 방법이다.
Spring 컨테이너에 여러 컴포넌트를 빈(Bean)으로 등록하여 객체의 생명주기 관리를 위임하고 빈으로 등록된 객체를 주입받아서 사용할 수 있다.
의존성 주입 방법
의존성 주입에는 다음과 같은 방법들이 있다.
- 생성자 주입 (Constructor Injection)
- 세터 주입 (Setter Injection)
- 필드 주입 (Field Injection)
- 일반 메서드 주입 (Method Injection)
이 중에서 생성자 주입을 가장 많이 사용하며 Spring에서도 공식적으로 권장하는 방법이다.
생성자 주입
생성자를 통해 의존성을 주입하는 방법이다. 생성자 호출 시점에 딱 한 번만 호출되며 이후에는 변경이 불가능하다.
주로 불변(immutable)하고 필수적인 의존관계에 사용된다.
✅ 생성자가 하나뿐이면 @Autowired를 생략해도 자동으로 주입된다.
✅ Lombok의 @RequiredArgsConstructor를 사용하면 private final로 선언된 필드를 대상으로 생성자를 자동으로 생성한다.
세터 주입
세터 메서드를 이용하여 의존성을 주입하는 방법이다. 선택적(optional)이고 변경 가능성이 있는 의존관계에 사용된다.
필수 의존성이 설정되지 않아도 객체가 생성될 수 있으므로, 런타임 시점에 NullPointerException이 발생하기에 잘 사용하지 않는다.
필드 주입
필드에 직접 주입하는 방법이다. 의존성이 숨겨져 있어 테스트나 유지보수가 어려운 단점이 있어 잘 사용하지 않는다.
예를 들어 단위 테스트 시에 Mock 객체 등을 주입하기 어렵다.
일반 메서드 주입
일반적인 메서드를 이용하여 의존성을 주입하는 방법이다. 한 번에 여러 필드를 주입할 수 있다.
필드 주입과 마찬가지로 잘 사용되지 않는다.
생성자 주입을 사용하는 이유
Spring에서 공식적으로 생성자 주입을 권장하는 이유는 다음과 같다.
불변성 보장
생성자 주입을 사용하면 의존성을 private final로 선언하여 객체 생성 이후에는 의존성이 변경되지 않도록 할 수 있다.
의존성 명시화
생성자를 통해 필요한 의존성을 명확하게 표시할 수 있다.
테스트 용이성
생성자 주입을 사용하면 DI 컨테이너 없이도 순수 자바 코드로 객체를 생성하여 테스트할 수 있다.
순환 참조 방지
생성자 주입을 사용하면 순환 참조가 있을 경우 애플리케이션 구동 시점에 빨리 발견할 수 있다. 반면에 필드 주입이나 세터 주입은 순환 참조를 허용하기 때문에 문제가 런타임 시점에 발견된다.
'Dev > Spring Framework' 카테고리의 다른 글
『Spring MVC』 필터, 인터셉터 (0) | 2024.11.26 |
---|---|
『Spring MVC』 메시지, 국제화 (0) | 2024.11.26 |
『Spring Boot』 Spring Boot Annotation 정리 (1) | 2024.11.25 |
『Spring Core』 Bean Scopes (0) | 2024.11.19 |
『Spring Core』 Bean LifeCycle (2) | 2024.11.07 |