애너테이션
- 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종
- 메타데이터 - 데이터에 대한 데이터, 즉 데이터에 대해 설명이나 정보를 제공하기 위한 목적의 데이터
@RequiredArgsConstructor
public class PaymentRepositoryImpl implements PaymentRepositoryCustom {
private final JPAQueryFactory queryFactory;
// @Override는 해당 애너테이션이 붙은 메서드가 오버라이드 메서드임을 알려주는 애너테이션이다.
@Override
public Page<Payment> findByNameContains(String word, Pageable pageable) {
List<Payment> payments = queryFactory.selectFrom(payment)
.leftJoin(payment.student, student).fetchJoin()
.where(searchCondition(word))
.limit(pageable.getPageSize())
.offset(pageable.getOffset())
.orderBy(payment.id.desc())
.fetch();
int size = queryFactory.selectFrom(payment)
.where(searchCondition(word))
.fetch()
.size();
return PageableExecutionUtils.getPage(payments, pageable, () -> size);
}
}
메타 애너테이션
- 애너테이션을 정의하는데 사용되는 애너테이션. 애너테이션을 정의할 때에만 사용할 수 있다.
@Retention
- 애너테이션이 유지되는 생명주기를 설정하는 메타 애너테이션
- SOURCE
- 소스 코드에서만 유지. 컴파일 시점에 제거됨
- CLASS
- 컴파일된 .class 파일에 애너테이션을 유지시킴. 런타임 시점에 제거됨
- SOURCE 와 마찬가지로 런타임 시점에는 결국 제거된 상태지만 소스 코드 없이 .class 파일만 제공되는 상황에서 애너테이션 정보를 제공하기 위해서 사용됨 (ex - jar 파일의 .class)
- RUNTIME
- 런타임 시점까지 애너테이션을 유지시킴
- SOURCE
@Retention(RetentionPolicy.SOURCE)
@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.RUNTIME)
@Target
- 애너테이션을 적용할 수 있는 유형을 설정하는 메타 애너테이션
- TYPE, FIELD, METHOD, PARAMETER 등 다양한 유형을 지정할 수 있다.
@Target(ElementType.METHOD)
@Target(ElementType.PARAMETER)
@Inherited
- @Inherited 이 적용된 애너테이션을 사용한 클래스를 상속한 서브클래스는 애너테이션 정보까지 상속받도록 하는 메타 애너테이션
'Java' 카테고리의 다른 글
Thread의 동기화 처리 (0) | 2022.09.04 |
---|---|
Demon Thread (0) | 2022.09.04 |
Thread 의 동시성과 병렬성 (0) | 2022.09.01 |
JVM - Java Virtual Machine (0) | 2022.08.30 |
자바 소스 코드의 실행 과정 (0) | 2022.08.30 |