반응형
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에서는 생성자 주입을 기본 원칙으로 사용하고, 필드 주입과 세터 주입은 특수한 상황에서만 제한적으로 사용하도록 합시다.
반응형
'Programming > Spring' 카테고리의 다른 글
fetch join은 페이징 불가? (관계에 따른 진실과 Querydsl의 대응 전략) (0) | 2025.07.15 |
---|---|
JPA N+1 문제 정복하기: fetch join부터 batch size까지 실전 해결 전략 (0) | 2025.07.15 |
[Part 2] JPA 실전 설계 전략: DTO, Entity, VO, Projection 구분법 (1) | 2025.07.14 |
[Part 1] Spring 패키지 구조 설계 전략: MVC vs 도메인 중심 (0) | 2025.07.14 |
Spring 트랜잭션에서 `@Transactional`이 무시되는 이유와 주의할 점 (0) | 2025.07.14 |