2023 - 02 - 27 (월)
AOP(Aspect Oriented Programming)
-
관점지향 프로그래밍이라고 한다. (공통의 관심사[기능]을 모듈화하여 공통의 관심사를 필요로 하는 부분에 적용)
-
횡단 관심사의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 방법론 중 하나
-
결론적으로 중복코드를 줄이기위해서 사용한다.
AOP 용어
Aspect
- 공통의 관심사를 모듈화 한 것
Target
- 어떤 대상에 부가 기능을 부여할것인가? (공통의 관심사를 필요로 하는 메소드)
Advice
-
어떤 부가 기능을 제공할 것인가?
- Before (메소드 실행 전)
- AfterReturning (메소드 실행 후 정상 리턴했을 때)
- AfterThrowing (메소드 실행 후 예외발생)
- After (메소드 실행 후)
- Around (메소드 실행 전 후)
Join Point
- 어디에 적용할 것인가? (메서드, 필드, 객체, 생성자)
Point cut
- 실제 advice가 적용될 지점
//예시 1
@Aspect
@Component
public class LogAOP { // Aspect : 부가 기능 구현체들을 포함하고 있는 모듈
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// PointCut : 적용할 지점 또는 범위 선택
//@Pointcut("execution(public * com.shj.stock.stockManager.controller..*(..))")
@Pointcut("bean(*Controller)")
private void publicTarget() { }
// Advice : 실제 부가기능 구현부
@Around("publicTarget()")
public Object calcPerformanceAdvice(ProceedingJoinPoint pjp) throws Throwable {
logger.info("성능 측정을 시작합니다.");
StopWatch sw = new StopWatch();
sw.start();
// 비즈니스 로직 (메인 로직)
Object result = pjp.proceed();
sw.stop();
logger.info("성능 측정이 끝났습니다.");
logger.info("걸린시간: {} ms", sw.getLastTaskTimeMillis());
return result;
}
}
정리
- AOP 를 사용함으로써 공통의 관심사 이지만 비즈니스 로직과 관련없는 내용 (예를들어 시간측정 또는 로그) 의 기능을 모듈화하여 하나의 서비스에서 특정 기능만 사용할 수 있도록 함.
- SRP와 연결시킬 수 있는것 같다.(OOP 단일책임원칙)
- 아무튼 AOP 는 OOP를 보완하는 방법론이라 할 수 있음.
- 코드가 변경이 필요한 경우 모듈화하였기 때문에 수정이 용이하고 반복적인 코드를 줄여준다.