자바
[JAVA] 어노테이션 (Annotation)
planting grass
2025. 3. 17. 17:58
728x90
등장 배경
- 어노테이션이 등장하기 전의 문제점
어노테이션이 등장하기 전에는 XML 기반 설정 파일이나 마커 인터페이스(Marker Interface)를 사용하여 메타데이터를 관리했다.
XML 설정 방식
- 설정이 많아지면 유지보수가 어려움
- 실수로 XML을 수정하면 런타임 오류 발생 가능
- 코드와 설정이 분리되어 있어 가독성이 떨어짐
마커 인터페이스(Marker Interface) 방식
- 특정 인터페이스를 구현하는 방식 (Serializable 등)
- 런타임에서 해당 인터페이스가 구현되었는지 체크
- 새로운 기능을 추가하려면 인터페이스를 계속 수정해야 함
- 어노테이션의 등장
자바 5(Java SE 1.5, 2004년)부터 어노테이션(Annotation)이 도입되어 코드 내에서 메타데이터를 직접 선언할 수 있게 되었다.
이로 인해 설정과 코드가 분리되지 않으면서도, 보다 강력한 기능을 제공하는 방식으로 발전했다.
1. 목적
어노테이션은 기본적으로 코드에 추가적인 정보(메타데이터)를 제공하여 특정 기능을 수행하도록 돕는 역할을 한다.
즉, 자바에서 "설명을 다는 메모" 같은 역할을 하는 기능이라고 생각하면 된다.
이 메모를 컴파일러가 보고 역할을 수행한다.
- 컴파일러와 개발 도구를 위한 정보 제공
@Override
→ 메서드가 부모 클래스의 메서드를 올바르게 오버라이드했는지 체크@SuppressWarnings
→ 특정 경고를 억제
- 코드 가독성과 유지보수성 향상
- XML 설정 파일 없이 코드에서 직접 설정
- 프레임워크(Spring, JPA 등)에서 자동 설정
- 리플렉션을 활용한 동적 기능 제공
- 런타임에서 어노테이션을 읽어 동작을 변경 가능
- 예: @Entity를 사용하면 JPA가 해당 클래스를 자동으로 테이블로 매핑
- 프레임워크의 자동화 기능 지원
- Spring에서
@Autowired
를 사용하면 빈(Bean) 자동 주입 - JUnit의
@Test
를 사용하면 테스트 메서드로 인식
- Spring에서
2. 특징
- 코드에 추가 정보를 제공하는 역할
- 적용 대상 지정 가능 (
@Target
)- 어노테이션을 적용할 수 있는 대상 제한 가능
- 유지 기간 지정 가능 (
@Retention
)- 어노테이션이 언제까지 유지할지 지정 가능
- 기본값 설정 가능
3. 사용 예시
1. 기본 어노테이션
어노테이션 | 설명 |
@Override |
부모 클래스의 메서드를 올바르게 오버라이드했는지 체크 |
@Deprecated |
해당 요소가 더 이상 사용되지 않음을 표시 |
@SuppressWarnings("경고 타입)" |
특정 경고 메시지를 무시 |
class Parent {
@Deprecated
public void oldMethod() {
System.out.println("Deprecated method");
}
}
class Child extends Parent {
@Override
public void oldMethod() {
System.out.println("Overridden method");
}
}
2. 커스텀 어노테이션
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface CustomAnnotation {
String author();
int version() default 1;
}
class Example {
@CustomAnnotation(author = "John Doe", version = 2)
public void testMethod() {}
}
import java.lang.reflect.Method;
public class AnnotationProcessor {
public static void main(String[] args) throws Exception {
Method method = Example.class.getMethod("testMethod");
CustomAnnotation annotation = method.getAnnotation(CustomAnnotation.class);
System.out.println("Author: " + annotation.author());
System.out.println("Version: " + annotation.version());
}
}
- 출력 결과
Author: John Doe
Version: 2
3. Spring에서의 사용
import org.springframework.stereotype.Service;
@Service
public class MyService {
public void doSomething() {
System.out.println("Service logic.");
}
}
@Service
어노테이션을 붙이면 스프링이 빈으로 등록해주는 역할을 한다.
728x90