Spring/스프링 핵심 원리 - 기본편

의존관계 자동 주입 - 애노테이션 직접 만들기

코징 2022. 3. 18. 16:43

@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일 시 타입 체크가 안된다. 이렇게 될 경우 mainDisccountPolicy처럼 오타가 나도 해당하는 코드가 문제가 발생했는지 모르고 진행될 경우가 발생한다.

 

애노테이션을 직접 만들어서 변경을 해주자.

 

1) MainDiscountPolicy를 만들자

  • 애노테이션은 상속이라는 개념이 없다. 이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원해 주는 것이다.
package hello.core.annotation;

import org.springframework.beans.factory.annotation.Qualifier;

import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
        ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier("mainDiscountPolicy") // 해당하는 애노테이션을 지정해준다.
public @interface MainDiscountPolicy {

}

 

2) 주입되는 Qulifier를 수정해 주자.

  • Stirng이 아닌 애노테이션으로 변경으로 해당코드에 오타가 발생돼 시 바로 예측할 수 있다.
  • 우리는 이제 빈이 충돌 났을때 위와 같이 @MainDiscountPlicy 애노테이션을 통해서 맞춰줄 수 있다.

 

 

 변경 전

@Autowired
public OrderServiceImpl(MemberRepository memberRepository, 
						@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
     this.memberRepository = memberRepository;
     this.discountPolicy = discountPolicy;
}

변경 후


@Autowired
public OrderServiceImpl(MemberRepository memberRepository, 
						@MainDiscountPolicy DiscountPolicy discountPolicy)) {
     this.memberRepository = memberRepository;
     this.discountPolicy = discountPolicy;
}

 

결론

위와 같이 번거롭게 변경을 왜 해줘야 되는지 처음에는 와닿지 안았다.

하지만 Stirng자체가 컴파일시 오류를 찾아내기 너무 힘들기 때문에 번거롭더라도 위와 같이 애노테이션을 만들어서 사용하는걸 적극 권장한다.

하지만 무엇보다 중요한것 적절한 위치에 @Qualifier와 @Primary를 사용하는 게 제일 좋다.!

 

이 글은 인프런의

제목 : 스프링 핵심 원리 - 기본편

강사 : 김영한 님의 동영상을 참조해 만들었습니다.