로깅, 보안, 트랜잭션과 같은 공통 기능을 분리하여 하나의 책임을 가지게 하는 프로그래밍 기법
코드의 재사용으로 생산성을 높이고, 유지보수를 용이하게 만든다.

해당 사진처럼 횡단관심 기능이 핵심관심 기능에 공통으로 들어가는데, 이것을 분리하여 핵심관심에 재사용하는 것이 AOP다.
Advice
Target
Joinpoint
Pointcut
Weaving
// Aspect 어노테이션 사용
@Aspect
class A{ // 이곳에서 타겟은 "b()" 메소드다.
// Around: 타켓의 실행 전후로 처리 됨
@Around("b()")
public void test(){
// b() 메소드의 적용될 코드
}
// Before: 타켓이 실행 전 처리 됨
@Before("b()")
public void test2(){
// 생략
}
// After Returning: 타겟이 실행 후 처리 됨
@After Returning("b()")
public void test3(){
// 생략
}
// After Throwing: 타겟이 예외를 발생시키면 처리 됨
@After Throwing("b()")
public void test4(){
// 생략
}
}
이와 같이 Pointcut을 활용하여 특정지점, 또는 시점에 적용할 수 있는 코드를 작성할 수 있다.
SpringFramework에서 제공하는 서비스 추상화 계층
다양한 서비스 기술을 추상화하여 코드를 특정 기술에 종속시켜 구현하는 것이 아닌 변경에 용이하게 편의성을 제공해준다.
해당 프로젝트에는 SpringWeb을 dependency로 가지고 있고, WAS로 Tomcat이 사용되고 있다.

하지만, build.gradle에서 spring-boot-starter-Web을 spring-boot-starter-webflux로 변경하면 내부 코드 변경 없이

WAS가 Netty로 변경된다.
Spring 내부에는 이미 추상화 서비스가 구현되어 있기 때문에 같은 서비스내에서는 내부 코드 변경없이 간단하게 서비스를 변경할 수 있다.
이밖에도 트랜잭션, JDBC, 캐시와 관련된 여러가지 부분이 서비스 추상화 계층을 통해 특정 기술에 의존하지 않고, 일관된 코드로 구현할 수 있게 해주는 핵심이다.