Programming/Spring

Spring DI란? 주입 방식의 종류와 기본 개념

kwanghyun 2025. 7. 14. 21:38
반응형

Spring에서 가장 중요한 개념 중 하나인 DI(Dependency Injection, 의존성 주입)은 객체 간의 의존 관계를 외부에서 주입해주는 방식입니다. 이 글에서는 DI가 무엇인지, 그리고 어떤 방식으로 의존성을 주입할 수 있는지 정리해보겠습니다.

✅ 의존성 주입(DI)이란?

  • 객체 간의 협업이 필요할 때, 직접 객체를 생성하지 않고 외부에서 주입받는 방식입니다.
  • Spring에서는 DI를 통해 객체 간 결합도를 낮추고, 테스트 및 유지보수를 용이하게 만듭니다.

예: UserService가 UserRepository를 필요로 할 때 직접 생성하지 않고 외부에서 주입받음


💡 DI 방식의 종류

Spring에서는 의존성 주입을 다음과 같은 방식으로 지원합니다:

1. 필드 주입 (Field Injection)

@Component
public class UserService {
    @Autowired
    private UserRepository userRepository;
}
  • 가장 간단하게 쓸 수 있는 방식
  • Spring이 리플렉션으로 private 필드에 값을 주입
  • 테스트나 유지보수에 불리하다는 단점이 있음

👉 요약: 편하지만 테스트 어려움, 불변성 없음


2. 생성자 주입 (Constructor Injection)

@Component
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
  • 가장 권장되는 방식
  • 의존성이 명확하게 보이며, final 사용 가능 → 불변성 보장
  • 단위 테스트 시 주입이 편리함

👉 요약: 명시성 높고 안전함, 실무/면접 모두 추천


3. 세터 주입 (Setter Injection)

@Component
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
  • 선택적 의존성을 처리할 때 유리
  • 외부에서 주입을 변경할 수 있어 유연성 ↑
  • 하지만 의존성 보장이 약하고 불변성 유지가 어려움

👉 요약: 선택적 DI나 순환참조 해결에 활용


🎯 언제 어떤 주입 방식을 쓸까?

주입 방식 장점 단점 추천 여부
생성자 주입 불변성, 명시성, 테스트 용이 생성자 길어질 수 있음 ⭐️ 가장 권장
필드 주입 코드 간결 테스트 어려움, 불변성 없음 ❌ 비추천
세터 주입 유연성, 순환 참조 대응 불변성 없음, 누락 위험 ⚠️ 제한적으로 사용

✍️ 마무리

DI는 객체 간 관계를 깔끔하게 유지하면서도 테스트 가능하고 확장 가능한 구조를 만드는 핵심입니다.
Spring에서는 생성자 주입을 기본 원칙으로 사용하고, 필드 주입과 세터 주입은 특수한 상황에서만 제한적으로 사용하도록 합시다.

반응형