의존 관계 주입 방법
의존 관계를 주입 하는 방법은 4가지 방법이 있다 -> [생성자 주입, 수정자(setter) 주입, 필드 주입, 일반 메서드 주입]
생성자 주입
이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방식 -> 즉 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다.
final 키워드가 붙어있는 불변, 필수 의존관계에 사용한다.
(참고로 생성자가 밑에처럼 하나면 @AutoWired 를 생략해도 된다.)
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@AutoWired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
수정자 (Setter) 주입
자바 프로퍼티 규약에 따른 Getter 와 Setter 메서드 방식을 사용하는 방법으로, 선택이나 변경 가능성이 있는 의존 관계에 사용한다.
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@AutoWired
public setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@AutoWired
public setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
참고로 자바빈 프로퍼티란 자바에서 필드의 값에 직접 접근하여 변경하는 대신 setXXX 와 getXXX 라는 메서드를 통해 값을 읽거나 수정하는 규칙을 의미한다.
필드 주입
필드에 바로 주입하는 방법인데 ,이는 권장하지 않는 방법이다(DI 프레임워크가 없으면 아무것도 할 수 없기 때문).
사용 법은 필드에 @AutoWired를 붙이는 것이다.
@Component
public class OrderServiceImpl implements OrderService {
@AutoWired
private final MemberRepository memberRepository;
@AutoWired
private final DiscountPolicy discountPolicy;
}
순수 자바 코드(DI 프레임워크 X) 로 테스트시 @AutoWired는 동작하지 않기 때문에 테스트 작성에도 불리하다.
일반 메서드 주입
일반 메서드로 주입 받는 방법 -> 한번에 여러 필드 주입 가능하지만 잘 사용하진 않는다.
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@AutorWired
public void init(MemberRepository memberRepository , DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
당연하지만 중요한 내용
의존 관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 한다. 일반 자바 객체(Member) 처럼 스프링 빈이 아닌 일반 자바 객체에 @AutoWired를 적용해도 아무 기능도 동작하지 않는다.
'Spring > Core' 카테고리의 다른 글
| [Spring] 한 컨테이너 안에 같은 타입의 빈이 2개라면? (0) | 2025.06.19 |
|---|---|
| [Spring] DI : 생성자 주입을 선택해야 하는 이유 (0) | 2025.06.19 |
| [Spring] @ComponentScan , @AutoWired - 자동 Bean 등록 (0) | 2025.06.16 |
| [Spring] Singleton 패턴 : 인스턴스 아나바다 운동 (0) | 2025.06.16 |
| [Spring] 스프링 컨테이너 - ApplicationContext, Bean 조회 (0) | 2025.06.16 |