jhhan의 블로그

스프링 코어(번외-1) - 애노테이션 직접 만들기 본문

Spring

스프링 코어(번외-1) - 애노테이션 직접 만들기

jhhan000 2021. 8. 13. 22:47

이번 포스트는 그렇게까지 중요한 포스트는 아닙니다.

직접 애노테이션을 만들고 적용해보는 것을 해보려고 합니다.

 

 

 

이전 시간에 조회한 빈이 여러 개인 경우에 대한 해결책에 대해 살펴봤습니다.

그 중에서 @Qualifier에 대해서 알아봤는데요.

@Qualifier의 단점이 있습니다.

예시를 한 번 보겠습니다.

@Component
@Qualifier("mainnDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy

만약 @Qualifier의 이름을 mainnDiscountPolicy라고 잘못 입력하면 어떻게 될까요?

당연히 에러가 납니다.

하지만 컴파일 시에 에러가 나지 않습니다.

그러면 앱이 구동된 후에 문제가 생겼다는 것을 알게 될 것입니다.

 

그럼 컴파일 단계에서 에러가 날 수 있게 해보겠습니다.

hello.core 밑에 annotation 패키지를 만들고 MainDiscountPolicy라는 애노테이션 클래스를 만듭니다.

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

그리고 MainDiscountPolicy를 다음과 같이 작성합니다.

 

참고로 @Qualifier를 제외한 다른 애노테이션들은 @Qualifier 애노테이션이 가지는 다른 애노테이션들을 그대로 가져왔습니다.

@Qualifier 애노테이션에 Ctrl + 마우스 클릭을 하시면 보실 수 있습니다.

 

이렇게 하면 하나의 애노테이을 직접 만들어 봤습니다.

그럼 이제 만든 애노테이션을 적용해봅니다.

@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy

RateDiscountPolicy 파일에 만든 애노테이션을 추가합니다.

 

그리고 OrderServiceImpl 파일에도 다음과 같이 애노테이션을 추가합니다.

@Component
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
        System.out.println("Constructor: memberRepository = " + memberRepository);
        System.out.println("Constructor: discountPolicy = " + discountPolicy);
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
	...
}

그리고 테스트 파일을 Run 해본다면...

멀쩡히 잘 돌아가는 것을 볼 수 있습니다.

 

이렇게 애노테이션을 직접 만들어서 적용해보는 것을 해봤습니다.

 

 

 

 

참고.

애노테이션 간의 상속관계는 없습니다. (예전에도 한 번 올린 것 같습니다.)

그럼에도 애노테이션을 저런식으로 사용할 수 있는 것은 스프링에서 지원해주기 때문입니다.

실제 순수 자바 코드로만 되어있는 곳에서는 애노테이션을 저렇게 붙이면 작동하지 않습니다.

애노테이션은 스프링에서 잘 정의해놨기 때문에

가능한 스프링에서 제공해주는 애노테이션을 사용하고

정말 필요할 때만 사용자 정의 애노테이션을 만들어서 이용하면 될 것 같습니다.

 

 

 

 

그럼 이렇게 해서 애노테이션 정의 및 사용에 대한 포스트를 마치겠습니다.

 

 

 

 

 

출처: 인프런 - 스프링 핵심원리(기본편) by 김영한