우와한 개발자

[Java] 어노테이션(Annotation)이란? 개념과 특징, 주요 어노테이션 정리

by 우와한개발자

[ 어노테이션 Annotation]

1. 어노테이션이란?

  • Java 5버전부터
  • 코드에 메타데이터를 추가하는 방법 중 하나
  • 클래스, 메서드, 변수 등에 대한 부가적인 정보 제공
  • 어노테이션은 주석과 다르게 컴파일러나 프로그램 실행에 영향을 미치는 기능을 제공함
@Override
public void run() {}  // 메서드 오버라이딩 틀리면 컴파일 에러 발생

@Transactional
public void save() {}  // Spring이 읽고 자동으로 트랜잭션 시작(동작을 바꿈)

@Retention(RetentionPolicy.RUNTIME)  // 어노테이션 언제까지 유지할지
@Target(ElementType.METHOD)          // 이 어노테이션은 메서드에만 적용 가능
public @interface MyAnnotation{
	
	String value() default "";
	
}

 

2. 어노테이션 생성 및 사용 

// 어노테이션 정의
public @interface MyAnnotation {

	// 어노테이션 요소 선언
	String value();
	int number() default 0; // 기본값을 가지는 어노테이션 요소
    Class<?>[] classes(); // 배열 형태의 어노테이션 요소
}

//어노테이션 사용
@MyAnnotation(value = "Hello", number = 42, 
		classes = { MyClass1.class, MyClass2.class })
public class MyClass {
	// 클래스 내용 
}

 

3. 어노테이션 주요 용도

1) 컴파일 타임 정보 제공

  • 소스 코드에 메타데이터를 추가하여 컴파일러에게 정보를 전 달
  • 경고메세지 억제 또는 컴파일러가 코드 자동생성하도록 함.

2) 런타임 처리 지원

  • 런타임에 어노테이션 정보를 읽고 처리
  • 예를 들어 리플렉션(reflection)을 사용해 어노테이션이 적용된 요소를 검사하거나 동적으로 처리(Spring에서 많이 사용)

 

3) 소프트웨어 도구 지원

  • 개발 도구나 프레임워크에서 어노테이션 활용해 코드 자동 생성 및 분석 가능
  • 예를 들어 테스트 프레임워크는 @Test 어노테이션을 사용하여 테스트 메서드를 식별
⚠️ Java의 리플렉션 relfection
- 실행 중인 프로그램의 클래스, 인터페이스, 메서드, 필드 등과 같은 구조에 대한 정보를 동적으로 얻거나 조작하는 기능
즉, 정보를 검사하고, 클래스의 인스턴스 생성하고, 메서드 호출하고, 필드 값 읽거나 수정하는 등 작업을 수행하는 기능
- java.lang.reflect 패키지를 통해 제공
- 텍스트 클래스를 가지고 객체를 만들어준다던가, 바이트코드로 소스코드를 생성하는 디컴파일이 가능함. 

 

4. 어노테이션 유지정책

  • 어노테이션이 언제까지 유지되는지를 정의
  • 주로 AOP에서 많이 사용됨.
⚠️ 관점지향 프로그래밍 AOP (Aspect Oriented Programming) 
- 공통 관심사(Cross-Cutting Concern 횡적 관심사)를 핵심 로직에서 분리하는 것
구분 의미
핵심 코드 비즈니스 로직
공통 코드 로깅, 트랜잭션, 보안, 예외 처리
- 그 전에는 핵심코드에서 공통코드를 불러서 사용해 중복이 많고 유지보수가 어려움.
소스코드, 클래스 파일, 런타임 중 어디까지 유지될지를 결정함.

 

 @Retention(RetentionPolicy.SOURCE)
 
 @Retention(RetentionPolicy.CLASS)
 
 @Retention(RetentionPolicy.RUNTIME)

 

1) SOURCE

  • 소스 코드까지만 유지
  • 컴파일 이후에는 소스코드에서 어노테이션 제거(주로 컴파일러에 추가 정보 전달 위함)

2) CLASS

  • 클래스 파일까지 유지
  • 어노테이션 정보가 제거
  • 리플렉션(relfection)을 통해 클래스 파일에서 어노테이션 정보 조회 가능하나 실행중엔 불가.

3) RUNTIME

  • 런타임까지 유지
  • 어플리케이션 실행 중에도 어노테이션 정보가 유지
  • 리플렉션(relfection)을 통해 런타임 시에도 어노테이션 정보 조회 가능
  • 주로 커스텀 어노테이션 정의시 사용

5. 주요 어노테이션

1) Java 기본 어노테이션

어노테이션 설명 @Retention
@Override 메서드 재정의 명시 SOURCE
@Deprecated 사용 금지 표시 RUNTIME
@SuppressWarnings 경고 무시 SOURCE
@FunctionalInterface 함수형 인터페이스 명시 RUNTIME
@SafeVarargs 가변 인자 경고 억제 SOURCE

 

2) 메타 어노테이션 (어노테이션 위에 붙는 것)

어노테이션 설명
@Target 어디에 붙일 수 있는지 지정
@Retention 유지 범위 지정 (SOURCE / CLASS / RUNTIME)
@Documented Javadoc 포함 여부
@Inherited 상속 허용

 

3) Lombok 어노테이션

어노테이션 설명
@Getter, @Setter getter/setter 자동 생성
@ToString toString 자동 생성
@EqualsAndHashCode equals/hashCode 생성
@NoArgsConstructor 기본 생성자
@AllArgsConstructor 모든 필드 생성자
@RequiredArgsConstructor final 필드 생성자
@Builder 빌더 패턴
@Data 위 대부분 묶음
@Slf4j 로그 객체 생성

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기