JAVA

[JAVA] @, Annotation(애너테이션) 완벽 가이드

Alex Han 2025. 2. 6. 22:31
반응형

애너테이션(Annotation)은 Java 코드에 추가적인 정보를 제공하는 메타데이터이다.

 

컴파일러, 런타임 환경, 프레임워크(Spring 등)가 특정 기능을 수행할 때 활용된다.

주석(Comment)과 달리 실제로 프로그램 실행에 영향을 미칠 수도 있다.

코드의 가독성을 높이고, 반복적인 설정을 줄여준다.

 

 

 


1. 애너테이션의 기본 개념

 

✔️ 애너테이션의 역할

컴파일러에게 추가 정보 제공 (예: @Override → 오버라이딩 여부 체크)

런타임 시 특정 동작 수행 (예: Spring에서 @Autowired로 의존성 주입)

코드 문서화 (예: @Deprecated, @SuppressWarnings)

바이트코드 변환, 리플렉션 등을 활용한 프레임워크 기능 지원

 

리플렉션이란 무엇인가

 

[JAVA] 리플렉션(Reflection)이란 무엇인가?

리플렉션(Reflection)은 실행 시간(runtime)에 클래스, 메서드, 필드 등의 정보를 동적으로 분석하고 조작할 수 있는 기능을 의미한다.즉, 컴파일 시점이 아니라 실행 중에 클래스 정보를 가져와서 메

jyhan0625.tistory.com

 

 

 


2. Java의 주요 애너테이션

 

📌 (1) 컴파일러 관련 애너테이션

컴파일러가 특정 동작을 수행하도록 도와주는 애너테이션이다.

애너테이션 설명
@Override 부모 클래스의 메서드를 오버라이딩할 때 사용
@Deprecated 더 이상 사용하지 않는 코드 표시 (대체 코드 안내 가능)
@SuppressWarnings 특정 경고를 무시하도록 설정

 

✅ 예제

class Parent {
    void display() {
        System.out.println("부모 클래스 메서드");
    }
}

class Child extends Parent {
    @Override // 올바른 오버라이딩 확인
    void display() {
        System.out.println("자식 클래스에서 오버라이딩한 메서드");
    }

    @Deprecated // 사용하지 않을 것을 권장
    void oldMethod() {
        System.out.println("이 메서드는 더 이상 사용되지 않습니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Child obj = new Child();
        obj.display();
        obj.oldMethod(); // Deprecated 경고 발생
    }
}

 


 

📌 (2) 런타임 처리 애너테이션 (Spring, JPA 등)

프레임워크에서 사용하며, 실행 중(런타임) 특정 동작을 수행할 때 활용된다.

애너테이션 설명
@Autowired 스프링에서 의존성 주입(DI)을 자동으로 수행
@Service 해당 클래스를 비즈니스 로직을 담당하는 서비스로 등록
@Transactional JPA에서 트랜잭션을 관리하도록 설정
@Entity JPA에서 데이터베이스 테이블과 매핑되는 클래스 표시

 

✅ Spring 예제

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void printUser() {
        System.out.println("사용자 정보 출력");
    }
}

 


 

📌 (3) 실행 정보를 유지하는 애너테이션 (리플렉션 활용)

일반적인 Java 코드에서 런타임 시 특정 동작을 수행할 때 사용한다.

애너테이션 설명
@Retention 애너테이션의 유지 정책 지정 (컴파일/런타임 적용 여부)
@Target 애너테이션이 적용될 대상 (클래스, 메서드, 필드 등) 지정
@Inherited 애너테이션을 자식 클래스에 자동 상속되도록 설정

 

✅ 커스텀 애너테이션 예제

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

// 애너테이션 정의 (런타임까지 유지)
@Retention(RetentionPolicy.RUNTIME)
@interface CustomAnnotation {
    String value();
}

class MyClass {
    @CustomAnnotation("Hello, Annotation!")
    public void myMethod() {}
}

public class Main {
    public static void main(String[] args) throws Exception {
        Method method = MyClass.class.getMethod("myMethod");

        if (method.isAnnotationPresent(CustomAnnotation.class)) {
            CustomAnnotation annotation = method.getAnnotation(CustomAnnotation.class);
            System.out.println("애너테이션 값: " + annotation.value());
        }
    }
}

 

✔️ @Retention(RetentionPolicy.RUNTIME)을 사용하면 리플렉션으로 애너테이션을 읽을 수 있다.

 

 

 


3. 커스텀 애너테이션 만들기

Java에서는 @interface 키워드를 사용해 사용자 정의 애너테이션을 만들 수 있다.

 

📌 (1) 커스텀 애너테이션 생성

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME) // 런타임까지 유지
@Target(ElementType.METHOD) // 메서드에만 적용
@interface MyAnnotation {
    String value();
}

 

📌 (2) 애너테이션 사용

class Example {
    @MyAnnotation("테스트 메서드 실행")
    public void testMethod() {
        System.out.println("테스트 메서드 실행 중...");
    }
}

 

📌 (3) 애너테이션 값 읽기

import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws Exception {
        Method method = Example.class.getMethod("testMethod");

        if (method.isAnnotationPresent(MyAnnotation.class)) {
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
            System.out.println("애너테이션 값: " + annotation.value());
        }
    }
}

 

결과:

애너테이션 값: 테스트 메서드 실행

 

✔️ 리플렉션을 활용해 애너테이션 값을 읽고 원하는 동작을 수행할 수 있다.

 

 

 


4. 애너테이션의 유지 정책 (@Retention)

애너테이션이 어느 시점까지 유지되는지를 결정한다.

유지 정책 설명
SOURCE 소스 코드에서만 유지 (컴파일 후 제거됨)
CLASS 컴파일된 클래스 파일(.class)에 존재하지만 런타임에는 읽을 수 없음
RUNTIME 런타임에도 유지되며 리플렉션을 통해 접근 가능

 

@Retention(RetentionPolicy.RUNTIME) // 런타임까지 유지
@interface MyAnnotation {
    String value();
}

 

✔️ RetentionPolicy.RUNTIME을 설정하면 런타임 중 리플렉션을 통해 읽을 수 있다.

 

 

 


5. 애너테이션 적용 대상 (@Target)

애너테이션이 적용될 대상을 지정할 수 있다.

적용 대상 설명
ElementType.TYPE 클래스, 인터페이스, 열거형
ElementType.FIELD 필드 (멤버 변수)
ElementType.METHOD 메서드
ElementType.PARAMETER 메서드 매개변수
ElementType.CONSTRUCTOR 생성자
ElementType.LOCAL_VARIABLE 지역 변수

 

@Target({ElementType.METHOD, ElementType.FIELD}) // 메서드와 필드에 적용 가능
@interface MyAnnotation {}

 

 

 


📌 결론

✅ 애너테이션(Annotation)은 코드에 추가적인 메타데이터를 제공하여 컴파일러, 프레임워크, 리플렉션 등이 특정 동작을 수행하도록 돕는다.

Spring, JPA 등 다양한 프레임워크에서 필수적인 역할을 하며, 커스텀 애너테이션을 만들어 특정 기능을 쉽게 구현할 수도 있다.

리플렉션과 함께 활용하면 런타임 중 애너테이션 정보를 읽어 동적 처리를 수행할 수 있다. 🚀

반응형