You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@around와 다르게 작업 흐름을 변경할 수는 없다.@around는 ProceedingJoinPoint.proceed()를 호출해야 다음 대상이 호출된다. 만약 호출하지 않으면 다음 대상이 호출되지 않는다. 반면에 @Before 는 ProceedingJoinPoint.proceed() 자체를 사용하지 않는다. 메서드 종료시 자동으로 다음 타켓이 호출된다. 물론 예외가 발생하면 다음 코드가 호출되지는 않는다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
6️⃣ 스프링 AOP 구현4 - 포인터컷 참조
✅ Pointcuts
✅ AspectV4Pointcut
✅ AopTest
7️⃣스프링 AOP 구현5 - 어드바이스 순서
어드바이스는 기본적으로 순서를 보장하지 않는다.
순서를 지정하고 싶으면 @aspect 적용 단위로 org.springframework.core.annotation.@order 애노테이션을 적용해야 한다.
문제는 이것을 어드바이스 단위가 아니라 클래스 단위로 적용할 수 있다는 점이다.
그래서 아래와 같이 하나의 애스펙트에 여러 어드바이스가 있으면 순서를 보장 받을 수 없다.
따라서 애스펙트를 별도의 클래스로 분리해야 한다.
현재 로그를 남기는 순서가 아마도 [
doLog()doTransaction()] 이 순서로 남을 것이다.(참고로 이 순서로 실행되지 않는 분도 있을 수 있다. JVM이나 실행 환경에 따라 달라질 수도 있다.)
실습
doTransaction()doLog()] 트랜잭션이 먼저 처리되고, 이후에 로그가 남도록 변경해보자.✅ AspectV5Order
✅ AopTest
8️⃣스프링 AOP 수현6 - 어드바이스 종류
➡️ 어드바이스 종류
✅ AspectV6Advice
✅ 참고 정보 획득
모든 어드바이스는
org.aspectj.lang.JoinPoint를 첫번째 파라미터에 사용할 수 있다. (생략해도 된다.)@Around는ProceedingJoinPoint을 사용해야 한다참고로 ProceedingJoinPoint 는 org.aspectj.lang.JoinPoint 의 하위 타입이다.
➡️ JoinPoint 인터페이스의 주요 기능
➡️ProceedingJoinPoint 인터페이스의 주요 기능
✅ 어드바이스 종류
@around와 다르게 작업 흐름을 변경할 수는 없다.@around는 ProceedingJoinPoint.proceed()를 호출해야 다음 대상이 호출된다. 만약 호출하지 않으면 다음 대상이 호출되지 않는다. 반면에
@Before는ProceedingJoinPoint.proceed()자체를 사용하지 않는다. 메서드 종료시 자동으로 다음 타켓이 호출된다. 물론 예외가 발생하면 다음 코드가 호출되지는 않는다.@AfterReturning
returning속성에 사용된 이름은 어드바이스 메서드의 매개변수 이름과 일치해야 한다.returning절에 지정된 타입의 값을 반환하는 메서드만 대상으로 실행한다. (부모 타입을 지정하면 모든 자식타입은 인정된다.)@Around와 다르게 반환되는 객체를 변경할 수는 없다. 반환 객체를 변경하려면@Around를 사용해야 한다.@after
@around
가장 강력한 어드바이스
joinPoint.proceed() 호출 여부 선택joinPoint.proceed(args[])try ~ catch~ finally모두 들어가는 구문 처리 가능ProceedingJoinPoint를 사용해야 한다.proceed()를 통해 대상을 실행한다.proceed()를 여러번 실행할 수도 있음(재시도)순서
스프링은 5.2.7 버전부터 동일한
@Aspect안에서 동일한 조인포인트의 우선순위를 정했다.실행 순서 @around, @before, @after , @AfterReturning, @AfterThrowing
어드바이스가 적용되는 순서는 이렇게 적용되지만, 호출 순서와 리턴 순서는 반대라는 점을 알아두자.
물론 @aspect 안에 동일한 종류의 어드바이스가 2개 있으면 순서가 보장되지 않는다. 이 경우 앞서 배운 것 처럼 @aspect 를 분리하고 @order 를 적용하자.
@around 외에 다른 어드바이스가 존재하는 이유
@Around는 항상joinPoint.proceed()를 호출해야 한다.그와 반면에…
@Before는joinPoint.proceed()를 호출하는 고민을 하지 않아도 된다.@Around가 가장 넓은 기능을 제공하는 것은 맞지만, 실수할 가능성이 있다. 반면에@Before,@After같은 어드바이스는 기능은 적지만 실수할 가능성이 낮고, 코드도 단순하다.@Before라는 애노테이션을 보는 순간 아~ 이 코드는 타켓 실행 전에 한정해서 어떤 일을 하는 코드구나 라는 것이 드러난다.All reactions