티스토리 뷰

 본 포스팅은 인프런 김영한 강사님의 스프링 부트 핵심 원리 강의 섹션 7을 수강하고 배운 점을 정리했습니다.

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com


 

다양한 의존관계 주입 방법

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. 필드 주입

✅ 이름 그대로 필드에 바로 주입하는 방법이다.

외부에서 변경이 불가능해서 테스트하기 힘들다는 치명적인 단점이 있다.

애플리케이션의 실제 코드와 관계없는 테스트 코드나 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용한다.

 

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

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함