Java 커스텀 어노테이션 생성 및 활용 가이드
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

자바에서 커스텀 어노테이션 생성 가이드

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

  • Java 개발자 (중급 이상, 어노테이션 기반 프레임워크 구축/확장 필요)
  • 프레임워크 개발자 (Spring, Hibernate 등과 같은 라이브러리 내부 메커니즘 이해)
  • 코드 품질 개선을 목표로 하는 팀 (명확한 메타데이터 기반 설계)

핵심 요약

  • 커스텀 어노테이션 생성: @Target, @Retention, @interface를 사용해 @MyAwesomeAnnotation과 같은 어노테이션 정의 가능
  • 런타임 처리: RetentionPolicy.RUNTIME을 통해 Method.invoke()로 어노테이션 정보를 반영한 로직 구현 가능
  • 실용 예시: @Timer, @NotEmpty, @ValidatedBy처럼 메서드/필드에 적용 가능한 검증 및 모니터링 기능 구현 가능

섹션별 세부 요약

1. 어노테이션 기본 개념

  • 어노테이션은 코드에 메타데이터를 추가하는 메커니즘으로, 실제 로직은 변경하지 않음
  • @Target으로 적용 대상(메서드, 클래스 등)을, @Retention으로 유효 기간(런타임, 컴파일 등)을 지정
  • @interface 키워드로 어노테이션 정의 (예: @MyAwesomeAnnotation)

2. 어노테이션 예제 및 사용법

  • 시간 측정 어노테이션:

```java

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface Timer {

String unit() default "ms";

}

```

  • 필드 검증 어노테이션:

```java

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface NotEmpty {

String message() default "필드가 비어 있습니다";

}

```

3. 어노테이션 처리 로직 구현

  • Reflection 기반 처리:

```java

Method method = clazz.getDeclaredMethods()[0];

if (method.isAnnotationPresent(Timer.class)) {

Timer timer = method.getAnnotation(Timer.class);

long startTime = System.currentTimeMillis();

method.invoke(obj);

// 실행 시간 계산 및 로깅

}

```

  • 런타임 처리 필수 조건: RetentionPolicy.RUNTIME 설정

4. 어노테이션 활용 사례

  • 프레임워크 통합: @ValidatedBy로 검증 로직을 어노테이션으로 지정
  • API 엔드포인트 정의:

```java

@ApiEndpoint(path = "/user", method = HttpMethod.POST)

public class UserController { ... }

```

  • 성능 모니터링: @Monitor 어노테이션으로 메서드 실행 시간 기준 설정

5. 최적화 및 주의 사항

  • 기본값 설정: default 키워드로 파라미터 기본값 지정 (예: int priority() default 1)
  • 과도한 파라미터 회피: 10개 이상의 파라미터는 설계 리뷰 필요
  • 사용 목적 검토: 단순 메서드 파라미터로 충분한 경우 어노테이션 사용 자제

결론

  • 커스텀 어노테이션 사용 시: RetentionPolicy.RUNTIME 설정 필수, @interface 정의 시 명확한 목적 정의
  • 실무 팁: @NotEmpty, @MinLength처럼 검증용 어노테이션은 Validator 클래스로 처리, @Timer는 메서드 실행 시간 모니터링에 활용
  • 최종 권장: 어노테이션은 코드 가독성 향상 및 프레임워크 확장성 개선을 위해 전략적으로 사용해야 함