1. 생성자 주입 (Constructor Injection) - 실무 권장 방식
@Component
public class OrderService {
private final UserRepository userRepository;
// 생성자 주입
@Autowired
public OrderService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void order() {
// 비즈니스 로직
}
}
Java
복사
•
불변성 보장 (final 사용 가능)
•
테스트 용이 (생성자 파라미터로 Mock 객체 주입 가능)
•
순환참조 컴파일 시점에 탐지 가능
•
생성자가 길어질 수 있음 (많은 의존성이 있을 때)
2. 필드 주입 (Field Injection) -
비추천
@Component
public class OrderService {
@Autowired
private UserRepository userRepository; // 필드에 직접 주입
public void order() {
// 비즈니스 로직
}
}
Java
복사
•
코드 간결 (가장 짧고 편리)
•
빠르게 개발할 때 임시로 사용 가능
•
테스트 어려움 (Reflection 없이는 Mock 객체 주입 불가)
•
불변성 약함
•
순환참조 문제 탐지 어려움
•
DI 프레임워크(Spring)에 100% 의존적 → 순수 Java에서 사용 불가
3. 세터 주입 (Setter Injection) — 선택적 의존성에 사용
@Component
public class OrderService {
private UserRepository userRepository;
// 세터 메서드에 @Autowired
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void order() {
// 비즈니스 로직
}
}
Java
복사
•
선택적 의존성 주입 가능 (필수 아님)
•
테스트 시 Mock 객체 주입 가능
•
불변성 보장 안됨 (setter로 언제든지 바꿀 수 있음)
•
필수 의존성일 때는 적합하지 않음 (생성자 주입이 나음)
DI 방식 | 장점 | 단점 | 실무 추천 여부 |
생성자 주입 | 불변성 보장, 테스트 용이 | 생성자 길어질 수 있음 | |
필드 주입 | 코드 간결 | 테스트 어려움, 불변성 약함 | |
세터 주입 | 선택적 의존성에 적합 | 불변성 보장 어려움 | ⭕️ 제한적 사용 |
면접 답변 팁
"Spring에서는 보통 생성자 주입을 권장합니다. 의존성을 불변하게 만들고, 테스트나 유지보수에 유리하기 때문입니다. 필드 주입은 간편하지만 테스트가 어렵고 순수 Java 환경에서 재사용이 불가능해 실무에서는 지양하는 편입니다."