MVC 패턴에서 controller 가 핵심적이지 않지만 주인공인 것과 같이
AOP 의 주인공은 주업무가 아니라 보조업무이다!
크지 않은 프로그램에 사용하면 오히려 더 복잡해질 수 있다.
스프링 기반으로 해서 만든 모든 것들이 IoC/DI 기반이지만,
스프링 기반으로 해서 만든 모든 것들이 AOP 이지는 않다.
AOP 는 enterprise 성격이 더 강하다.
AOP 는 작은 규모에 적용하면, 왜 쓰는지 공감하기 어렵다.
※ 공통의 관심 사항을 적용해서 발생하는 의존 관계의 복잡성과
----------------
→ 보조 업무 (cross-cutting concern), aspect
코드 중복을 해소해 주는 프로그래밍 기법
이것인 것이다.
다만 이것을 횡으로 자른다면
첫번째 보조임무
두번째 보조임무
이렇게 나뉘게 된다.
횡(→)으로 자름
----------------------
- 보조 업무(cross-cutting concern, 공통 관심 기능)
주 업무 실행 시 발생하는 보조적인 업무
주 업무와 분리 및 결합이 쉽게 이루어질 수 있도록 만들어야 한다.
- 주 업무(core concern)
핵심적인 기능을 수행하는 부분
사용자의 요청에 대한 기본적인 수행 및 결과 반환을 해야 한다.
- Advice
언제 어떤 공통 관심 기능(보조 업무, cross-cutting concern)을 적용할지
결정하는 방법
Before Advice, After Advice, Around Advice 등이 있다.
·Before Advice
보조 업무가 주 업무 실행 전에 수행되는 경우
·After Advice
보조 업무가 주 업무 실행 후에 수행되는 경우
·Around Advice
보조 업무가 주 업무 실행 전과 후에 수행되는 경우
- proxy
주 업무를 실행하는 객체와 동일한 모양을 가진 가짜 객체
사용자가 직접 주 업무를 실행하는 객체를 찾아가는 것이 아니라,
proxy 를 찾아가도록 지정하게 된다.
proxy 내부에서 보조 업무를 실행한 후, 주 업무를 호출하도록 하면
외부에서 볼 때 주 업무를 실행하는 것과 같은 결과가 나오도록 할 수 있다.
- joinpoint
proxy 내부에서 주 업무를 호출하는 경우에 특정 지점에만 호출되도록 할 수 있다.
- weaving
advice 를 주 업무에 적용하는 과정을 부르는 명칭
- aspect → 그냥 '보조 업무'라고 해도 상관없다.
여러 주 업무 객체에 공통적으로 적용되는 공통 관심 사항(보조 업무)을
aspect 라고 한다.
주업무에 대한 사용자의 요청을 중간에 프록시(가짜)가 가로챈다.
사용자는 직접 주업무에 도달하지 않는다.
프록시가 보조업무를 땡겨오고, 프록시가 주업무에 뭐 해달라고 하고 그거 받음
프록시가 또 보조업무 수행함
사용자 프록시 보조업무 주업무
(client) (proxy) (cross-cutting concern) (core concern)
○----------------------------------------------------------->○
●----①---->●
●---------②-------->●
●----------------------③----------------------->●
●<---------------------④------------------------●
●---------⑤-------->●
○<-----------------------------------------------------------○
●<----⑥----●
① 사용자는 proxy 객체에 접근한다.
사용자 입장에서는 proxy 객체가 주 업무(core concern) 객체와 동일하게 생각한다.
→ 사용자는 주업무에 접근하는 줄 알지만, proxy 객체에 접근하게 된다.
사용자는 주업무에 닿아서 자기 업무가 수행된 줄 안다.
② proxy 객체 내부에서 보조 업무(cross-cutting concern)를 진행하게 된다.
주 업무 실행 전에 수행되는 보조 업무는
=======
Before Advice, Around Advice 가 있다.
③ proxy 객체 내부에서 주 업무(core concern)를 호출한다.
주 업무가 진행된다.
④ 주 업무가 결과값을 리턴한다.
→ 이 리턴결과는 proxy가 쥐고 있는 것
⑤ proxy 객체 내부에서 보조 업무(cross-cutting concern)를 진행하게 된다.
주 업무 실행 후에 수행되는 보조 업무는
=======
After Advice, Around Advice 가 있다.
-------------
└→ 주업무 실행 전과 후에 둘 다 수행되는거
⑥ 사용자에게 결과값을 리턴한다.
참고로 ④에서 주 업무를 끝내고 다시 ⑤을 진행하는 이유는 주업무가 결과값을 리턴하여 proxy로 리턴한후 남은 보조업무를 마무리지어야 하기 때문