minOS

의존관계 자동 주입(6) - 애노테이션 만들기 본문

TIL/김영한의 스프링 핵심 원리

의존관계 자동 주입(6) - 애노테이션 만들기

minOE 2024. 4. 23. 15:26
728x90

애노테이션 만들기

@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일시 타입 체크가 안된다. 그래서 다음과 같이 애노테이션을 만들어서 문제를 해결할 수 있다.

애너테이션 정의
package com.example.core.annotation;


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

import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")//@Qualifier만 있어도 될 듯?
@Component
public @interface MainDiscountPolicy  {
}​

 

@Qualifier("mainDiscountPolicy") 대신 애노테이션 정의한 거 사용 오타나면 컴파일 오류남
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy{}​



생성자 주입

@Component
//@RequiredArgsConstructor //final이 붙은 필드값에 대해 생성자를 만들어줌
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

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

수정자 주입
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository ;
    private final  DiscountPolicy discountPolicy;
    
    @Autowired
    public  DiscountPolicy setDiscountPolicy(@MainDiscountPolicy DiscountPolicy discountPolicy){
    	return discountPolicy;
   }​

애노테이션에는 상속이라는 개념이 없다. 이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원해주는 기능이다.
@Qualifier 뿐만 아니라 다른 애노테이션도 함께 조합해서 사용할 수 있다. 단적으로 @Autowired도 재정의 할 수 있다.
물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별하게 재정의 하는 것은 유지보수에 혼란을 가중할 수 있다.
728x90