Spring Boot에서 의존성 주입: Spring이 모든 것을 연결해 주는 방법
Source: Dev.to

의존성 주입이란?
Dependency Injection (DI) 은 Spring Boot에서 느슨한 결합(loose coupling) 을 구현하기 위해 사용되는 설계 패턴입니다.
간단히 말하면: 클래스가 스스로 의존성을 생성하는 대신, 그 의존성들을 외부에서 제공받습니다 — 그리고 Spring Boot에서는 이 역할을 Spring IoC 컨테이너가 담당합니다. 이 접근 방식 덕분에 애플리케이션이 더 깔끔하고, 유연하며, 유지보수가 쉬워집니다.
간단한 예제로 DI 이해하기
예를 들어:
- 앨리스는 케이크를 만들기 위해 프로스팅과 시럽이 필요합니다.
- 앨리스는 프로스팅이나 시럽을 직접 만들지 않습니다.
대신, 프로스팅과 시럽이 외부에서 앨리스에게 주입됩니다. 이것이 바로 Spring에서 의존성 주입이 작동하는 방식입니다.
Spring Boot에서의 의존성 주입
- 객체를 **빈(Bean)**이라고 부릅니다.
- 빈은 IoC 컨테이너에 의해 관리됩니다.
- 의존성은 런타임에 자동으로 주입됩니다.
클래스는 비즈니스 로직에만 집중하고, 의존성 생성에 대해서는 신경 쓸 필요가 없습니다.
의존성 주입의 장점
느슨한 결합
구성 요소가 구체적인 구현에 의존하지 않으므로, 애플리케이션을 유지보수하고 확장하기가 쉬워집니다.
유연한 설정
의존성을 외부에서 설정할 수 있어, 코드를 변경하지 않고도 손쉽게 교체할 수 있습니다.
향상된 테스트 가능성
테스트 시 의존성을 모킹하거나 교체할 수 있어, 신뢰성 높고 격리된 단위 테스트가 가능합니다.
Spring Boot에서 의존성을 주입하는 방법
1. 생성자 주입
의존성을 클래스 생성자를 통해 제공받습니다.
선호되는 이유:
- 필수 의존성이 반드시 존재함을 보장합니다.
- 불변성을 장려합니다.
- 테스트가 쉬워집니다.
실제 Spring Boot 프로젝트에서는 이 방식이 권장됩니다.
2. 필드 주입
@Autowired를 사용해 클래스 필드에 직접 의존성을 주입합니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyService {
@Autowired
private MyRepository repository;
// ...
}
간단하지만, 필드 주입은 다음과 같은 문제점이 있습니다.
- 의존성이 숨겨집니다.
- 테스트가 어려워집니다.
- 프로덕션 애플리케이션에서는 권장되지 않습니다.
실제 프로젝트에서 의존성 주입이 중요한 이유
DI 없이:
- 코드가 강하게 결합됩니다.
- 변경이 여러 클래스에 영향을 미칩니다.
- 테스트가 어려워집니다.
DI와 함께:
- 애플리케이션이 모듈화됩니다.
- 코드가 깔끔하고 유지보수가 용이합니다.
- 시스템이 더 잘 확장됩니다.
의존성 주입은 깔끔한 Spring Boot 아키텍처의 기반입니다.
마무리 생각
Dependency Injection을 이해하는 것은 Spring Boot 학습에서 중요한 이정표입니다. DI가 명확해지면 빈(Bean), IoC 컨테이너, 그리고 Spring 어노테이션과 같은 개념들이 자연스럽게 이해됩니다.