-
어노테이션으로 AOP 사용스프링/스프링 AOP 2023. 9. 23. 21:25
@Trace 인터페이스
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Trace { }
@Trace라는 어노테이션을 붙이면 자동으로 Aspect로 되어서 로그를 찍는 기능을 만들어볼 것이다.
TraceAspect.class
@Slf4j @Aspect public class TraceAspect { @Before("@annotation(hello.aop.exam.annotation.Trace)") public void doTrace(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); log.info("[trace] {} args={}", joinPoint.getSignature(), args); } }
@Before 어노테이션으로 로직이 실행되기전에 로그를 출력해주는 AOP를 만든다.
Repository.class
@Repository public class ExamRepository { private static int seq = 0; /** * 5번에 1번 실패하는 요청 */ @Trace public String save(String itemId) { seq++; if (seq % 5 == 0) { throw new IllegalStateException("예외 발생"); } return "ok"; } }
Service.class
@Service @RequiredArgsConstructor public class ExamService { private final ExamRepository examRepository; @Trace public void request(String itemId) { examRepository.save(itemId); } }
Repository와 Service의 로직에 @Trace라는 어노테이션을 붙여주기만 하면 aop가 들어가서 로직이 실행되기 전에 로그를 찍어준다. 물론 TraceAspect.class를 빈으로 등록해줘야한다.
아래의 test 코드에서 @Import로 등록해줬다.
@Slf4j @Import(TraceAspect.class) @SpringBootTest public class ExamTest { @Autowired ExamService examService; @Test void test() { for (int i = 0; i < 5; i++) { log.info("client request i={}", i); examService.request("data" + i); } } }
테스트 코드인데 로직이 실행되기 전에 로그가 먼저 찍히는 것을 확인할 수 있다.
실제로 사용할 때에는 이렇게 스프링 AOP를 사용하면 된다.
'스프링 > 스프링 AOP' 카테고리의 다른 글
AOP 주의사항 - 프록시와 내부 호출 (0) 2023.09.23 재시도 AOP (0) 2023.09.23 포인트컷 - execution (0) 2023.09.23 어드바이스 종류 (0) 2023.09.22 어드바이스 순서 (0) 2023.09.22