0Pricing
Java Academy · 강의

런타임 주석 처리

리플렉션으로 런타임에 주석을 읽어 유효성 검사, 라우팅 또는 주입 로직을 구현합니다.

런타임 주석 처리은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

클래스 수준 애너테이션 읽기

Class.getAnnotation()으로 클래스의 애너테이션 하나를 가져오고, getAnnotations()로 모두 가져옵니다. 애너테이션이 없으면 null을 반환합니다.

@Service
@RequestMapping("/api")
public class UserController {}

RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println(Arrays.toString(rm.value())); // ["/api"]

메서드 애너테이션 읽기

method.getAnnotation()으로 메서드 애너테이션을 가져옵니다. 클래스의 모든 메서드를 검색하려면 getDeclaredMethods()를 순회합니다.

for (Method m : UserController.class.getDeclaredMethods()) {
    GetMapping gm = m.getAnnotation(GetMapping.class);
    if (gm != null) System.out.println(m.getName() + " -> " + Arrays.toString(gm.value()));
}

필드 애너테이션 읽기

필드 애너테이션은 검증 및 ORM 프레임워크에서 사용됩니다. getDeclaredFields()를 순회하며 관련된 각 애너테이션을 확인합니다.

for (Field f : User.class.getDeclaredFields()) {
    Column col = f.getAnnotation(Column.class);
    if (col != null) System.out.println(f.getName() + " -> column: " + col.name());
}

매개변수 애너테이션 읽기

매개변수 애너테이션은 method.getParameterAnnotations()으로 가져올 수 있습니다. 이 메서드는 2차원 배열을 반환하며, 매개변수마다 한 행이 있고 각 행에는 해당 매개변수의 애너테이션이 들어갑니다.

Method m = UserController.class.getDeclaredMethod("create", UserDto.class);
Annotation[][] pa = m.getParameterAnnotations();
for (Annotation a : pa[0]) System.out.println(a.annotationType().getSimpleName()); // e.g. Valid

isAnnotationPresent

애너테이션 값을 읽기 전에 isAnnotationPresent(AnnotationType.class)를 사용하여 null 안전성을 확보한 상태로 빠르게 확인합니다.

if (m.isAnnotationPresent(Transactional.class)) {
    beginTransaction();
    m.invoke(target, args);
    commitTransaction();
}

간단한 의존성 주입 컨테이너 만들기

@Component가 지정된 클래스를 패키지에서 검색하고, 리플렉션으로 인스턴스화한 다음 map에 저장합니다. 이는 단순화한 Spring 컨테이너입니다.

Map<Class<?>, Object> beans = new HashMap<>();
for (Class<?> cls : scanPackage("com.example")) {
    if (cls.isAnnotationPresent(Component.class)) {
        beans.put(cls, cls.getDeclaredConstructor().newInstance());
    }
}

@Inject가 지정된 필드 주입하기

빈을 생성한 후 @Inject가 지정된 필드를 검색하고 리플렉션으로 값을 설정하여 필드 주입을 모방합니다.

for (Object bean : beans.values()) {
    for (Field f : bean.getClass().getDeclaredFields()) {
        if (f.isAnnotationPresent(Inject.class)) {
            f.setAccessible(true);
            f.set(bean, beans.get(f.getType()));
        }
    }
}

애너테이션 값으로 런타임 검증하기

제약 애너테이션의 값(예: @Range(min=1, max=100))을 읽고 런타임에 필드 값이 해당 제약 조건을 만족하는지 검증합니다.

for (Field f : dto.getClass().getDeclaredFields()) {
    Range range = f.getAnnotation(Range.class);
    if (range != null) {
        f.setAccessible(true);
        int val = (int) f.get(dto);
        if (val < range.min() || val > range.max())
            throw new ValidationException(f.getName() + " out of range");
    }
}

반복 가능한 애너테이션 읽기

@Repeatable 애너테이션에는 getAnnotationsByType()을 사용하여 컨테이너 애너테이션에서 모든 인스턴스를 투명하게 가져옵니다.

Tag[] tags = MyClass.class.getAnnotationsByType(Tag.class);
for (Tag t : tags) System.out.println(t.value());

ClassPath 라이브러리로 패키지 검색하기

표준 Java 리플렉션으로는 패키지의 모든 클래스를 나열할 수 없습니다. Reflections, ClassGraph 또는 Spring의 ClassPathScanningCandidateComponentProvider와 같은 라이브러리를 사용하여 클래스 경로 항목을 검색합니다.

Reflections reflections = new Reflections("com.example.service");
Set<Class<?>> services = reflections.getTypesAnnotatedWith(Service.class);
services.forEach(System.out::println);

런타임 애너테이션 처리: 요약

런타임 애너테이션 처리는 의존성 주입, 검증, 라우팅 및 객체 관계 매핑을 지원합니다. 이 작업은 초기화 시점에 수행해야 합니다. 시작할 때 애너테이션을 한 번 처리하고 결과를 캐시하여 요청마다 실행되는 경로에서 리플렉션을 사용하지 않도록 합니다.

빠른 확인

@Repeatable 애너테이션의 모든 인스턴스를 가져오는 메서드는 무엇인가요?

정리

단일 애너테이션에는 getAnnotation/isAnnotationPresent를 사용합니다. getDeclared*로 메서드와 필드를 검색합니다. 반복 가능한 애너테이션에는 getAnnotationsByType을 사용합니다. 시작할 때 처리하고 결과를 캐시합니다.

자주 묻는 질문

“런타임 주석 처리” 강의는 무료인가요?

네 — “런타임 주석 처리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“런타임 주석 처리”에서 뭘 배우나요?

리플렉션으로 런타임에 주석을 읽어 유효성 검사, 라우팅 또는 주입 로직을 구현합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“런타임 주석 처리” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 주석 정의: 요소와 기본값
  2. 유지 정책과 대상 유형
  3. 런타임 주석 처리
  4. 컴파일 시점 주석 처리기
← Java Academy(으)로 돌아가기