관점 지향 프로그래밍(Aspect Oriented Programming)의 약자이다.
애플리케이션의 여러 부분에 걸쳐 있는 기능을 횡단 관심사(Cross-cutting concerns)라고 한다.
AOP는 이러한 횡단 관심사를 분리하고 분리한 기능을 어디에 어떻게 적용할지 선언적으로 정의할 수 있다.

AOP의 목적은 횡단 관심사와 이에 영향받는 객체 간 결합도를 낮추는데 있다.
애스펙트(Aspect)는 횡단 관심사를 분리하여 작성한 클래스이다. (어드바이스 + 포인트컷)
어드바이스(Advice)는 애스펙트가 해야 할 작업과 언제 그 작업을 수행해야 하는지 정의하는 것을 말한다.

조인포인트(JoinPoint)는 어드바이스가 적용될 수 있는 모든 곳을 의미한다. (메소드 호출 지점, 예외 발생 지점, 필드 등)
포인트컷(PointCut)은 여러 조인포인트 중에 실제 어드바이스가 적용될 조인 포인트를 정의하는 것을 말한다.
대상 객체(Target Object)는 애스펙트가 적용될 객체를 말한다.
위빙(Weaving)은 대상 객체에 애스펙트를 적용하는 것을 말한다.


@Aspect
@Component
public class 클래스명 {
@Before("포인트컷 지정자")
public void before() {
// 메소드 실행 전에 적용되는 어드바이스를 정의
}
@After("포인트컷 지정자")
public void after() {
// 메소드 실행 후에 적용되는 어드바이스를 정의
}
@AfterReturning("포인트컷 지정자")
public void success() {
// 메소드가 정상적으로 실행된 후에 적용되는 어드바이스를 정의
}
@AfterThrowing("포인트컷 지정자")
public void fail() {
// 메소드가 예외를 발생시킬 때 적용되는 어드바이스를 정의
}
@Around("포인트컷 지정자")
public String around(ProceedingJoinPoint jp) {
// 메소드 호출 이전, 이후, 예외 발생 등 모든 시점에 적용 가능한 어드바이스를 정의
}
}