코드를 작성하다 보면, 비즈니스 로직외에 부가기능을 담당하는 코드를 작성할 때가 종종있다.
사진에서는 빨간색 박스 외에 나머지 코드 실행 시간을 체크하는 로직을 인프라 로직이라고 한다.
이러한 인프라 로직을 비즈니스 로직과 분리하기 위해, 관심사 분리라는 단어가 등장했다.
기능을 관심사를 기준으로 나누다보니, 가로로 비슷한 관심사의 코드가 등장했고, 이를 횡단 관심사라고 불렀다.
이때, 횡단 관심사에 따라 기능 개발하는 방법인 AOP가 등장하게 된 것이다.
AOP는 횡단 관심사에 따라 기능을 개발하는 방법으로, OOP를 보완하는 방법이다.
AOP에는 다양한 용어가 존재한다.
Spring AOP에서는 Aspect J에서와 다르게, 프록시패턴으로 AOP가 동작한다.
(Aspect J에서는 A.java → A.class로 컴파일 시 AOP적용 하거나, A.class를 클래스 로더가 메모리 상에 올릴 때, AOP를 적용시킨다)
실제 주입받은 service를 확인해보니, EnhancerBy~~~로 생성되며, 그 안에 target에 실제 AuthService가 들어가있는 것을 확인할 수 있다.
(여기서는 JDK Proxy말고 CGLib방식으로 proxy로 감싸준 것이다)
즉, Spring AOP를 사용하면 원래는 AuthController가 AuthService를 의존했는데, 런타임시에 AuthService$$블라블라와 같은 proxy를 생성해, 둘 사이에 끼워진 형태로 동작한다.
이 때, CGLib Proxy는 상속을 이용해 Class에 대한 Proxy생성을 지원한다.
따라서 final이나 private Method에 대한 AOP 불가능하다. (상속 된 Proxy 객체 생성 시, Override가 불가하기 때문이다.)
→ 인터페이스 구현하지 않고 해당 구현체를 상속받기 때문에 성능상 이점도 있다.
(추가로, @Transactional이 private method에 적용되지 않는 이유도 이와 같다.)
Spring AOP와 Aspect J도 비교해보자.
Spring AOP는 주로 실행시간 측정이나 로깅작업에 사용된다고 알고 있는데, 로깅작업에 더 좋은 것을 보여주는 것이 있다고 들었다.
그렇다면 생기는 의문점.. Spring AOP는 그럼 도대체 어디서 쓰는 게 좋은걸까? 이미 더 좋은게 있다는데??
위에서 말한 더 좋은 것은 바로 Spring Cloud Sleuth인데, 이것은 Spring Cloud에서 제공하는 Distributed Tracing 솔루션인데, Trace정보를 생성해서 Zipkin이라는 수집 서버에 전송해 검색하거나 시각화해서 사용이 편리하도록 한다.
이 Spring Cloud Sleuth에서는 DB 호출 구간이 표현되지 않기 때문에, Spring AOP를 사용하여 Sleuth API로 Trace정보를 직접 생성해주는 방식으로 확장할 수 있다고한다.
Spring AOP는 메서드 레벨에서 간단한 어노테이션을 추가함에 따라 쉽게 AOP 기능을 제공해준다.
이러한 기능은 주로 실행시간 측정이나 로깅에 쓰인다.
Spring AOP가 좀 더 간단한 프로젝트에서 세밀한 부분에 AOP를 설정하여 로그를 확인을 할 수 있어 보이고, Spring Cloud Sleuth는 MSA 기반 프로젝트에서 전반적인 모니터링을 할 수 있는 도구라고 생각된다.
Spring AOP가 일반 커피라면... Spring Cloud Sleuth은 T.O.P ??
https://youtu.be/Hm0w_9ngDpM - [10분 테코톡 제이의 Spring AOP]