목차
Spring AOP - Advice 종류
Spring AOP - 트랜잭션 순서
Spring AOP - Pointcut 참조
Spring AOP - 어드바이스 추가
Spring AOP - Pointcut 분리
Spring AOP - @Aspect
Spring AOP - Aspect
Spring AOP - 용어 정리
Spring AOP - 적용 방식
Spring 핵심원리 고급편 - 어드바이스 종류
종류
설명
@Around
메서드 호출 전 후에 실행, 가장 강력한 어드바이스, 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등이 가능
@Before
조인 포인트 실행 이전에 실행
@AfterReturning
조인 포인트가 정상 완료 후 실행
@AftThrowing
메서드가 예외를 던지는 경우 실행
@After
조인 포인트가 정상 또는 예외에 관계 없이 실행
@Slf4j@Aspectpublic class AspectV6Advice { // com.example.aop.order 하위 패키지면서 클래스 이름 패턴이 *Service 인 것 @Around("com.example.aop.order.aop.Pointcuts.orderAndService()") public Object doTransaction(ProceedingJoinPoint joinPoint) throws Throwable{ try{ // @Before log.info("[트랜잭션 시작] {}", joinPoint.getSignature()); Object result = joinPoint.proceed(); // @AfterReturning log.info("[트랜잭션 커밋] {}", joinPoint.getSignature()); return result; }catch (Exception ex){ // @AfterThrowing log.info("[트랜잭션 롤백] {}", joinPoint.getSignature()); throw ex; }finally { // @After log.info("[리소스 릴리즈] {}", joinPoint.getSignature()); } }}
@Slf4j@Aspectpublic class AspectV6Advice { // com.example.aop.order 하위 패키지면서 클래스 이름 패턴이 *Service 인 것 @Around("com.example.aop.order.aop.Pointcuts.orderAndService()") public Object doTransaction(ProceedingJoinPoint joinPoint) throws Throwable{ try{ // @Before log.info("[트랜잭션 시작] {}", joinPoint.getSignature()); Object result = joinPoint.proceed(); // @AfterReturning log.info("[트랜잭션 커밋] {}", joinPoint.getSignature()); return result; }catch (Exception ex){ // @AfterThrowing log.info("[트랜잭션 롤백] {}", joinPoint.getSignature()); throw ex; }finally { // @After log.info("[리소스 릴리즈] {}", joinPoint.getSignature()); } } // @Before 은 그냥 실행해준다. @Before("com.example.aop.order.aop.Pointcuts.orderAndService()") public void doBefore(JoinPoint joinPoint){ log.info("[before] {}", joinPoint.getSignature()); } // return 값을 조작을 할 수는 있지만 바꿀 수 는 없다. @AfterReturning(value = "com.example.aop.order.aop.Pointcuts.orderAndService()", returning = "result") public void doReturn(JoinPoint joinPoint, Object result){ log.info("[return] {} return = {}", joinPoint.getSignature(), result); } // 자동으로 throw ex 를 해준다. @AfterThrowing(value = "com.example.aop.order.aop.Pointcuts.orderAndService()", throwing = "ex") public void doThrowing(JoinPoint joinPoint, Exception ex){ log.info("[ex] {} message = {}", ex); } @After(value = "com.example.aop.order.aop.Pointcuts.orderAndService()") public void doAfter(JoinPoint joinPoint){ log.info("[after] {}", joinPoint.getSignature()); }}
모든 어드바이스는 JoinPoint 를 첫번째 파라미터에 사용할 수 있다. 단 @Around 는 ProceedingJoinPoint 를 사용해야 한다.ProceedingJoinPoint는 JoinPoint 의 하위 타입니다.
JoinPoint 인터페이스의 주요 기능
Method
설명
getArgs
메서드 인수를 반환한다.
getThis
프록시 객체를 반환한다.
getTarget
대상 객체를 반환한다.
getSignature
조언되는 메서드에 대한 설명을 반환한다.
toString
조언되는 방법에 대한 유용한 설명을 인쇄한다.