Back-End/Spring

[Spring][스프링 기본편] - 20. 의존관계 주입

얄루몬 2022. 1. 28. 09:56

[의존관계 주입의 종류]

  • 생성자 주입
  • 수정자 주입
  • 필드 주입
  • 일반 메서드 주입

 

 

 

[생성자 주입]

  • 생성자를 통해서 의존 관계를 주입 받는 방식이다. 
  • 불변, 필수적인 의존 관계에서 사용한다.
    • 생성자의 경우 한 번만 호출이 보장되기 때문에 불변적인 경우에 생성자 주입을 한다.
    • final이 붙어 객체를 꼭 돌려줘야 하는 필수적인 경우에 생성자 주입을 한다.
public class MemberServiceImpl implements MemberService{
    private final MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

 

[참고할 사항]

생성자가 1개만 있을 땐 @Autowired를 써주지 않아도 스프링빈이 자동 등록을 해준다. (이것은 물론 스프링 빈에서만 해당하는 사항이다.)

 

 

 

[수정자 주입 - 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)로 지정해주면 된다.
  • 자바빈 프로퍼티, 자바에서는 과거부터 필드의 값을 직접 변경하지 않고 setXXX,getXXX라는 메서드를 통해 값을 읽거나 수정하는 규칙을 만들었는데, 그것이 자바빈 프로퍼티 규약이다.

 

 

 

[필드 주입]

  • 필드에 바로 주입하는 방식이다.
    • 코드가 간결해서 사용하기는 쉽지만 외부 변경이 불가해 테스트가 힘들다
    • DI 프레임워크가 없으면 아무것도 할 수 없다.
    • 순수한 자바 코드로 테스트를 할 수 없다는 것이다.
    • 요즘은 사용하지 않는 추세이다
    • 사용하는 곳
      • 애플리케이션과 관련 없는 테스트 코드
      • 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용

 

@Component
public class OrderServiceImpl implements OrderService {
    @Autowired
    private MemberRepository memberRepository;
    @Autowired
    private DiscountPolicy discountPolicy;
}

 

[참고할 사항]

  • 순수한 자바 테스트 코드에는 당연히 @Autowired가 동작하지 않는다. @SpringBootTest 처럼 스프링 컨테이너를 테스트에 통합한 경우에만 가능하다.
  • 다음 코드와 같이 @Bean 에서 파라미터에 의존관계는 자동 주입된다. 수동 등록시 자동 등록된 빈의 의존관계가 필요할 때 문제를 해결할 수 있다

 

 

 

[일반 메서드 주입]

  • 일반 메서드를 통해서도 주입 받을 수 있다.
    • 한번에 여러 필드를 주입 받을 수 있다.
    • 일반적으로는 잘 사용하지 않는다.

 

 

 

[출처]

https://inf.run/7GX1

 

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

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com