본문 바로가기

프레임워크/Spring boot

Spring Boot는 Run시에 무엇을 할까 - Spring AOP

Spring boot는 Run시에 BeanFacotory에 Bean Scope가 SingleTon인 객체들에 대해 SingleTon 패턴으로 객체들을 생성한다. 그렇다면 그 이후는 어떻게 될까?

Proxy?

  • 우리는 Spring Framework를 사용하며 아무 생각없이 코드 중간에 Throws 라는 키워드를 사용하여 Exception을 발생시키고는 한다.
  • 그렇다면, 그 키워드가 발생할때 Exception을 어떻게 처리하는지에 대해 생각해봐야 한다.

ProxyFactory

  • 위에서 볼수 있듯이, ProxyFactory는 JDK 동적 프록시인지, CGLIB인지 선택해서 Proxy객체를 생성하는 역할을 담당한다.

JDK동적 프록시 vs CGLIB는 다음 글을 참고하자.

https://ptrsr.tistory.com/192

 

Spring Aop

Aop란? AOP(Aspect Oriented Programing)는 관점지향형 프로그래밍이다. 이는 반복 사용되는 로직들을 모듈화 하여 필요할때 호출해서 사용하는 방법이다. 즉 횡단 관심사(Cross-Cutting Concern)의 분리를 허용

ptrsr.tistory.com

 

코드로 확인하면 다음과 같다.

  • DefaultAopProxyFactory가 해당 임무를 담당하며, interface가 기반이면 JDK Dinamic Proxy아니면 CGLIB Proxy가 Proxy객체 생성을 담당한다.

종합적인 순서

간단한 순서를 들어 설명해보겠다.

빈 팩토리에서 Bean의 생성을 담당하는 AbstractAutowireCapableBeanFactory 클래스에는 해당 메소드가 있다.

해당 메소드에서는 postProcessAfterInitialization()이라는 메소드를 호출하게 되고

해당 메소드에서는 factory.getProxy()를 호출하게 된다.

Proxy생성을 담당하는 ProxyFactory클래스는 createAopProxy()로 Proxy객체를 생성한후 getProxy() 메소드를 호출한다.

getProxy() 메소드는 getCallbacks()함수를 호출한다.

getCallBacks()함수는 targetInterceptor를 설정한다.

그래서 우리가 Spring AOP를 사용할때, MethodInterceptor class를 상속받은 구현체를 설정해주는것이다.

 

그래서 PointCut으로 적용되는 Method를 호출할때는, Interceptor의 intercept()함수가 먼저 호출되고 해당 intercept()함수에는 다음과 같은 Method가 존재한다.

해당 함수를 자세히 보면 try{} catch{} 구문으로 된걸 알수 있다.

따라서 이제 알수 있다. 왜 Throws를 할때 Exception처리가 가능한지.

결론

  • Throws처리 할때, 처리가 가능한건 Spring Proxy객체때문이다.
  • 해당 객체에서 try{}, catch{} 처리를 하기에 Exception처리가 가능하다.(단 당연히 RuntimeException을 상속한 객체로 Throws new 처리해야 한다.)