[개발 일기] 2025.03.27 - 커스텀 어노테이션

2025. 3. 27. 13:13·개발 일기

💡 개요

 

오늘은 Spring에서 자주 사용되는 어노테이션을 커스텀하는 방법을 정리해 보자.

 

 

 

왠지 어노테이션 커스텀하면 멋있어 보임.

 

 

 

📕 어노테이션

 

일단 어노테이션이 뭔지 정리해 보자.

 

 

어노테이션은 Java5부터 추가된 기능으로 코드에 메타데이터를 추가하는 방법이다.

 

 

이를 통해 특정 기능을 쉽게 적용할 수 있다.

 

 

다음은 커스텀 어노테이션 인터페이스이다.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}

 

주요 특징으론 어노테이션이 적용될 대상과 해당 어노테이션의 유지 기간을 설정해야 한다.

 

 

위 어노테이션은 메서드 범위에 적용될 어노테이션이고, 유지 기간은 런타임 시작부터 종료까지이다.

 

 

뿐만 아니라 interface가 아니라 @interface를 사용한다.

 

 

다음은 어노테이션을 사용하는 코드이다.

 

public class SampleService {

    @LogExecutionTime
    public void execute() {
        System.out.println("메서드 실행");
    }
}

 

위 코드에서 @LogExecutionTime 어노테이션이 execute() 메서드에 적용되었지만, 실제로 실행 시간을 측정하는 기능을 수행하려면 추가적인 구현이 필요하다.

 

 

구현 방법은 다음과 같다.

 

@Aspect
@Component
public class LogExecutionTimeAspect {

    @Around("@annotation(com.example.customannotation.LogExecutionTime)") 
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        
        Object result = joinPoint.proceed(); // 실제 메서드 실행

        long end = System.currentTimeMillis();
        System.out.println(joinPoint.getSignature() + " 실행 시간: " + (end - start) + "ms");

        return result;
    }
}

 

위 코드를 통해 Spring AOP를 활용하여 @LogExecutionTime 어노테이션이 붙은 메서드의 실행 시간을 측정하는 기능을 구현하였다.

 

 

@Around("@annotation(com.example.customannotation.LogExecutionTime)") 부분을 보면 AOP 적용 대상이 LogExecutionTime 인터페이스로 선언된 것을 볼 수 있다.

 

 

이제 해당 기능을 테스트할 수 있도록 실행 코드를 작성해 보자.

 

@SpringBootApplication
public class CustomAnnotationApplication {

    public static void main(String[] args) {
        SpringApplication.run(CustomAnnotationApplication.class, args);
    }
}

@Component
class Runner implements CommandLineRunner {

    @Autowired
    private SampleService sampleService;

    @Override
    public void run(String... args) throws Exception {
        sampleService.execute();
    }
}

 

위의 main 코드를 실행한 결과, 다음과 같은 결과가 출력되었다.

 

 

어노테이션 적용도 잘 되었고, AOP도 잘 적용되었다.

'개발 일기' 카테고리의 다른 글

[개발 일기] 2025.03.29 - deleteAll() vs deleteAllInBatch()  (0) 2025.03.29
[개발 일기] 2025.03.28 - Auto Increment Long PK vs UUID  (0) 2025.03.28
[개발 일기] 2025.03.26 - REDO, UNDO  (0) 2025.03.26
[개발 일기] 2025.03.25 - forward 프록시 (Nginx)  (0) 2025.03.25
[개발 일기] 2025.03.24 - JIT 컴파일러  (0) 2025.03.24
'개발 일기' 카테고리의 다른 글
  • [개발 일기] 2025.03.29 - deleteAll() vs deleteAllInBatch()
  • [개발 일기] 2025.03.28 - Auto Increment Long PK vs UUID
  • [개발 일기] 2025.03.26 - REDO, UNDO
  • [개발 일기] 2025.03.25 - forward 프록시 (Nginx)
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[개발 일기] 2025.03.27 - 커스텀 어노테이션
상단으로

티스토리툴바