AOP는 횡단 관심사의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.
- 공통 관심 사항을 핵심 관심사항으로부터 분리시켜 핵심 로직을 깔끔하게 유지할 수 있다.
- 그에 따라 코드의 가독성, 유지보수성 등을 높일 수 있다.
- 각각의 모듈에 수정이 필요하면 다른 모듈의 수정 없이 해당 로직만 변경하면 된다.
- 공통 로직을 적용할 대상을 선택할 수 있다
AOP가 필요한 이유
주문을 생성하고, 결제를 승인하고, 재고를 차감하는 메서드마다 실행 시간을 기록한다고 해보자. 각 메서드에 측정 코드를 직접 넣으면 같은 코드가 여러 곳에 반복된다. 기록 방식을 바꿀 때도 해당 메서드를 모두 수정해야 한다.
주문·결제·재고 처리처럼 기능마다 고유한 일을 핵심 관심사라고 한다. 로깅, 실행 시간 측정, 트랜잭션처럼 여러 기능에 걸쳐 필요한 일을 횡단 관심사라고 한다. AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 횡단 관심사를 별도의 단위로 모듈화하고, 필요한 지점에 적용하는 방식이다.
핵심 로직이 무엇을 할지와 공통 기능을 어디에서 실행할지를 나누어 관리할 수 있다.
AOP는 객체 지향 설계를 대체하는 개념이 아니라, 여러 객체에 걸친 공통 기능을 다루는 방법이다.
핵심 용어
| 용어 | 의미 | 실행 시간 측정 예시 |
|---|---|---|
| Aspect | 횡단 관심사를 모아 둔 단위 | 실행 시간을 측정하는 모듈 |
| Join point | 부가 기능을 적용할 수 있는 프로그램 실행 지점 | 메서드 실행 |
| Pointcut | 부가 기능을 적용할 Join point를 고르는 조건 | OrderService의 메서드 실행 |
| Advice | 선택된 지점에서 실행할 동작 (실제로 추가되는 부가 기능) | 시작·종료 시각을 기록하는 코드 |
| Target | 부가 기능이 적용되는 대상 | OrderService 객체 |
| Weaving | Aspect를 대상에 연결하는 과정 | 대상 호출에 측정 기능을 결합 |
예를 들어 “주문 서비스의 모든 메서드 실행 시간을 측정한다”는 요구사항에서는 어디에 적용할지를 Pointcut으로, 무엇을 할지를 Advice로 표현한다. 이 둘을 묶어 관리하는 단위가 Aspect다.
Advice는 메서드 실행 전, 정상 반환 후, 예외 발생 후, 종료 후, 실행 전후 전체에 배치할 수 있다. 어떤 지점을 선택하고 어떻게 연결하는지는 AOP 구현 방식에 따라 달라진다.
Spring에서 이 개념을 어떻게 구현하는지는 Spring AOP에서 이어서 다룬다. 특히 Spring AOP의 Join point는 Spring Bean의 메서드 실행으로 한정된다.