[JAVA] @, Annotation(애너테이션) 완벽 가이드
애너테이션(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 등 다양한 프레임워크에서 필수적인 역할을 하며, 커스텀 애너테이션을 만들어 특정 기능을 쉽게 구현할 수도 있다.
✅ 리플렉션과 함께 활용하면 런타임 중 애너테이션 정보를 읽어 동적 처리를 수행할 수 있다. 🚀