AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍으로 하나의 비즈니스 로직은 관심사와 핵심적인 로직으로 이루어져 있다.
여기서 관심사란 소스 코드상에서 계속 반복되는 부분으로 예외처리, 인증 등이 해당된다. 즉 주변 로직, 부가기능으로 볼 수 있다.
💡 관심사의 예
1. 파라미터가 올바르게 들어왔을까??
2. 사용자의 인증을 적절히 받아왔을까??
3. 이 작업에서 발생할 수 있는 예외 처리는 어떻게 해야 할까??
즉 AOP의 목표는 핵심적인 로직에서 관심사를 분리하여 재사용하겠다는 것이다. 이것을 관심사의 분리(=Separate concerns)라고 부른다. 관심사를 분리하면 코드의 반복을 줄일 수 있기 때문이다.
AOP 개발방식에서 개발자가 주의해야 하는 것은 무엇일까 ❓
관심사와 핵심 로직은 컴파일 혹은 실행시간에 결합되기에 어떤 관심사를 붙일 것인지만 고려하면 된다!!
👀 AOP용어 살펴보기
Target : Aspect를 적용하는 곳 (클래스, 메서드..) 즉, 핵심 비즈니스 로직을 의미한다.
Proxy : 내부적으로 관심사들을 거쳐서 Target을 호출하도록 자동 혹은 수동으로 작성한다.
Proxy 객체를 통해 Target 객체의 JoinPoint을 호출한다.
JoinPoint : Target 객체가 가지는 여러 메서드
Aspect과 JoinPoint가 결합되는 것을 자세히 살펴보자 ❗
Aspect : 흩어진 관심사를 모듈화 한 것을 의미한다.
Advice : 실질적인 부가기능을 담은 구현체로 관심사를 의미한다.
Pointcut : 관심사와 비즈니스 로직이 결합되는 지점을 결정하는 것으로 Joinpoint가 가지는 여러 메서드 중 어떤 메서드로 연결할지 설정한다.
💡 Pointcut 선언 Annotation
구분 | 설명 |
execution(@excution) | 메서드를 기준으로 Pointcut 설정 |
within(@within) | 클래스를 기준으로 Pointcut 설정 |
this | 주어진 인터페이스를 구현한 객체에 Pointcut 설정 |
args(@args) | 특정한 파라미터를 가지는 대상들에 Pointcut 설정 |
@annotaion | 특정한 어노테이션이 적용된 대상들에 Pointcut 설정 |