카테고리 없음

Spring AOP 실행 흐름

건우정 2024. 10. 4. 19:13

AOP란? 메소드마다 시작 전/후로 공통적으로 중복해서 들어가는 코드를 따로 분리하자는 것!!

예를 들어, 어떤 사용자가 무엇을 했는지 서버에 로그를 남기기, DB 연결과 해제(getConnection, close()),
메소드 시작과 종료까지 걸리는 실행 시간 측정 등등
 
LoggingAdvice는 시작 전과 후로 공통된 로직[로그 남기기]을 남기는 클래스로 쉽게 이해할 수 있을 것이다.
 
 
 
오늘 수업 중 가장 이해하기 난해한 프록시 객체에 대해서.. 
 
프록시 객체는 비유적으로 생각해서 대리인, 비서(프록시) 라고 보면 된다.
 
회장(핵심 로직 = MessageBeanImpl)님을 만나기 위해서는 우선적으로 비서를 거쳐가야 할 것이다!
 
비서는 그 손님이 회장과 만나기 위해 적절한 절차(사전 작업)가 필요한지 판단하고 필요하다면 그 작업을
수행한다.(LoggingAdvice)
 

사전 작업이 필요없거나 사전 작업이 끝났으면 (핵심 로직 = MessageBeanImpl)을 실행시켜줄 것이다.
 
 
스프링 AOP가 실행되는 과정은 아래와 같다.
 

 

1.  스프링 서버가 로딩(시작)

<bean id = "messageBeanImpl" class = "sample1.MessageBeanImpl">
<bean id = "loggingAdvice" class = "sample1.LoggingAdvice"></bean>
 
위의 싱글톤 인스턴스가 1개씩 각각 메모리에 생성된다.
 
추가로!!!! <aop:config> 이하의 AOP 설정에 따라 프록시 객체가 생성(생성만 되고 실행은 아직)된다.
 

2. 특정 메소드가 실행되면

해당 메소드가 실행되기 전에 프록시 객체(비서)가 실행되어, 그 실행을 가로 챈다.

가장 먼저, 프록시 객체는 사전 작업이 필요한지 여부를 판단한다.

    </aop:pointcut expression="execution(public void sample1.messagebeanimpl.*before(..))" id="beforemethod">
    </aop:pointcut expression="execution(public void sample1.messagebeanimpl.*after(..))" id="aftermethod">
    </aop:pointcut expression="execution(public * *.messagebeanimpl.*print(..))" id="aroundmethod">

포인트컷 표현식은 필터라고 생각하면 된다.

프록시 객체가 포인트컷 표현식에 설정된 정의에 부합하는 것이 있는지 판단을 한다.

위의 표현식에 부합하면 프록시는 LoggingAdvice를 수행하고,

부합하지 않는다면 그냥 원래대로 해당 메소드를 실행한다.

3.  포인트컷 표현식에 부합한다면

  </aop:pointcut expression="execution(public void sample1.messagebeanimpl.*before(..))" id="beforemethod">

  부합하는 표현식 뒤에 id = "beforemethod"와 매핑되는 pointcut-ref ="~~~" 를찾는다.

id = "beforemethod" ----(매핑)---->  pointcut-ref="beforemethod"

  </aop:before method="beforetrace" pointcut-ref="beforemethod">

매핑되는 AOP를 찾았으면 이제, Advice 빈의 메소드를 찾아가야한다!!!

 <aop:aspect ref="loggingadvice">에 ref로 참조하는 Bean id인 loggingadvice를 찾아간다.
 
그리고   <aop:before method="beforeTrace" 에 일치하는 beforeTrace 메소드를 수행시킨다.
 
Before Method 수행이 끝났다면 이제 프록시 객체는 핵심 로직인 messageBeanImpl 빈의 메소드를 수행한다.
 
After의 경우에는 핵심로직을 먼저 수행하고, AOP 부가기능 로직을 수행!
 
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
결론적으로, 스프링에서 메소드가 실행되기 전에 프록시 객체가 가로채서 
 
LoggingAdvice를 수행할 지 여부를 판단하여, 수행이 필요하다면 
 
LoggingAdvice와 핵심 로직의 순서를 적절히 배치시켜주는 역할이라고 볼 수 있다. 
 
순서를 정리하면 
0. 스프링 서버가 실행되면 싱글톤 객체와 프록시 객체가 메모리에 생성된다.
1. 어떤 메소드 실행된다.
2. 실행 되기 전에 프록시가 가로챈다.
3. 프록시가 포인트컷 표현식으로 Advice 수행 여부를 판단
4. 수행이 필요하다면
5. 포인트컷 표현식에 매핑된 Aspect 부가 기능 메소드를 찾아감
6. 프록시 객체가 핵심 기능과 부가 기능 로직 간의 순서를 배치한다.(정해둔 Before After Around에 따라 알맞게)
7. 배치된 순서대로 실행된다.