AOP

유동현·2022년 11월 10일
0
post-thumbnail

✏️개요

MVC 패턴에서 controller 가 핵심적이지 않지만 주인공인 것과 같이
AOP 의 주인공은 주업무가 아니라 보조업무이다!

크지 않은 프로그램에 사용하면 오히려 더 복잡해질 수 있다.
스프링 기반으로 해서 만든 모든 것들이 IoC/DI 기반이지만,
스프링 기반으로 해서 만든 모든 것들이 AOP 이지는 않다.
AOP 는 enterprise 성격이 더 강하다.
AOP 는 작은 규모에 적용하면, 왜 쓰는지 공감하기 어렵다.

※ 공통의 관심 사항을 적용해서 발생하는 의존 관계의 복잡성과
   ----------------
   → 보조 업무 (cross-cutting concern), aspect
   코드 중복을 해소해 주는 프로그래밍 기법

개념

  • 주 업무를 실행할 때 보조적인 업무(주 업무 실행 시간 체크, 로그 기록 등)가 진행되어야 한다.
    만약, 주 업무가 여러 개이고, 동일한 보조 업무의 수행이 진행되어야 한다면
    보조 업무 부분은 중복된 코드가 될 수 밖에 없다.
    이런 중복 요소를 제거하고 보조 업무를 보다 독립적인 방법으로 실행할 수 있도록
    구성하는 것을 AOP 기법이라고 한다.
  • 즉 주업무는 위 사진에서의 각 협약서들이고 보조업무는 협약서의 제작을 위한 기본바탕인

이것인 것이다.

다만 이것을 횡으로 자른다면

  • 첫번째 보조임무

  • 두번째 보조임무

이렇게 나뉘게 된다.




주요 용어

		횡(→)으로 자름
	      ----------------------
   - 보조 업무(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로 리턴한후 남은 보조업무를 마무리지어야 하기 때문

0개의 댓글