AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 객체지향(OOP)을 보완하는 프로그래밍 패러다임이다.
핵심 비즈니스 로직(핵심 관심사)과 여러 곳에 반복되는 공통 기능(횡단 관심사)을 분리해 모듈화한다.

관심의 분리(Separation of Concerns)
핵심 로직과 부가 기능(로깅, 트랜잭션, 보안 등)을 분리한다.
횡단 관심사(Cross-cutting Concerns)
여러 클래스/모듈에 걸쳐 반복되는 공통 기능을 말한다.
모듈화(Modularization)
흩어진 공통 로직을 한 곳(Aspect)에서 관리해 중복을 줄인다.
Aspect
횡단 관심사를 모듈화한 단위. 일반적으로 Pointcut + Advice 조합으로 이해하면 된다.
JoinPoint
Aspect를 적용할 “후보 지점”.
(스프링 AOP에서는 실질적으로 “메서드 실행 지점”이 핵심)
Pointcut
JoinPoint 중에서 “어디에 적용할지”를 선택하는 조건식.
예: execution(* com.example.service.*.*(..))
→ com.example.service 패키지 아래 모든 메서드 실행 지점
Advice
실제로 실행되는 부가 로직(코드).
(Before/After/Around 등 실행 시점에 따라 종류가 갈린다)
Target
Aspect가 적용되는 원본 객체(핵심 비즈니스 로직을 가진 객체)
Weaving
Target에 Aspect를 “엮는” 과정. 결과적으로 프록시 객체가 만들어진다.
Proxy
AOP 적용 결과로 생성되는 객체.
클라이언트는 보통 Target이 아닌 Proxy를 통해 메서드를 호출하게 된다.
| Advice | 실행 시점 | 사용 예 | 특징 |
|---|---|---|---|
| @Before | 메서드 실행 전 | 권한 체크, 요청 로깅 | 대상 메서드 실행 자체를 제어하긴 어려움 |
| @AfterReturning | 정상 종료 후 | 반환값 로깅, 후처리 | 예외 발생 시 실행 안 됨, 반환값 확인 가능 |
| @AfterThrowing | 예외 발생 시 | 에러 로깅, 알림 | 발생한 예외 정보 확인 가능 |
| @After | 메서드 종료 후(항상) | 리소스 정리 | finally와 유사 (성공/실패 무관) |
| @Around | 메서드 전후 | 성능 측정, 트랜잭션 경계 | 가장 강력, 실행 여부/반환값 가공 가능 |
아래 예시는 org.example.aop 패키지의 *Service 클래스의 모든 메서드에 대해
실행 전/후 로그를 남기는 구조다.
@Aspect
@Component
public class LoggerAspect {
@Pointcut("execution(* org.example.aop.*Service.*(..))")
public void pc() {}
@Before("pc()")
public void logging() {
System.out.println("로그를 남깁니다.");
}
@After("pc()")
public void loggingAfter() {
System.out.println("메서드 종료");
}
}
Spring Security 들어가기 전에 AOP 기본기를 보는 건 순서가 좋다.
Security도 결국 “요청 전후에 공통 로직을 걸어주는 구조(필터/인터셉터/AOP)”가 많아서,
AOP의 용어(특히 Proxy, Pointcut, Advice)만 정확히 잡아두면 이해 속도가 확 올라간다.