AOP(Aspect Oriented Programming)이란 ?
애플리케이션 로직은 크게 `핵심 기능` 과 `부가 기능`으로 나눌 수 있다.
- 핵심 기능 : 해당 객체가 제공하는 고유의 기능
- 부가 기능 : 핵심 기능을 보조하기 위해 제공되는 기능 (ex. 로그 추적 로직, 트랜잭션 기능 등)
이런 부가 기능은 단독으로 사용되지 않고 핵심 기능과 함께 사용된다. 로그 추적 기능은 어떤 핵심 기능이 호출되었는지 로그를 남기기 위해 사용되는 것처럼 말이다.
이때 로깅, 보안, 트랜잭션처럼 여러 모듈에 공통적으로 반복되는 부가 기능을 횡단 관심사(Cross-Cutting Concern)이라고 부른다. 즉, 횡단 관심사는 특정 기능 하나에 국한되지 않고 애플리케이션 전반을 '가로 질러(cross-cutting)' 등장하는 관심사이다.
애플리케이션에 핵심 기능과 이를 돕는 부가 기능이 섞여져 있다. 이 부가 기능을 각 메서드마다 직접 넣으면 중복, 누락, 수정 지옥이 온다. AOP는 부가 기능을 한 군데로 모아 필요한 지점들에 일괄 적용할 수 있게 해준다.
AOP 주요 개념
AOP를 이해하기 위해 꼭 알아야할 5가지 핵심 개념은 다음과 같다.
1) Apsect (관점)
여러 클래스에 공통적으로 적용될 부가 기능들을 모듈화한 단위이다. 로깅, 트랜잭션 처리, 보안 등 하나의 기능의 묶음이 하나의 Aspect가 된다.
2) Join Point (결합점)
Advice를 적용할 수 있는 모든 위치를 의미한다.
3) Pointcut (절단면)
수많은 Join Point 중에서 실제로 Advice를 적용할 지점을 구체적으로 지정하는 표현식이다.
4) Advice (조언)
무엇을, 언제 실행할지 정의하는 실제 로직이다. 메서드 호출 전후, 예외 발생 시 등 다양한 시점에 적용할 수 있다.
- `@Before` : 메서드 실행 전
- `@AfterReturning` : 메서드 성공적 실행 후
- `@AfterThrowing` : 예외 발생 시
- `@Around` : 메서드 실행 전후를 모두 제어
5) Weaving (위빙)
Pointcut으로 지정된 대상에 Advice를 실제로 적용하는 과정이다.
AOP 프레임워크가 이 과정을 대신 처리해준다.
스프링에서 실제로 어떻게 돌아가나 ?
AOP는 결국, 무엇을 언제 어디에 부가 기능을 붙일지 정하는 개념이고, 스프링 AOP는 기본적으로 프록시로 동작한다.

스프링은 `@Aspect, @Transactional` 이 붙은 빈 앞에 프록시(=대리인)을 세운다.
메서드 호출이 프록시를 통과할 때, `Advice(@Before, @Around)` 가 실행되고, 그 다음 실제 메서드가 호출된다.
이 방식이 런타임 프록시 기반 AOP(=스프링 AOP) 이다.
여기서 프록시가 왜 등장하나 ?
부가 기능을 코드마다 일일이 try/finally로 쓰기 싫기 때문에, 호출 지점에서 가로채서 앞뒤로 로직을 붙여주려면 문지기가 필요하다.
프록시에 대한 자세한 내용은 프록시 포스트에서 다루어 보도록 하겠다.
2025.08.13 - [Spring] - [Spring] 프록시(Proxy)
[Spring] 프록시(Proxy)
프록시(Proxy)란 ? 프록시=대신 받아주는 대리인호출이 프록시를 먼저 거치고, 프록시가 필요하면 부가 작업을 수행한 뒤에 진짜 대상을 호출한다. 어디에서 사용되나 ? 네트워크 프록시 서버 : 사
erika0915.tistory.com
참고
[Spring] AOP
이번 포스팅에서는 AOP의 개념과 @Aspect 어노테이션을 활용하여 스프링에서 AOP를 사용하는 예시를 통해 AOP의 동작 과정을 이해해 보도록 하겠습니다. AOP 애플리케이션 로직은 크게 핵심 기능과
velog.io
'Spring' 카테고리의 다른 글
| [Spring] @Transactional 개념과 사용 (0) | 2025.08.19 |
|---|---|
| [Spring] 프록시(Proxy) (0) | 2025.08.13 |
| [Spring] 영속성 컨텍스트(Persistence Context) (3) | 2025.08.11 |
| [Spring] ORM과 JPA(Java Persistence API) (3) | 2025.08.11 |
| [Spring] IoC(Inversion of Control)와 DI(Dependency Injection) (2) | 2025.08.08 |
