Spring에서 의존성 주입(DI, Dependency Injection)
을 하는 방식은 생성자 주입, 필드 주입, setter 주입 이렇게 3가지가 있다.
생성자 주입 (Constructor Injection)
@Component
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
특징
- 불변성 보장:
final
사용 가능 -> 생성 이후 값 변경 불가 - 테스트에 용이: 필요한 의존성을 명확하게 알 수 있음
- 의존성 누락 방지: 주입하지 않으면 컴파일/런타임 에러 발생
단점
- 생성자 인자가 너무 많아지면 가독성 저하
필드 주입 (Field Injection)
@Component
public class MemberService {
@Autowired
private MemberRepository memberRepository;
}
특징
- 가장 간단한 방식, 코드량이 적음
단점
- 키워드 사용 불가 -> 값의 불변성을 보장하지 않는다.
- 테스트 어려움: Mock 주입하려면 리플렉션을 사용해야 한다.
- DI 프레임워크에 강하게 결합된다. -> 외부에서 주입 불가능
- 생성 시점 확인이 어렵다.
Setter 주입 (Setter Injection)
@Component
public class MemberService {
private MemberRepository memberRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
특징
- 선택적 의존성 주입에 적합 (null 가능성이 있음)
- 유연성: 초기화 이후 변경 가능
단점
- 객체가 완전히 초기화되지 않은 상태로 사용될 위험
- 변경 가능성이 생김 -> 안정성이 낮다.
보통은 생성자 주입을 권장한다. 안전하고 명확하여 테스트에 유리하기 때문이다.