스프링 의존관계 자동 주입 정리 ✨
지난 글에서는 스프링 컨테이너 생성 과정과 빈 등록까지 살펴봤습니다.
이제 본격적으로, 등록된 빈들 사이의 의존관계를 어떻게 주입하는지 정리해 보겠습니다.
💡 의존관계 주입 방법
스프링에서는 크게 네 가지 방식으로 의존관계를 주입할 수 있습니다.
1. 생성자 주입 (Constructor Injection)
- 객체 생성 시점에 단 한 번 호출
- 불변(immutable), 필수 의존관계에 적합
- 생성자가 1개뿐이라면 @Autowired 생략 가능
- 롬복의 @RequiredArgsConstructor와 함께 자주 사용
👉 특징: 빈 등록 과정에서 이미 의존관계가 해결됨.
즉, 객체가 만들어질 때부터 안정적인 의존성을 갖게 됩니다
@RequiredArgsConstructor @Service public class OrderService
{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; }
2. 수정자 주입 (Setter Injection)
- 빈을 생성한 뒤, 별도의 의존관계 주입 단계에서 호출
- @Autowired를 Setter 메서드에 붙여 사용
- 선택적 의존관계나 변경 가능성이 있는 경우 활용
3. 필드 주입 (Field Injection)
- 코드가 간단해서 많이들 쓰지만, 테스트가 어려움
- 외부에서 값을 바꿀 수 없으므로 지양하는 편이 좋음
@Autowired private DiscountPolicy discountPolicy;
4. 일반 메서드 주입
- 아무 메서드에나 @Autowired 붙여 사용 가능
- 여러 의존성을 한 번에 주입할 수 있지만, 잘 사용하지는 않음
스프링 빈이 없어도 동작하게 하기
가끔 테스트 환경에서는 스프링 빈 대신 일반 자바 객체를 넣고 싶을 때가 있습니다.
이럴 때는 아래 옵션들을 활용할 수 있습니다.
- @Autowired(required = false) → 대상이 없으면 메서드 자체 호출 안 함
- @Nullable → 없으면 null 주입
- Optional <> → 없으면 Optional.empty 주입
왜 생성자 주입을 권장할까?
- 불변성 → 대부분의 의존관계는 바뀌지 않으므로 처음 설정 후 그대로 두는 게 안전
- 누락 방지 → Setter 방식처럼 실수로 값을 안 넣어서 생기는 오류 방지
- final 키워드 활용 → 컴파일 시점에 의존관계 누락을 잡아낼 수 있음
🔍 조회 대상 빈이 여러 개일 때
의존성이 여러 빈과 매칭될 경우 스프링은 다음 규칙으로 해결합니다.
- 필드명/파라미터명 매칭
→ 타입이 동일한 빈이 여러 개라면 이름으로 추가 매칭 - @Qualifier
→ 특정 구분자를 붙여서 원하는 빈만 선택 - @Primary
→ 여러 후보 중 우선순위를 갖도록 지정 (가장 많이 사용)
✨ 정리
- 가장 권장되는 방식은 생성자 주입
- 상황에 따라 수정자나 옵션 주입을 보완적으로 사용
- 빈 중복 문제는 @Qualifier와 @Primary로 해결
마무리..
스프링을 처음 배우면 의존관계 주입 방식이 헷갈릴 수 있는데, 핵심은 생성자 주입을 기본으로 가져가고, 특별한 경우에만 다른 방식을 쓴다는 겁니다. 잘 모르겠으면 생성자 주입 방식으로 쓰자!
'🌿 스프링 > 김영한' 카테고리의 다른 글
| 1. 스프링 컨테이너와 스프링 빈 (0) | 2026.02.08 |
|---|---|
| 2. 서블릿 (0) | 2026.02.07 |
| 1. 웹 애플리케이션의 이해 (0) | 2026.02.07 |
| 빈 생명주기 콜백 함수 와 빈 스코프 (2) | 2025.08.25 |
| 스프링 컨테이너생성 과 Component Scan (1) | 2025.08.25 |