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
orderService에는 doLog() , doTransaction() 두가지 어드바이스가 적용되어 있고, orderRepository
에는 doLog() 하나의 어드바이스만 적용된 것을 확인할 수 있다.
그런데 여기에서 로그를 남기는 순서가 [doLog() → doTransaction() ] 순서로 작동한다. 만약 어드바이스가 적용되는 순서를 변경하고 싶으면 어떻게 하면 될까? 예를 들어서 실행 시간을 측정해야 하는데 트랜잭션과 관련된 시간을 제외하고 측정하고 싶다면 [doTransaction() doLog() ] 이렇게 트랜잭션 이후에 로그를 남겨야 할 것이다.
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.
섹션11. 스프링 AOP 구현
1️⃣ 프로젝트 생성
동작 확인\
AopApplication.main())2️⃣ 예제 프로젝트 만들기
🗒️ OrderRepository
🗒️OrderService
🗒️AopTest
3️⃣ 스프링 AOP 구현1 - 시작
@Aspect를 사용해서 가장 단순한 AOP를 구현해보자.@around애노테이션의 값인execution(* hello.aop.order..(..))는 포인트컷이 된다.
@around애노테이션의 메서드인doLog 는 어드바이스(Advice)가 된다.
execution( hello.aop.order..*(..))는hello.aop.order 패키지와 그 하위 패키지(..)를 지정하는 AspectJ 포인트컷 표현식이다. 앞으로는 간단히 포인트컷 표현식이라 하겠다.
이제
OrderService,OrderRepository의 모든 메서드는 AOP 적용의 대상이 된다. 참고로 스프링은 프록시 방식의 AOP를 사용하므로 프록시를 통하는 메서드만 적용 대상이 된다참고
✅스프링 빈으로 등록하는 방법
@Bean을 사용해서 직접 등록@Component컴포넌트 스캔을 사용해서 자동 등록@Import주로 설정 파일을 추가할 때 사용(@Configuration)@import 는 주로 설정 파일을 추가할 때 사용하지만, 이 기능으로 스프링 빈도 등록할 수 있다. 테스트에서는 버전을 올려가면서 변경할 예정이어서 간단하게 @import 기능을 사용하자.
✅ 실행 - success()
4️⃣ 스프링 AOP 구현2 - 포인트컷 분리
🗒️ AspectV2
✅**@pointcut**
@Pointcut에 포인트컷 표현식을 사용한다.메서드 이름과 파라미터를 합쳐서 포인트컷 시그니처(signature)라 한다.
메서드의 반환 타입은
void여야 한다.코드 내용은 비워둔다.
포인트컷 시그니처는
allOrder()이다. 이름 그대로 주문과 관련된 모든 기능을 대상으로 하는 포인트컷이다.@Around어드바이스에서는 포인트컷을 직접 지정해도 되지만, 포인트컷 시그니처를 사용해도 된다. 여기서는@Around("allOrder()")를 사용한다.private,public같은 접근 제어자는 내부에서만 사용하면private을 사용해도 되지만, 다른 애스팩트에서 참고하려면public을 사용해야 한다.결과적으로
AspectV1과 같은 기능을 수행한다. 이렇게 분리하면 하나의 포인트컷 표현식을 여러 어드바이스에서 함께 사용할 수 있다.그리고 뒤에 설명하겠지만 다른 클래스에 있는 외부 어드바이스에서도 포인트컷을 함께 사용할 수 있다
✅ 실행 - success()
5️⃣ 스프링 AOP 구현 3 - 어드바이스 추가
✅ 트랜잭션 기능은 보통 아래와 같이 동작한다.
✅ @around("allOrder() && allService()")
✅포인트컷이 적용된 AOP 결과는 다음과 같다.
orderService : doLog() , doTransaction() 어드바이스 적용
orderRepository : doLog() 어드바이스 적용
AopTest - 수정
✅ 실행 결과 - success()
AOP 적용 전
AOP 적용 후
orderService에는 doLog() , doTransaction() 두가지 어드바이스가 적용되어 있고, orderRepository
에는 doLog() 하나의 어드바이스만 적용된 것을 확인할 수 있다.
그런데 여기에서 로그를 남기는 순서가 [doLog() → doTransaction() ] 순서로 작동한다. 만약 어드바이스가 적용되는 순서를 변경하고 싶으면 어떻게 하면 될까? 예를 들어서 실행 시간을 측정해야 하는데 트랜잭션과 관련된 시간을 제외하고 측정하고 싶다면 [doTransaction() doLog() ] 이렇게 트랜잭션 이후에 로그를 남겨야 할 것이다.
All reactions