728x90
회사에서 데이터가 update가 이루어 질 시 이력 로그를 쌓아달라는 요청을 받아 어떤 방법으로 작업을 진행할까 하다가
AOP와 ASpectJ 복습 겸 정리를 진행하게되었다.
- AOP 란?
점 지향 프로그래밍(Aspect Oriented Progamming) 기법은 객체지향을 보완하는 수단으로, 흩어진 관점(Aspect)를 모듈화 하여 비즈니스 로직을 헤치지 않고 재사용하는 프로그래밍 기법이다.
스프링에서는 AOP를 쉽게 사용 할 수 있도록 어노테이션을 지원한다.
아래는 참고 코드와 컨테이너에서 어떻게 동작하는지를 보여주는 참고 이미지
- AOP 용어
Aspect - 애플리케이션 내 여러 군데에 흩어져있는 코드/기능이며, 실제 비즈니스 로직과는 다릅니다.(예를 들면, 트랜잭션관리). 각 Aspect는 고유한 Cross-Cutting 기능에 초점을 맞추고 있습니다. 쉽게 말하면, 여러 객체에 공통적으로 적용되는 관심 사항을 Aspect라고 합니다.
쉽게 말하면, 여러 객체에 공통적으로 적영되는 관심 사항을 Aspect라고 합니다.
Joinpoint - 프로그램이 실행 중일 때 발생하는 메서드 실행, 생성자 호출, 필드 값 변경과 같은 특수한 지점을 의미
Advice - 특정 Joinpoint의 Aspect에 의한 동작을 의미합니다. 대상 객체의 Joinpoint에 Weaving되어 동작할 수 있는 코드를 의미합니다.
Pointcut - Joinpoint의 정규표현식, Joinpoint가 Pointcut에 일치할 때마다 해당Pointcut에 관련된 Advice가 실행됩니다.
Weaving - Aspect를 대상 객체에 연결시키 관점지향 객체로 만드는 과저을 의미합니다. Advice를 비즈니스 로직 코드에 삽입하는것을 의미합니다.
- AspectJ란?
AspectJ 는 자바에서 완벽한 솔루션 제공을 목표로하는 기술
[ .aj 파일]을 이용한 assertj 컴파일러를 추가로 사용하여 컴파일 시점이나 JVM 클래스 로드시점에 조작한다.
런타임 시점에는 영향끼치지 않는다.
. 즉 컴파일이 완료된 이후에는 앱 성능에 영향이 없다.
밑에서 몸으로 느끼겠지만, Spring AOP에 비해 사용방법이 다양하고 내부 구조가 굉장히 복잡하다.
- AspectJ와 Spring Aop 비교하기
1.기능과 목표가 다르다
Spring AOP는 프로그래머가 직면하는 일반적인 문제 해결을 위해 Spring IoC에서 제공하는 간편한 AOP 기능이다. 어디에나 쓸 수 있는 완벽한 AOP 솔루션이 아니라, Spring 컨테이너가 관리하는 Bean 에만 사용하려고 만들었고, 실제로 여기에만 AOP를 적용 할 수 있다.
AspectJ는 자바코드에서 동작하는 모든 객체에 대한 완벽한 AOP 솔루션 제공을 목표로 하는 기술이다. 성능이 뛰어나고 기능이 매우 강력하지만 그만큼 Spring AOP에 비해 사용방법이나 내부 구조가 훨씬 더 복잡하다.
2. Weaving 방법이 다르다.
Weaving은 공통관심사항(Aspect)의 동작코드(Advice)를 대상 객체(Target)에 연결시켜 관점지향을 구현한 객체로 만드는 과정이다.
좀 더 쉽게 말하면 AOP를 구현하기 위한 바이트코드 조작 방법을 의미한다고 생각하면 된다.
소스코드로 위빙을 구현(Source-code Weaving)하는게 가장 좋긴 하겠지만, 현재까지 자바언어가 제공하는 기능으로 완벽한 AOP를 구현하기 어렵다.
728x90
'코드 > dev' 카테고리의 다른 글
Junit test filtering (2) | 2023.11.17 |
---|---|
비동기처리 시 Spring security 문제 (0) | 2023.11.16 |
저장소에 올라간 브랜치 되돌리기 (2) | 2023.11.15 |
mariaDB Schedule (3) | 2023.11.14 |
RestTemplate Get RequestBody 전송 (0) | 2023.11.14 |