Loading...
Spring Framework Reference Documentation 7.0.2의 AOP Concepts의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
이제 몇 가지 핵심적인 AOP 개념과 용어를 정의하는 것부터 시작해 보겠습니다. 이러한 용어들은 Spring에만 국한된 것이 아닙니다. 안타깝게도 AOP 용어는 그다지 직관적이지 않습니다.
그러나 Spring이 자체 용어를 사용한다면 훨씬 더 혼란스러울 것입니다.
Aspect: 여러 class에 걸쳐 가로지르는 concern을 모듈화한 것입니다. Transaction management는 엔터프라이즈 Java 애플리케이션에서 crosscutting concern의 좋은 예입니다. Spring AOP에서 aspect는 일반 class( schema-based approach)를 사용하거나 @Aspect 어노테이션이 붙은 일반 class( @AspectJ style)를 사용하여 구현됩니다.
Join point: 메서드의 실행이나 exception 처리와 같이 프로그램 실행 중의 한 지점을 말합니다. Spring AOP에서 join point는 항상 메서드 실행을 나타냅니다.
Advice: 특정 join point에서 aspect에 의해 수행되는 action입니다. 다양한 유형의 advice에는 "around", "before", "after" advice가 포함됩니다. (advice 유형은 뒤에서 다룹니다.) Spring을 포함한 많은 AOP framework는 advice를 인터셉터로 모델링하고 join point 주변에 인터셉터 체인을 유지합니다.
Pointcut: join point에 매칭되는 predicate입니다. Advice는 pointcut expression과 연관되며, pointcut에 의해 매칭되는 모든 join point(예를 들어, 특정 이름을 가진 메서드의 실행)에서 실행됩니다. pointcut expression에 의해 매칭되는 join point라는 개념은 AOP의 핵심이며, Spring은 기본적으로 AspectJ pointcut expression language를 사용합니다.
Introduction: 특정 type을 대신하여 추가 메서드나 field를 선언하는 것입니다. Spring AOP는 어떤 advised 객체에든 새로운 interface(와 그에 상응하는 implementation)를 도입할 수 있게 해줍니다. 예를 들어, bean이 caching을 단순화하기 위해 IsModified interface를 구현하도록 만들기 위해 introduction을 사용할 수 있습니다. (AspectJ community에서는 introduction을 inter-type declaration이라고 부릅니다.)
Target object: 하나 이상의 aspect에 의해 advised되는 객체입니다. "advised 객체"라고도 불립니다. Spring AOP는 runtime proxy를 사용하여 구현되므로, 이 객체는 항상 proxied 객체입니다.
AOP proxy: aspect contract(advice 메서드 실행 등)를 구현하기 위해 AOP framework에 의해 생성된 객체입니다. Spring Framework에서 AOP proxy는 JDK dynamic proxy 또는 CGLIB proxy입니다.
Weaving: advised 객체를 생성하기 위해 aspect를 다른 애플리케이션 type이나 객체와 linking하는 것입니다. 이는 (예를 들어 AspectJ compiler를 사용하여) compile time, load time 또는 runtime에 수행될 수 있습니다. 다른 pure Java AOP framework와 마찬가지로 Spring AOP는 runtime에 weaving을 수행합니다.
Spring AOP에는 다음과 같은 유형의 advice가 포함됩니다:
Before advice: join point 이전에 실행되지만, (exception을 던지지 않는 한) 실행 흐름이 join point로 진행되는 것을 막을 수 없는 advice입니다.
After returning advice: join point가 정상적으로 완료된 후(예를 들어, 메서드가 exception을 던지지 않고 반환되는 경우)에 실행되는 advice입니다.
After throwing advice: 메서드가 exception을 던지며 종료되는 경우에 실행되는 advice입니다.
After (finally) advice: join point가 어떤 방식으로 종료되든(정상 반환이든 exceptional return이든) 상관없이 실행되는 advice입니다.
Around advice: 메서드 호출과 같은 join point를 둘러싸는 advice입니다. 이것은 가장 강력한 종류의 advice입니다. Around advice는 메서드 호출 전후에 custom behavior를 수행할 수 있습니다. 또한 join point로 진행할지, 아니면 자체 return value를 반환하거나 exception을 던져 advised 메서드 실행을 바로 종료할지를 선택하는 책임도 집니다.
Around advice는 가장 일반적인 종류의 advice입니다. AspectJ와 마찬가지로 Spring AOP는 전체 범위의 advice 유형을 제공하므로, 요구되는 behavior를 구현할 수 있는 가장 덜 강력한 advice 유형을 사용할 것을 권장합니다. 예를 들어, 메서드의 return value로 cache만 update하면 되는 경우, around advice도 같은 일을 할 수 있지만 around advice를 구현하는 것보다는 after returning advice를 구현하는 편이 더 낫습니다.
가장 구체적인 advice 유형을 사용하면 잠재적인 오류가 더 적은, 더 단순한 프로그래밍 모델을 제공합니다. 예를 들어, around advice에 사용되는 JoinPoint에서 proceed() 메서드를 호출할 필요가 없으므로, 그것을 호출하지 않는 실수를 할 수도 없습니다.
모든 advice parameter는 정적으로 type이 지정되므로, (예를 들어 메서드 실행의 return value type과 같은) 적절한 type의 advice parameter로 작업하게 되며, Object array로 작업하지 않아도 됩니다.
Pointcut에 의해 매칭되는 join point 개념은, AOP를 단순히 interception만 제공하는 기존 기술과 구별 짓는 핵심입니다. Pointcut은 객체 지향 계층과 독립적으로 advice를 타기팅할 수 있게 해줍니다.
예를 들어, 서비스 레이어의 모든 비즈니스 오퍼레이션과 같이 여러 객체에 걸쳐 있는 일련의 메서드에 선언적 트랜잭션 관리를 제공하는 around advice를 적용할 수 있습니다.
Aspect Oriented Programming with Spring
Spring AOP Capabilities and Goals