Service코드에서 필요한 내용은 비즈니스 로직이라고 불리는 핵심 기능이다. 다른 인프라 로직(=부가가능 ex: 로깅)은 어플리케이션의 전 영역에서 나타날 수 있고, 중복코드를 만들어 낼 가능성 때문에 비즈니스 로직과 함께 있으면 유지보수와 해당 로직을 이해하기 힘들어진다.
보통 인프라 로직은 성능검사, 로깅, 권한 체크 등 하나의 관심사를 가지게 된다. 비즈니스 로직을 수행하는데에 있어서 부가기능이 되는 인프라 로직의 중복이 횡단으로 나타나게 되어 횡단 관심사(cores-cutting concern)라고도 불린다.
"AOP complements OOP by another way of thinking about program structure" -spring documentation
AOP는 OOP와 같은 일종의 패러다임으로서, 각 언어마다 AOP의 구현체가 있다. Java는 AspectJ를 사용한다.
JoinPoint와 PointCut의 차이
MemberService의 hello()라는 메소드 실행 전,후에 hello랑 bye를 출력하는 일을 한다고 가정했을 때, MemberService 빈이 타겟, "hello() 메소드 실행 전,후"가 포인트컷, "메소드 실행 전,후"라는게 조인포인트, "hello랑 bye를 출력하는 일"이 Advice아다. 조인포인트는 메타적인 정보, 포인트컷은 좀 더 구체적인 적용 지점이라고 생각하면 된다.
@Transactional 어노테이션도 Spring AOP중 하나이다.
서비스 로직을 하나의 트랜잭션으로 만들 때, 원래는 로직의 시작점에 트랜잭션을 열어주고 로직이 끝나는 시점에서 트랜잭션을 커밋하는 코드가 항상 들어가야 하는데, 이 어노테이션으로 인해 비즈니스 로직에만 집중할 수 있고, 트랜잭션 인프라 로직은 AOP로 분리할 수 있게 된다.
Filter, Interceptor모두 AOP의 일종이다.
[출처:https://www.youtube.com/watch?v=Hm0w_9ngDpM]
Java의 AspectJ:
Spring: