관점지향 프로그래밍(Aspect-Oriented Programming, AOP)은 객체지향 프로그래밍(OOP)을 보완하여 소프트웨어의 복잡도를 낮추기 위해 등장한 패러다임.
1. 등장 배경: OOP의 한계
객체지향 프로그래밍(OOP)은 모듈화를 통해 재사용성을 높였지만, 특정 기능들이 여러 클래스에 걸쳐 중복되는 문제를 완전히 해결하지 못함.
- 코드 중복 (Code Duplication) : 로깅(Logging), 보안(Security), 트랜잭션(Transaction) 처리와 같은 기능은 거의 모든 비즈니스 로직에 공통적으로 필요합니다. 이를 각 객체마다 작성하면 코드가 중복됩니다.
- 흩어진 관심사 (Scattered Concerns) : 공통 기능이 여러 모듈에 흩어져 있어, 코드를 수정할 때 해당 기능이 포함된 모든 곳을 찾아 고쳐야 하는 유지보수의 어려움이 발생합니다.
- 핵심 로직의 가독성 저하 : 비즈니스 로직(Core Concern) 사이에 부가 기능(Cross-cutting Concern) 코드가 섞여 있어 코드를 파악하기 어렵게 만듭니다.
2. AOP의 정의 및 설명
AOP는 프로그램을 작성할 때 '핵심 관심사'와 '횡단 관심사'를 분리하여 설계하는 기법
- 핵심 관심사 (Primary=Core Concerns) : 사용자가 요청한 비즈니스 로직 (예: 계좌 이체, 상품 주문)
- 횡단 관심사 (Cross-cutting Concerns) : 여러 모듈에 공통적으로 적용되는 부가 기능 (예: 로그 남기기, 권한 체크)
AOP는 이러한 횡단 관심사를 별도의 'Aspect'라는 단위로 모듈화하여, 실행 시점에 필요한 곳에 삽입. 이를 통해 개발자는 순수하게 비즈니스 로직에만 집중할 수 있음.

3. AOP 주요 용어
| 용어 | 설명 |
| Aspect (관점) | 횡단 관심사를 모듈화한 것입니다. (Advice + Pointcut) |
| Join Point (결합지점) | Advice가 적용될 수 있는 실행 지점입니다. (메서드 호출, 생성자 호출 등) 관심사를 구현한 코드를 끼워 넣을 수 있는 프로그램의 이벤트. 예) Call events, execution events, initialization events 등 |
| Advice (어드바이스) | 실질적으로 수행해야 할 부가 기능 코드 자체를 의미합니다.(관심사를 구현한 소스코드.) |
| Pointcut (지점 설정) | Advice를 적용할 Join Point를 선별하는 규칙이나 표현식입니다. 관심사가 주프로그램의 어디에 횡단할 것인지를 지정하는 문장. 연관된 관점 어드바이스가 실행되어야 하는 결합지점을 정의. 예) before: call(public void update * (...)) 등 |
| Target (대상) | Advice가 적용되는 대상 객체(비즈니스 로직을 가진 클래스 등)입니다. |
| Weaving (결합) | Aspect를 비즈니스 로직 코드와 결합하여 실행 가능한 객체로 만드는 과정입니다. |
