[스프링 핵심원리 기본편] 7.6 애노테이션 직접 만들기

코린이서현이·2023년 11월 14일
0

📌 애노테이션 직접 만들기

📒 애노테이션은 상속이 없고 조합만 제공한다.

앞선 글에서 @Qualifier("mainDiscountPolicy")를 사용해서 중복 빈 등록 문제를 해결하는 걸 배웠다.
그러나 이 문제에는 문제점이 하나 있다.

⚠️ 오탈자를 잡아줄 수 없다. 
타입으로 지정할 수 없기 때문에 잘못쓰더라도 컴파일 오류를 내지 않는다.

➡️ 변수 int name을 등록하고 내가 naam 이렇게 하면 컴파일 오류가 나는데 위의 경우는 그러지 못함

따라서 @Qualifier("mainDiscountPolicy")보다는 타입을 지정할 수 있는 애노테이션을 직접만드는 것이 더 안전하다. 

🔨 애노테이션 만들기

👤 나는 @Qualifier의 기능을 하는 애노테이션을 만들고자 한다.

@Qualifier 애노테이션 코드

👉 @Qualifier기능을 가능하게 해주는 애노테이션 확인

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Qualifier {

	String value() default "";

}

원하는 애노테이션 파일 만들기

@Qualifier기능을 가능하게 해주는 애노테이션 ➕ @Qualifier

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolich")		
public @interface MainDiscountPolich {
}

👉 지정 명의 애노테이션이 생김
➡️ 하나의 타입으로 지정할 수 있어 컴파일 단계에서 오탈자 오류를 막을 수 있다.

@MainDiscountPolich
👉 @Qualifier("mainDiscountPolicy") 역할을 하게하는 애노테이션
🤔 @Qualifier에 다른 애노테이션들이 포함되니까 @Qualifier만 있으면 되는거 아닌가? 🙅 애노테이션은 상속의 개념이 없고, 조합으로 기능을 지원한다.

👏 적용해보기

@Component
public class OrderServiceImpl implements  OrderService{

  private final MemberRepository memberRepository;
  private final DiscountPolicy discountPolicy;


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

😮마무리하면서😮

애노테이션은 조합이 가능하다~ 

🤔 생각해보기

애노테이션을 직접 만드는게 적절할 때는 언제일까?
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글