이 글은 Spring Framework 5.2.8 버전 Core Technologies의 AOP 문서에 기반하여 작성되었습니다.
Spring AOP 다음과 같은 Advice 타입들이 있습니다.
Before advice
Join point 앞에서 작동하지만 Join point로 흘러가는 흐름은 제어할 수는 없는 Advice입니다. (exception이 발생하는 경우는 제외)
After returning advice
Join point가 문제없이 정상적으로 종료되었을 때 작동하는 Advice입니다. (exception을 던지지 않고 정상적으로 return 된 경우 등)
After throwing advice
exception에 의해 method가 종료되는 경우 작동하는 Advice입니다.
After (finally) advice
정상적으로 종료되었든 exception에 의해 종료되었든 작동하는 Advice입니다.
Around advice
Join point를 감싸고 있는 Advice로, 가장 강력한 형태의 Advice라고 할 수 있습니다. Around advice는 method의 실행 전후에 어떠한 작업을 처리하도록 할 수 있으며, 심지어는 Join point로의 흐름을 제어할 수 있으며, Advice method가 return value를 변경하거나 exception을 던지는 것 또한 가능합니다.
Around advice는 가장 일반적인 종류의 advice입니다. Spring AOP는 AspectJ와 같이 모든 가능한 형태의 Advice 타입들을 지원하지만, 동일한 결과를 얻을 수 있다면 가장 파워가 약한 Advice 타입을 사용하도록 권하고 싶습니다. 예를 들어, 만일 당신이 method의 return 값을 사용하여 cache를 업데이트 하길 원한다면, 당신은 Around advice를 사용하는 것이 아닌 After returning advice를 사용할 수 있습니다. 물론 Around advice로도 동일한 목적을 달성할 수 있겠지만 말입니다. 필요에 따라 적절한 특정 타입의 advice를 선택하여 사용하는 것이 프로그래밍 모델을 더 단순하게 만들고 에러의 위험을 줄여줍니다. 예를 들어, Around advice를 사용하지 않음으로써 명시적인 proceed() 함수를 호출할 일이 없다면, 애초에 method를 호출하는데 실패할 일도 없을 것입니다.
모든 Advice 파라미터들은 정적인 타입이므로, Advice 파라미터들을 사용해야할 때 Object 배열을 받는 것보다 적절한 타입을 사용하는 것이 좋습니다.
Pointcut에 매칭되는 Join point의 개념은 AOP의 키에 해당하며, 인터셉션만 제공하는 구 기술과는 구별되는 점이라고 할 수 있습니다. Pointcut은 객체 지향 계층과 독립적으로 Advice가 타게팅되는 것이 가능하게 합니다. 예를 들어, 서비스 레이어의 비즈니스 작업들과 같은 여러 객체에 존재하는 일련의 메서드에 선언적 트랜잭션 관리를 제공하는 Around advice을 적용 할 수 있습니다. (The concept of join points matched by pointcuts is the key to AOP, which distinguishes it from older technologies offering only interception. Pointcuts enable advice to be targeted independently of the object-oriented hierarchy. For example, you can apply an around advice providing declarative transaction management to a set of methods that span multiple objects(such as all business operations in the service layer))
AOP Concepts
'Java > Spring' 카테고리의 다른 글
Spring AOP: AOP Concepts 1 (0) | 2020.07.30 |
---|---|
Spring AOP: Aspect Oriented Programming with Spring (0) | 2020.07.15 |
Custom Constraint (0) | 2020.07.07 |
@Transactional Attribute (0) | 2020.06.29 |
Spring StopWatch (0) | 2020.04.28 |