728x90
반응형
AOP에 대해 알아보고 싶다면 위 포스팅으로.
build.gradle
1 2 3 | dependencies { implementation 'org.springframework.boot:spring-boot-starter-aop' } | cs |
위 코드를 build.gradle에 추가시켜준다.
application.properties에 가서 나는 로깅 레벨을 info로 찍을 것이기 때문에 위와 같이 코드를 짰다.
LoggingAspect
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.bit.bitduzon.aop; import java.util.Arrays; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component @Aspect public class LoggingAspect { private Logger logger = LoggerFactory.getLogger(LoggingAspect.class); @Before(value = "execution(* com.bit.bitduzon.service.*Service*.*(..))") public void loggin(JoinPoint joinPoint) { logger.info("메서드 선언부 BEFORE : {} 전달 파라미터 : {}", joinPoint.getSignature(), Arrays.toString(joinPoint.getArgs())); } @AfterReturning(value = "execution(* com.bit.bitduzon.service.Board*.*(..))", returning = "obj") public void afterReturningMethod(JoinPoint joinPoint, Object obj) { logger.info("afterReturning call method : {} ", joinPoint.getSignature()); logger.info("return value : {}", obj); } } | cs |
현재 위 코드에서는 @Before과 @AfterReturning 만 지정해주었다.
@Component를 통해 스프링 컨테이너에 의해 관리되는 빈으로 등록하고, @Aspect는 Aspect로 사용됨을 나타낸다.
Aspect란?
Spring AOP에서 사용되는 개념으로, 애플리케이션의 여러 위치에서 공통적으로 사용되는 부가적인 기능을 하나의 모듈로 추상화한 것이다.
@Before : 지정된 패키지의 모든 서비스클래스의 모든 메서드 실행 전에 실행된다.
@AfterReturning : 메서드의 반환 값을 받아오기 위해 사용한다.
value : 어드바이스를 적용할 Pointcut을 지정한다.
JoinPoint : 어드바이스가 적용된 메서드에 대한 정보를 제공하는 객체이다. 해당 메서드의 시그니처 등 정보를 얻기 위해 사용된다.
로깅을 찍어보면 이렇게 해당 Service가 실행될 때 마다 데이터가 찍히는 것을 확인할 수 있다.
1 2 3 4 5 6 7 8 9 10 | @AfterThrowing(value = "execution(* com.bit.bitduzon.service.Board*.*(..))", throwing = "exception") public void afterThrowingMethod(JoinPoint joinPoint, Exception exception) { logger.info("afterThrowing call method : {}", joinPoint.getSignature()); logger.info("exception : {}", exception); } @After(value = "execution(* com.bit.bitduzon.service.Board*.*(..))") public void afterMethod(JoinPoint joinPoint) { logger.info("after call method : {}", joinPoint.getSignature()); } | cs |
위 두 메소드들을 추가해줬다.
@AfterThrowing : 메서드 실행 중 예외가 발생했을때 실행된다.
throwing = "exception" 은 Advice 메서드의 파라미터로 예외 객체를 받는다.
@After : 메서드 실행 후 항상 실행된다.
예외는 발생하지 않았고, @After가 정상적으로 실행된 것을 확인할 수 있다.
728x90
반응형
'✨ Back-end > Spring-Boot' 카테고리의 다른 글
[Spring] 스프링 부트에서 메시지 국제화, Gradle (0) | 2023.09.18 |
---|---|
[Spring] 스프링 부트 mySql mybatis 연동하기 (gradle) (0) | 2023.09.15 |
[Spring] 스프링 프레임워크(POJO, PSA, IoC/DI, AOP) 개념 (0) | 2023.08.22 |
[Spring] Bean과 Bean Factory , @Configuration과 @Bean (2) | 2023.08.19 |
[Spring] 웹소켓 STOMP WebSocket - 실시간 채팅 구현하기 (0) | 2023.06.01 |
댓글