자바에서 커스텀 어노테이션 생성 가이드
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 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
는 메서드 실행 시간 모니터링에 활용 - 최종 권장: 어노테이션은 코드 가독성 향상 및 프레임워크 확장성 개선을 위해 전략적으로 사용해야 함