개발 기록
> [AOP] 1. 개념 본문

■
1. 개념
(1) AOP (aspect-oriented programming, 관점 지향 프로그래밍)
관점 지향 프로그래밍
: 횡단 관심사(creoos-cutting concern) 의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임.
코드 그 자체를 수정하지 않고 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행한다.
ex. "함수의 이름이 'set'으로 시작하면 모든 함수 호출을 기록한다" 와 같이 어느 코드가 포인트컷(pointcut) 사양을 통해 수정되는지 지정

(2) Spring AOP 특징
☞ 표준 자바 클래스로 작성
☞ Runtime 시점에 Advice가 적용
☞ 메서드 단위의 조인 포인트만 가능
2 . 용어
| Aspect | ☞ 여러 개체에 걸쳐 적용되는 관심사의 모듈화 |
| Join point | ☞ advice 적용이 가능한 지점 Spring AOP는 메서드 실행 지점을 나타낸다. |
| Advice |
☞ 조인 포인트에서 삽입되어 동작되어질 코드 - Around : 메서드 호출 이전, 이후, 예외 발생 등 모든 시점에서 적용 가능한 Advice 정의 - Before : 메서드 실행전에 적용되는 실행 - After returning : 메서드가 정상적으로 실행된 후에 실행 - After throwing : 예외를 발생시킬 때 적용되는 Advice를 정의 (catch와 비슷) |
| Pointcut |
☞ join point 집합을 의미. 어떤 join point 을 사용할 것이지를 결정하기 위해 패턴 매칭(정규식)을 이용한다. 어드바이스는 포인트컷과 일치하는 조인 포인트에서 실행된다. - @Pointcut(execution()) : 해당하는 모든 메소드에 적용
- @Pointcut(bean()) : 해당하는 bean객체에 모두 적용
|
| Introduction | ☞ 타겟 클래스에 코드 변경없이 신규 메소드나 멤버변수를 추가하는 기능 |
| Target object | ☞ advice 의 대상이 되는 객체 * Spring AOP는 런타임 프록시를 사용하여 구현되므로 이 객체는 항상 프록시 객체이다. |
| AOP proxy | ☞ AOP 기능을 구현하기 위한 프록시 객체 Spring 에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시이다. (Default CGLIB) |
| Weaving | ☞ 지정된 객체에 Aspect 를 적용해서 새로운 프록시 객체를 생성하는 과정을 의미 - 컴파일 시 생성 : AspectJ
* 핵심관심사 모듈 사이에 횡단 관심사 코드 삽입되어 Aspect가 적용된 최종 바이너리 생성 - 클래스 로딩 시 생성 : AspectWerkz
- 런타임 시 생성 : Spring AOP
* 소스 코드나 바이너리 파일의 변경없이 프록시를 이용하여 AOP를 지원하는 방식으로 메소드 호출시에만 AOP 적용 가능 |
3 . AOP 활용
(1) AOP 가 해결 하는 문제
1. 코드 엉킴(Code Tangling)
: 코드 엉킴은 관련 없는 관심사가 단일 모듈이나 클래스에 얽혀 있을 때 발생하는데, AOP는 이러한 문제를 분리하여 코드 가독성과 유지 관리성을 향상시킨다.
2. 코드 분산
: 공통 코드를 중앙 집중화하여 중복을 줄이고 수정 및 유지 관리를 쉽게 만든다.
3. 비효율적인 오류 처리
: 중앙 집중식 오류 처리를 구현하여 각 모듈이나 클래스의 예외를 개별적으로 처리할 필요성을 줄인다.
4. 보안 및 권한 부여
: 보안 관련 코드를 애플리케이션 전체에 분산시키지 않고 일관되고 중앙 집중화된 방식으로 보안 및 권한 부여 정책을 시행한다.
(2) AOP 를 사용하는 예
1. 로깅
: 메서드 시작 및 종료 지점에 대한 중앙 집중식 로깅을 구현
2. 모니터링
: 서비스하는 각 메서드의 소요 시간 체크 하여 병목현상 확인
3. 캐싱
: 메서드에 캐싱 기능을 추가하여 반복 호출을 줄이고 성능 향상
4. 트랜잭션
: 데이터베이스 트랜잭션을 관리하여 해당 트랜잭션이 올바르게 시작, 커밋 또는 롤백되도록 보장
5. 유효성 검사
6. 수정내역 관리
7. 보안/예외처리
8. AOP 를 사용한 데이터베이스 트랜잭션 라우팅 알고리즘
참고
https://velog.io/@dnjwm8612/AOP-Weaving-Proxy
https://galid1.tistory.com/498
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:fdl:aop:aspect
https://backtony.github.io/spring/2021-12-29-spring-aop-2/
'Spring' 카테고리의 다른 글
| > [AOP] 3. 포인트컷(PointCut)의 다양한 표현식 (0) | 2022.10.27 |
|---|---|
| > [Spring Batch] 스프링 배치 - 1. 입문 (개념과 흐름 파악) (0) | 2022.10.25 |
| > [Spring Batch] Scope(@StepScope, @JobScope) & Job Parameter - 1. Job Parameter (0) | 2022.10.17 |
| > [AOP] 2. Aspect 생성과 지시자 사용 (0) | 2022.10.06 |
| > [Spring] Spring 애플리케이션 시작 시 실행되는 로직 작성하기(@PostConstruct, ApplicationListener, CommandLineRunner 등) (0) | 2020.07.10 |