-
AOP 적용하기 (+원리 CGlib vs Dynamic Proxy)프로젝트/WebRTC 화상통화 프로젝트 2022. 8. 4. 00:01반응형
이 글을 읽기 전에 프락시 패턴에 대해서 잘 모른다면 다음 글을 읽고 오시면 좋습니다.
https://junuuu.tistory.com/246?category=968252
[Java] 프록시 패턴이란?
프록시 패턴이란? 디자인 패턴 중 하나로, 어떤 클래스를 직접 사용하는 대신에 프록시 클래스를 통해 사용하는 것을 의미합니다. 사장님에게 바로 보고하지 않고 비서에게 보고하면 비서가 사
junuuu.tistory.com
AOP란?
Aspect Oriented Programming의 약자로써 관점 지향 프로그래밍이라 불립니다.
쉽게 풀어 말하면 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화 하겠다는 것입니다.
핵심적인 관점 = 우리가 적용하고자 하는 핵심 비즈니스 로직
부가적인 관점 = 핵심 로직을 실행하기 위해 행해지는 로깅, 메서드 호출 시 걸린 시간 측정 등등
즉, 부가적인 관점에 대해 코드 중복 없이 재사용할 수 있습니다.
등장 배경
예를 들어 메서드의 실행시간을 측정하고 싶습니다.
메서드 호출전 before()를 호출하여 현재시간을 측정하고, 메서드 호출 후 after()를 호출하여 before()에서 기록된 시간과 현재시간의 뺄셈을 통해 실행시간을 측정하고자 합니다.
만약 3개의 서비스가 존재했을 때 3개의 Service에 대해서 메서드 호출 전 before(), after()를 붙여줍니다.
https://jojoldu.tistory.com/71 만약 Service가 100개라면 어떻게 될까요?
100개의 서비스에 대해 일일이 before()와 after()를 작성해야 합니다.
Proxy 패턴을 활용하여서 핵심로직(getBoards(), getUsers(), getXXXs())와 부가기능(before, after)을 분리할 수 있지만 이 또한 100개의 프락시 클래스를 생성하고 인터페이스 메서드를 일일이 구현해주어야 합니다.
이런 불편함을 해결하기 위해서 AOP가 등장하게 됩니다.
AOP 내부 동작 과정
AOP는 어떻게 핵심로직에 부가기능을 넣어줄 수 있을까요?
1. JDK Dynamic Proxy
Interface를 기반으로 Proxy를 생성해주는 방식입니다.
Invocation Handler를 상속받아 invoke 메서드를 구현해줍니다.
Reflection을 이용하기 때문에 성능이 조금 떨어지며 interface를 강제화 한다는 단점이 있습니다.
2. CGlib Proxy
Enhancer를 바탕으로 Proxy를 구현하는 방식입니다.
Reflection을 사용하지 않고 Extends 방식을 이용하여 Proxy화 할 메서드를 오버라이드 하는 방식입니다.
기본적으로 Byte 코드를 조작하여 만들기 때문에 성능적으로 더 우세합니다.
즉, AOP는 런타임 시에 JDK Dynamic Proxy, CGLIB를 활용하여 프락시를 생성하여 줍니다.
AOP 활용 예시
우리가 흔히 보는 @Transactional 애너테이션 또한 AOP가 적용된 대표 사례입니다.
@Transactional 애너테이션을 부착하면 예외 발생 여부에 따라 해당 트랜잭션을 커밋하거나 롤백합니다.
AOP 사용법
Aspect : 묶어 놓은 모듈
Target : 적용이 되는 대상
Advice : Aspect 안의 기능
Join Point : 적용 시점
Point cut : 적용해야 할 위치
프로젝트의 메서드 호출 시 걸린시간 측정 등에 실제 적용해보겠습니다.
AOP의 JoinPoint로 사용할 마킹용 어노테이션 작성
AOP의 적용시점은 패키지, 클래스, 메서드 등 여러 방식으로 지정 가능합니다.
지금은 어노테이션을 기반으로 적용지점을 설정해보겠습니다.
@ExeTimer가 붙은 메서드에 대해 AOP가 수행되도록 합니다.
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface ExeTimer { }
AOP 클래스 작성
package zipzong.zipzong.aop; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.springframework.util.StopWatch; @Slf4j @Aspect @Component public class ExecutionTimer { //JoinPoint를 어노테이션으로 설정 @Pointcut("@annotation(zipzong.zipzong.aop.annotation.ExeTimer)") private void timer(){}; //메서드 실행 전, 후로 시간을 공유 @Around("timer()") public void AssumeExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable{ StopWatch stopWatch = new StopWatch(); stopWatch.start(); joinPoint.proceed(); stopWatch.stop(); long totalTimeMillis = stopWatch.getTotalTimeMillis(); MethodSignature signature = (MethodSignature)joinPoint.getSignature(); String methodName = signature.getMethod().getName(); log.info("실행 메서드: {}, 실행시간 = {}ms", methodName, totalTimeMillis); } }
@PointCut을 통해 모든 JointPoint에서 적용될 JoinPoint를 지정합니다.
@annotation을 이용해서 작성한 어노테이션의 path를 지정합니다.
메서드 전 후로 실행시간을 측정하고자 합니다.
따라서 @Around를 사용합니다.
Stopwatch 클래스를 이용해서 시간을 측정하고 메서드 이름과 함께 로그가 찍히도록 설정합니다.
실행시간을 측정할 메서드 선정
실행시간 측정 AOP를 적용시키기 위해 @ExeTimer를 추가합니다.
위의 URL로 요청을 보냅니다.
http://localhost:8080/member/icon/1
결과
출처
https://tecoble.techcourse.co.kr/post/2021-06-25-aop-transaction/
AOP 입문자를 위한 개념 이해하기
이 글은 AOP 개념이 생소한 입문자들을 위한 포스팅입니다. 1. OOP의 한계 image…
tecoble.techcourse.co.kr
https://engkimbs.tistory.com/746
[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP
| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으..
engkimbs.tistory.com
https://jojoldu.tistory.com/71
AOP 정리 (3)
AOP란? Spring의 핵심 개념중 하나인 DI가 애플리케이션 모듈들 간의 결합도를 낮춰준다면, AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원하는 것입니다. AOP (Aspect-Oriented Progra
jojoldu.tistory.com
https://huisam.tistory.com/entry/springAOP
Spring AOP의 원리 - CGlib vs Dynamic Proxy
Proxy? 먼저 Proxy가 뭘까요.? Proxy는 일종의 대리자 입니다 디자인 패턴중에서 Proxy 패턴을 들어본적이 있으신가요? 우리가 특정한 Interface를 노출시키지 않고, 외부로부터 감추고 싶을 때 사용하는
huisam.tistory.com
https://steady-coding.tistory.com/608
[Spring] AOP와 JDK Dynamic Proxy, CGLIB
spring-study에서 스터디를 진행하고 있습니다. AOP란? AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍을 뜻한다. 관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나
steady-coding.tistory.com
[Spring AOP] 간단한 AOP 적용 예제 (메서드 실행시간 측정)
Spring AOP .. 누구니 2
velog.io
'프로젝트 > WebRTC 화상통화 프로젝트' 카테고리의 다른 글
letsencrypt 인증서 발급하고 OpenVidu에 적용하기 (0) 2022.08.05 Ubuntu에서 Spring, MySQL, Redis Docker Compose로 배포하기 (4) 2022.08.04 스프링 시큐리티가 OAuth 로그인을 처리하는 방법 (0) 2022.08.03 Spring JPA에 Index 적용하기 (0) 2022.08.02 Redis Sorted Set을 이용한 실시간 랭킹 시스템 구축(1) (0) 2022.08.01