1. 관점 지향 프로그래밍(AOP: Aspect-Oriented-Programming)?
1-1 AOP 개요
- 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것
- 시스템을 핵심관심사(Core Concern)와 횡단관심사(Cross-cutting Concern)로 구분하여 설계와 구현을 한다
핵심관심사 | 시스템의 목적에 해당하는 주요 로직 |
횡단관심사 | 시스템의 여러 부분에 걸쳐 공통적이고 반복적으로 필요로 하는 처리내용. 대표적으로 로깅, 보안, 트랜잭션 관리, 예외처리 등 |
- 시스템의 여러 영역에 걸쳐 공통적이고 반복적으로 적용된 횡단관심사를 분리하여
별도의 모듈에서 설계, 구현, 운영하는 프로그래밍 기법
- 애플리케이션 코드에서 공통적인 기능을 분리해 내는 것이라고 말할 수 있음
AOP는 "OOP(객체지향 프로그래밍)을 더욱 OOP답게 한다"
1-2 AOP 주요용어
- Aspect (애스팩트)
- AOP의 단위가 되는 횡단관심사를 의미
- ex) '로그를 출력한다', '예외를 처리한다', '트랜잭션을 관리한다' - JoinPoint (조인포인트)
- 횡단관심사가 실행될 지점이나 시점 (메서드 실행이나 예외 발생 등)
- 스프링 프레임워크의 AOP에서는 메서드 단위로 JoinPoint를 잡는다 - Advice (어드바이스)
- 횡단관심사를 실제로 처리하는 부분, 특정 JoinPoint에서 실행되는 코드
- Before, After Returning, After Throwing, After, Around 가 있다 (밑에서 설명) - Pointcut (포인트컷)
- 여러 JoinPoint 중 실제로 Advice를 적용할 곳을 선별하기 위한 표현식(expression)
- 일종의 JoinPoint의 그룹이라고 볼 수 있음
- 스프링 AOP에서는 Pointcut을 정의할 때 XML 기반 설정 방식으로 Bean 정의 파일을 만들거나, Annotation 기반 설정 방식으로 소스코드에 주석 형태로 정의 - Weaving (위빙)
- 애플리케이션의 적절한 시점에 Aspect를 적용하는 것을 말함
- 스프링 AOP는 기본적으로 실행시점에 위빙한다 - Target (타깃)
- Aspect가 적용된 객체
- Advice Object라고도 한다
1-3 Spring AOP Advice의 유형
어드바이스 | 실행 시점 | 설명 |
Before | JoinPoint 실행 전 | 예외가 발생하는 경우만 제외하고 항상 실행 |
After Returning | JoinPoint 정상 실행 후 | 예외가 발생 > 실행 X |
After Throwing | JoinPoint 실행> 예외 발생시 | 예외가 발생하지 않고 정상적으로 종료 > 실행 X |
After | JoinPoint 처리 완료 후 실행 | 예외 발생이나 정상 종료 상관없이 항상 실행 |
Around | JoinPoint 전후 실행 | 위 네가지 Advice를 모두포함해서 모든시점에서 실행 |
2. 스프링 AOP
- 스프링 프레임워크 안에는 AOP를 지원하는 모듈로 스프링 AOP가 포함돼 있다
① DI 컨테이너에서 관리하는 Bean 들을 타깃(Target)으로 Advice를 적용하는 기능이 있음
② JoinPoint에 Advice를 적용하는 방법은 Proxy 객체를 만들어서 대체하는 방법을 씀
③ Advice가 적용된 이후, DI 컨테이너에서 Bean을 꺼내보면 원래 있던 Bean 인스턴스가 아니라 Proxy 형태로 Advice 기능이 덧입혀진 Bean이 나온다
- 스프링 AOP에는 AspectJ라는 AOP 프레임워크가 포함돼 있다,
(※ AspectJ : Aspect와 Advice를 정의하기 위한 Annotation 이나 Pointcut 표현 언어(Pointcut Expression Language)로 Weaving 메커니즘을 제공하는 역할)
- 스프링 AOP는 실행시점의 위빙을 기본적으로 지원
- 컴파일이나 클래스 로드 시점에 위빙을 하기 위한 추가적인 설정을 따로하지 않아도 됨
'Java > Spring' 카테고리의 다른 글
[Spring] Bean 설정, 컴포넌트 스캔(Component Scan) (0) | 2021.06.01 |
---|---|
[Spring/MyBatis] MyBatis? (0) | 2021.05.28 |
[Spring] Maven? (0) | 2021.05.23 |
[Spring] IoC (제어 역전, Inversion Of Control) / DI (의존성 주입, Dependency Injection) (0) | 2021.05.20 |
[Spring] 스프링 프레임워크(Java Spring Framework)란? (0) | 2021.05.19 |
댓글