Backend
home
🎯

DI 방식별 코드 (생성자 주입 vs 필드 주입 vs 세터 주입)

생성 일시
2025/05/04 16:44
태그
SpringBoot
게시일
2025/05/05
최종 편집 일시
2025/05/08 09:36

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 객체 주입 가능)
순환참조 컴파일 시점에 탐지 가능
단점
생성자가 길어질 수 있음 (많은 의존성이 있을 때)
Spring 공식 권장 방식

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로 언제든지 바꿀 수 있음)
필수 의존성일 때는 적합하지 않음 (생성자 주입이 나음)
선택적 의존성이나, Bean 생성 후 변경이 필요한 경우 사용
DI 방식
장점
단점
실무 추천 여부
생성자 주입
불변성 보장, 테스트 용이
생성자 길어질 수 있음
권장
필드 주입
코드 간결
테스트 어려움, 불변성 약함
지양
세터 주입
선택적 의존성에 적합
불변성 보장 어려움
⭕️ 제한적 사용

면접 답변 팁

"Spring에서는 보통 생성자 주입을 권장합니다. 의존성을 불변하게 만들고, 테스트나 유지보수에 유리하기 때문입니다. 필드 주입은 간편하지만 테스트가 어렵고 순수 Java 환경에서 재사용이 불가능해 실무에서는 지양하는 편입니다."