Spring의 핵심 기능 중 하나인 AOP에 대해서 알아보고자 한다.
[ 참고 블로그 ]
[Spring AOP] 간단한 AOP 적용 예제 (Logging)
Spring AOP .. 누구니
velog.io
https://java-is-happy-things.tistory.com/41
[Spring] Spring AOP + 예제 실습
Spring AOP AOP란 : AOP는 (Aspect Oriented Programming)의 약자로, 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법이다. AOP는 핵심기능과 공통기능의 구현을 분
java-is-happy-things.tistory.com
https://www.youtube.com/watch?v=Hm0w_9ngDpM
1. AOP란 무엇일까?
Aspect Oriented Programming의 줄임말로 한국어로 번역하면
관점 지향 프로그래밍이다
OOP와 비슷한 개념이지만, 정확히는 OOP의 부족한 점을 채워주는 것이 AOP라고 이해해도 좋다
관점 지향 프로그래밍이란 어떤 것을 의미하는 것일까 ?
한 서비스를 예로 들어보자
은행 관리 애플리케이션에서
결제와 송금을 예로 들어보자
결제 로직은 결제만을 객체 지향적으로 담당, 송금 또한 송금 기능만을 메소드로 담당 하고 있을 것이다.
하지만 그곳에 부가적으로 결제 시간, 송금 시간 등을 체크하는 기능이 있다고 가정해보자.
그리고 이러한 로직 시간을 계산해야 하는 기능을 모든 메소드에 넣어야한다면 어떻게 처리하겠는가 ?
모든 메소드에 이러한 부가기능을 넣는 것은 굉장히 비효율적이고 유지보수시에도 굉장히 좋지 못하다.
그럴 때 그러한 부가 기능의 관점적으로 분리하여 처리하게 해주는 것이 AOP라고 생각하면된다.
2. AOP 용어 정리
AOP에 대해서 위에서 간단히 알아보았다. 그렇다면 AOP를 사용하기 위한 기본적인 용어에 대해서 알아보자.
@Slf4j
@Aspect
@Component
public class SimpleLogAop {
// com.aop.controller 이하 패키지의 모든 클래스 이하 모든 메서드에 적용
@Pointcut("execution(* com.aop.controller..*.*(..))")
private void cut(){}
// Pointcut에 의해 필터링된 경로로 들어오는 경우 메서드 호출 전에 적용
@Before("cut()")
public void beforeParameterLog(JoinPoint joinPoint) {
// 메서드 정보 받아오기
Method method = getMethod(joinPoint);
log.info("======= method name = {} =======", method.getName());
// 파라미터 받아오기
Object[] args = joinPoint.getArgs();
if (args.length <= 0) log.info("no parameter");
for (Object arg : args) {
log.info("parameter type = {}", arg.getClass().getSimpleName());
log.info("parameter value = {}", arg);
}
}
// Poincut에 의해 필터링된 경로로 들어오는 경우 메서드 리턴 후에 적용
@AfterReturning(value = "cut()", returning = "returnObj")
public void afterReturnLog(JoinPoint joinPoint, Object returnObj) {
// 메서드 정보 받아오기
Method method = getMethod(joinPoint);
log.info("======= method name = {} =======", method.getName());
log.info("return type = {}", returnObj.getClass().getSimpleName());
log.info("return value = {}", returnObj);
}
// JoinPoint로 메서드 정보 가져오기
private Method getMethod(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
return signature.getMethod();
}
}
@Aspect : AOP라는 걸 선언해주는 어노테이션 (Aspect 클래스는 반드시 빈에 등록되어야만 한다)
@PointCut : Aspect를 어디에 적용 시킬 건지 범위를 정해준다
* Aspect라는 용어는 Advice(언제 공통 기능을 핵심 로직에 적용할 지를 정의한 것)와 PointCut(어디에 적용시킬 건지 정의한 것)의 합쳐진 말이다
JoinPoint : 실행 메소드에 접근 가능
[ Advice의 종류 ]
Before : 호출 전 공통 기능 실행
After Returning : Exception 없이 정상 실행 이후 공통 기능 실행
After Throwing : 메서드에서 Exception 발생 시 공통 기능 실행
After : Exception 여부와 관계 없이 실행
Around : 메소드 실행 전, 후 또는 Exception 발생 시점에 공통 기능 실행 (JoinPoint가 아닌 ProceedingJoinPoint를 사용)
3. 결론
알고는 있었지만 어디에 사용하는지 처음 공부 할 때는 몰랐지만,
AOP는 지금 공부해보니 이미 내가 사용하고 있는 기능인 @transactional 자체가 AOP 중 하나였다는 것을 알게 되었다.
그 외에도 로그를 찍어봐야하거나 할 때 사용하면 굉장히 유용할 것 같다
'Spring' 카테고리의 다른 글
DI란 무엇일까? (0) | 2024.01.22 |
---|---|
Redis가 무엇일까 ? 어떻게 사용할 수 있을까 ? (0) | 2024.01.14 |
Spring 로그인 / Session : JWT 차이점과 장단점 (0) | 2024.01.10 |
JPA N+1 문제가 생기는 이유와 해결 과정 대해서... (0) | 2024.01.09 |
배치와 스케줄링에 대하여... (2) | 2024.01.07 |