CustomAnnotation

Spring에서 타입 안전한 커스텀 애노테이션을 만들어 코드 품질을 향상시키는 방법을 정리했습니다.

1. 커스텀 애노테이션의 필요성 ⚡

  • 기존 문제점 📝

    • @Qualifier("mainDiscountPolicy") 같은 문자열 기반 식별자는 컴파일 시 타입 체크가 불가능

    • 오타가 발생해도 컴파일러가 감지하지 못함

    • IDE에서 자동 완성이나 리팩토링 지원이 제한적

  • 해결 방안 💡

    • 커스텀 애노테이션을 만들어 문자열 대신 타입 안전한 방식으로 의존성 구분

    • 컴파일 타임에 오류 검출 가능

    • 코드 가독성과 유지보수성 향상

2. 커스텀 애노테이션 구현 예시 🛠️

  • 메타 애노테이션 활용한 커스텀 애노테이션 📑

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 {
}
  • 각 애노테이션 속성 설명 🔍

    • @Target: 애노테이션이 적용될 수 있는 요소 지정

    • @Retention: 애노테이션 정보가 유지되는 범위 설정 (RUNTIME은 실행 시점에도 유지)

    • @Documented: JavaDoc에 포함

    • @Qualifier: 기존 스프링 애노테이션을 메타 애노테이션으로 사용

3. 커스텀 애노테이션 활용 📊

  • 컴포넌트에 적용 📑

@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {
    // 구현 내용
}
  • 의존성 주입 시 활용 📑

// 생성자 주입
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
                        @MainDiscountPolicy DiscountPolicy discountPolicy) {
    this.memberRepository = memberRepository;
    this.discountPolicy = discountPolicy;
}

// 수정자 주입
@Autowired
public void setDiscountPolicy(@MainDiscountPolicy DiscountPolicy discountPolicy) {
    this.discountPolicy = discountPolicy;
}

4. 커스텀 애노테이션의 원리 🧩

  • 애노테이션 합성 💡

    • 자바에서 애노테이션은 상속 개념이 없음

    • 대신 여러 애노테이션을 조합해서 새로운 애노테이션을 정의할 수 있음

    • 스프링은 이러한 애노테이션 합성과 조합을 지원

  • 다양한 조합 가능성 🔄

    • @Qualifier 외에도 다양한 스프링 애노테이션을 재정의 가능

    • @Autowired, @Component 등도 커스텀 애노테이션으로 재정의 가능

5. 사용 시 주의사항 ⚠️

  • 무분별한 재정의 지양 📝

    • 스프링 기본 애노테이션을 뚜렷한 목적 없이 재정의하면 유지보수 혼란 초래

    • 팀 내 컨벤션과 문서화가 중요

    • 명확한 비즈니스 목적이 있는 경우에만 사용 권장

  • 버전 호환성 고려 🔄

    • 스프링 버전 업그레이드 시 커스텀 애노테이션 동작 확인 필요

    • 기본 애노테이션 동작이 변경될 경우 영향 받을 수 있음

6. 커스텀 애노테이션의 장점 🌟

  • 타입 안전성

    • 컴파일 타임에 오류 검출 가능

    • IDE의 자동 완성, 리팩토링 지원

  • 코드 가독성 📖

    • 의도를 명확히 표현하는 이름 사용 가능

    • 자체 문서화 효과

  • 유지보수성 🔧

    • 수정 시 한 곳만 변경하면 됨

    • 코드 전체에 일관성 유지 가능

학습 포인트 💡

  • 스프링 애노테이션 구조: 스프링의 애노테이션이 어떻게 설계되었는지 이해할 수 있음

  • 메타 애노테이션: 기존 애노테이션을 활용해 새로운 애노테이션을 만드는 패턴

  • 타입 안전성: 문자열 기반 식별자보다 타입 안전한 방식으로 코드 품질 향상

  • 코드 표현력: 도메인 개념을 애노테이션으로 표현하여 코드의 의도를 명확히 전달

Last updated