본문 바로가기

Study Information Technology

Spring Boot에서 커스텀 어노테이션 만들기

728x90
반응형

Spring Boot에서 커스텀 어노테이션 만들기

Overview

Spring Boot에서 커스텀 어노테이션을 생성하는 것은 코드의 재사용성과 유지보수성을 높이는 효과적인 방법입니다. 이 과정에서는 어노테이션의 기본 개념부터 시작하여, 어노테이션을 어떻게 정의하고 사용하는지, 그리고 실제 사용 사례를 통해 구체적으로 설명하겠습니다. 또한, 커스텀 어노테이션을 사용할 때 발생할 수 있는 오류와 그 해결 방법도 다루겠습니다.

1. 어노테이션의 기본 개념

어노테이션은 메타데이터의 일종으로, 코드에 추가 정보를 제공하는 데 사용됩니다. Java에서 어노테이션은 주로 클래스, 메서드, 필드, 매개변수 등에 적용될 수 있습니다. Spring Framework에서는 이러한 어노테이션을 사용하여 다양한 기능을 제공하는데, 예를 들어 @Controller, @Service, @Repository 등이 있습니다.

커스텀 어노테이션은 이러한 기본 어노테이션을 개발자가 필요에 맞게 만들 수 있도록 합니다. 이로 인해 반복되는 코드 로직을 줄이고, 비즈니스 로직을 더욱 명확하게 표현할 수 있습니다.

2. 커스텀 어노테이션 정의하기

커스텀 어노테이션을 정의하기 위해서는 @interface 키워드를 사용합니다. 아래는 기본적인 어노테이션 정의 예시입니다.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME) // 런타임 동안 어노테이션을 사용할 수 있도록 설정
@Target(ElementType.METHOD) // 메서드에 적용될 수 있도록 설정
public @interface LogExecutionTime {
}

위의 예시에서 @Retention은 어노테이션이 언제까지 유지될지를 설정합니다. RUNTIME으로 설정하면 런타임 중에도 이 어노테이션에 접근할 수 있습니다. @Target은 어노테이션이 적용될 수 있는 위치를 지정합니다. 여기서는 메서드에만 적용되도록 했습니다.

3. 어노테이션 사용하기

커스텀 어노테이션을 정의한 후, 이를 실제로 사용하는 방법을 알아보겠습니다. 아래는 LogExecutionTime 어노테이션을 사용하여 메서드의 실행 시간을 로그로 남기는 예시입니다.

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

@Around("@annotation(LogExecutionTime)") // LogExecutionTime 어노테이션이 적용된 메서드를 가로챈다
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();

Object proceed = joinPoint.proceed(); // 메서드 실행

long executionTime = System.currentTimeMillis() - start;

logger.info("Method {} executed in {} ms", joinPoint.getSignature(), executionTime);
return proceed;
}
}

위의 LoggingAspect 클래스는 AOP(Aspect-Oriented Programming)를 사용하여 어노테이션이 적용된 메서드를 가로채고, 실행 시간을 측정하여 로그로 남기는 역할을 합니다. @Around 어노테이션은 메서드 실행 전후의 처리를 정의합니다.

4. 커스텀 어노테이션 사용 예제

이제 실제로 커스텀 어노테이션을 사용하는 예제를 살펴보겠습니다. 아래는 간단한 서비스 클래스와 메서드입니다.

import org.springframework.stereotype.Service;

@Service
public class UserService {
@LogExecutionTime
public void createUser() {
// 사용자 생성 로직
try {
Thread.sleep(1000); // 시뮬레이션
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

createUser() 메서드는 사용자 생성 로직을 수행하며, @LogExecutionTime 어노테이션이 적용되어 있습니다. 이 메서드를 호출하면 AOP가 작동하여 실행 시간을 측정하고 로그로 출력합니다.

5. 에러 발생 및 해결 방법

커스텀 어노테이션을 사용할 때 발생할 수 있는 일반적인 오류 중 하나는 어노테이션이 적용된 메서드가 실행되지 않는 경우입니다. 이 경우, 주로 AOP 설정이 제대로 되어 있지 않거나, Spring 컨텍스트에 Aspect가 등록되지 않았기 때문입니다.

오류 예시

org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:273)

이 오류는 AOP가 작동하지 않아서 발생할 수 있습니다. 이를 해결하기 위해서는 다음 사항을 점검해야 합니다.

  • @EnableAspectJAutoProxy 어노테이션이 Spring Boot 애플리케이션의 메인 클래스에 추가되어 있는지 확인합니다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@EnableAspectJAutoProxy
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
  • Aspect 클래스가 Spring의 컴포넌트 스캔에 포함되어 있는지 확인합니다. @Component 어노테이션이 붙어 있어야 합니다.

6. 마무리 및 참고 자료

커스텀 어노테이션을 만드는 것은 Spring Boot 애플리케이션의 코드 품질을 높이는 데 큰 도움이 됩니다. 공통적인 로직을 캡슐화하여 코드의 가독성과 유지보수성을 개선할 수 있습니다. 위의 예시를 통해 커스텀 어노테이션을 만드는 과정과 그 활용 방법을 이해할 수 있었기를 바랍니다.

참고 문서

이 자료들을 통해 커스텀 어노테이션에 대한 이해를 더욱 깊이 있게 확장할 수 있습니다.

반응형