🌿 스프링/김영한

의존관계 자동 주입

le2donguk 2025. 8. 25. 00:44

스프링 의존관계 자동 주입 정리 ✨

지난 글에서는 스프링 컨테이너 생성 과정빈 등록까지 살펴봤습니다.
이제 본격적으로, 등록된 빈들 사이의 의존관계를 어떻게 주입하는지 정리해 보겠습니다.


💡 의존관계 주입 방법

스프링에서는 크게 네 가지 방식으로 의존관계를 주입할 수 있습니다.

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 주입

 왜 생성자 주입을 권장할까?

  1. 불변성 → 대부분의 의존관계는 바뀌지 않으므로 처음 설정 후 그대로 두는 게 안전
  2. 누락 방지 → Setter 방식처럼 실수로 값을 안 넣어서 생기는 오류 방지
  3. final 키워드 활용 → 컴파일 시점에 의존관계 누락을 잡아낼 수 있음

🔍 조회 대상 빈이 여러 개일 때

의존성이 여러 빈과 매칭될 경우 스프링은 다음 규칙으로 해결합니다.

  1. 필드명/파라미터명 매칭
    → 타입이 동일한 빈이 여러 개라면 이름으로 추가 매칭
  2. @Qualifier
    → 특정 구분자를 붙여서 원하는 빈만 선택
  3. @Primary
    → 여러 후보 중 우선순위를 갖도록 지정 (가장 많이 사용)

✨ 정리

  • 가장 권장되는 방식은 생성자 주입
  • 상황에 따라 수정자나 옵션 주입을 보완적으로 사용
  • 빈 중복 문제는 @Qualifier@Primary로 해결

 

마무리..

스프링을 처음 배우면 의존관계 주입 방식이 헷갈릴 수 있는데, 핵심은 생성자 주입을 기본으로 가져가고, 특별한 경우에만 다른 방식을 쓴다는 겁니다. 잘 모르겠으면 생성자 주입 방식으로 쓰자!