본문 바로가기
SPRING

[SPRING] 의존관계 주입

by 잉나영 2024. 5. 25.
반응형

1. 의존관계 주입 방법

  1. 생성자 주입
  2. 수정자 주입(setter 주입)
  3. 필드 주입
  4. 일반 메서드 주입

(1) 생성자 주입

: 이름 그대로 생성자를 통해서 의존관계를 주입받는 방법

 

특징) 

- 생성자 호출시점에 딱 1번만 호출되는 것 보장

- 불변, 필수 의존관계에서 사용됨

 

@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;
 }
}

! 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동주입됨 (스프링 빈에만 해당)

 


(2) 수정자 주입 (setter 주입)

: setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해 의존관계를 주입

 

특징) 

- 선택, 변경 가능성이 있는 의존관계에 사용

- 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법

 

@Component
public class OrderServiceImpl implements OrderService {

 private MemberRepository memberRepository;
 private DiscountPolicy discountPolicy;
 
 @Autowired
 public void setMemberRepository(MemberRepository memberRepository) {
 	this.memberRepository = memberRepository;
 }
 
 @Autowired
 public void setDiscountPolicy(DiscountPolicy discountPolicy) {
 	this.discountPolicy = discountPolicy;
 }
}

참고 : @Autowired의 기본동작은 주입할 대상이 없으면 오류가 발생함. 주입할 대상이 없어도 동작하게 하려면 @Autowired(required = false)로 지정할 것

 


(3) 필드 주입

: 필드에 바로 주입하는 방법

 

특)

- 코드가 간결해서 많은 개발자를 유혹하지만 외부에서 변경이 불가능해서 테스트하기가 힘들다

- DI 프레임워크가 없으면 아무것도 할 수 없음

-> 사용하지 말것

@Component
public class OrderServiceImpl implements OrderService {

 @Autowired
 private MemberRepository memberRepository;
 @Autowired
 private DiscountPolicy discountPolicy;
 
}

 


(4) 일반 메서드 주입

: 일반 메서드를 통해서 주입을 받는 방식

 

특)

- 한번에 여러 필드를 주입받을 수 있음

- 일반적으로 잘 사용하지는 않음

 

@Component
public class OrderServiceImpl implements OrderService {

 private MemberRepository memberRepository;
 private DiscountPolicy discountPolicy;
 
 @Autowired
 public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
 	this.memberRepository = memberRepository;
 	this.discountPolicy = discountPolicy;
 }
}

의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작함.

스프링 빈이 아닌 Member 같은 클래스에서 @Autowired 코들르 적용해도 아무 기능도 동작하지 않음

 

반응형

'SPRING' 카테고리의 다른 글

스프링 - 컨테이너  (0) 2024.05.22
스프링 핵심 원리 이해1 - 예제 만들기2  (0) 2024.05.15
SPRING 핵심 원리 이해1 - 예제 만들기  (0) 2024.05.11
SPRING 개념  (0) 2024.05.04
SPRING 이란  (1) 2024.05.01