티스토리 뷰

SPRING

[SPRING] 의존 관계 주입 방법

혀내 2022. 7. 18. 20:11
반응형

의존관계 주입 방법

생성자 주입

  • 객체가 생성될 때 딱 1번만 호출된다.
  • 실수로 변경될 일이 없고, 의존관계 주입이 누락되는 경우를 미연에 방지할 수 있어 가장 선호되는 방법이다.
  • final 키워드를 사용하면 필드 값이 설정되지 않는 오류를 컴파일 시점에 막을 수 있다.
@Component
public class OrderService {
    private final MemberRepository memberRepository;
    
    @Autowired
    public OrderService(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
    
    ...
}

생성자가 하나만 있으면 @Autowired가 없어도 자동으로 주입된다.

 

 

수정자(setter) 주입

  • 필드 값을 변경할 때 사용되는 수정자 메소드를 통해 의존관계를 주입한다.
@Component
public class OrderService {
    private MemberRepository memberRepository;
    
    @Autowired
    public setMemberRepository(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
    
    ...
}

 

필드 주입

  • 필드 변수를 통해 바로 의존관계를 주입한다.
  • 외부에서 변경이 불가능해 테스트가 힘들다. → 사용 X
@Component
public class OrderService {
    @Autowired private MemberRepository memberRepository;
}

 

 

일반 메서드 주입

  • 일반적으로 잘 사용되지 않는다.
@Component
public class OrderService {
    private MemberRepository memberRepository;
    
    @Autowired
    public void init(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
    
    ...
}
  • 스프링 컨테이너가 관리하는 스프링 빈이어야 의존관계가 자동 주입된다는 점을 유념한다.

 

 

의존관계 주입을 필수가 아닌 선택적으로 하고 싶을 때

  • @Autowired(required=false) : 자동 주입 대상이 없으면 주입 메서드 자체가 호출되지 않는다.
  • org.springframework.lang.@Nullable : 자동 주입 대상이 없으면 null이 입력된다.
  • Optional<> : 자동 주입 대상이 없으면 Optional.empty가 입력된다

 

 

생성자 주입 메서드 작성이 귀찮다면 롬복을 사용하자

롬복(Lombok) 라이브러리는 생성자, getter/setter 메소드를 어노테이션으로 대체해 사용할수 있도록 도와준다.

 

@Component
@RequiredArgsConstructor
public class OrderService {
    private final MemberRepository memberRepository;
        
    ...
}
  • 의존관계 주입이 필요한 필드에 final 키워드를 추가하고, @RequiredArgsConstructor 어노테이션을 붙이면 생성자 메소드를 직접 작성하지 않아도 된다.

 

 

조회되는 빈이 여러개인 경우

@Autowired 필드 명 매칭

@Autowired
privte DiscountPolicy rateDiscountPolicy;
  • 스프링 컨테이너는 DiscountPolicy 타입의 빈 객체 중 rateDiscountPolicy 빈을 주입한다.

 

@Qualifier 사용

  • 추가 구분자를 설정하는 어노테이션이다.
  • 주입 받을 때 모든 코드에 @Qualifier 어노테이션을 붙여주어야 한다.
  • 우선 순위가 가장 높다.
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy { ... }


@Component
@Qualifier("subDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy { ... }

 

  • @Qualifier("mainDiscountPolicy")를 찾지 못하면 mainDiscountPolicy라는 이름의 빈을 추가로 찾는다.
@Autowired
public OrderServiceImpl(@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
  ...
}

 

@Primary 사용

  • 여러 개의 스프링 빈 중 우선적으로 사용하고 싶은 빈에 어노테이션을 붙인다.
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy { ... }


@Component
public class FixDiscountPolicy implements DiscountPolicy { ... }

 

 

출처: 

 

 

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

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

www.inflearn.com

 

반응형