: 컴퓨팅에서 관점 지향 프로그래밍
(aspect-oriented programming, AOP)은 횡단 관심사
(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.
코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행하며, 어느 코드가 포인트컷(pointcut) 사양을 통해 수정되는지를 따로 지정한다.
이를 통해 기능의 코드 핵심부를 어수선하게 채우지 않고도 비즈니스 로직에 핵심적이지 않은 동작들을 프로그램에 추가할 수 있게 한다. (위키백과, 관점 지향 프로그래밍)
오늘도 하나씩 쪼개어 살펴보자..
횡단 관심사를 표현한 가장 흔한 예시는 은행 어플리케이션 로직이다.
은행 어플리케이션에서 계좌이체
, 입출금
, 이자계산
은 해당 어플리케이션의 ⭐핵심 비즈니스 로직⭐
이다.
반면, 로깅
, 보안
, 트랜잭션
은 각각의 핵심 비즈니스 로직에서 공통적으로 동작하는 일종의 ➰부가 기능➰
이다.
위와 같이 프로그램을 짜면,
로깅, 보안, 트랜잭션과 같은 공통된 로직이 매 비즈니스 로직마다 반복되어 작성된다. (= 퇴근 SSAP 불가능 ㅇㅇ)
반복된 코드 작성을 피하고, 유지 보수 및 확장을 용이하게 하려면!?
: 비즈니스 로직의 여러 부분에 공통적으로 사용되는 부가적인 횡단 관심 사항들을 비즈니스 로직에서 분리하여
Aspect
라는 별도의 모듈로 설계, 개발하는 방법
- OOP만 적용된 코드의 단점(중복되는 부분이 많아 길고 지저분한 코드, 개발 생산성 및 재사용성 저하)을 극복
- 핵심 비즈니스 로직 코드 수정 없이도 횡단 관심 로직 적용 가능하도록 분리
- 필요에 따라 횡단 관심 사항의 로직들 언제든지 쉽게 추가, 삭제 가능
- 핵심 비즈니스 로직과 횡단 관심 사항 로직을 서로 독립성을 가진 다차원의 모듈로 작성 가능
- OOP 버리고 AOP = ❌ / OOP와 같이 적용하여 OOP의 단점 보완 = ⭕
AOP + OOP(AOP를 적용한 OOP) = 👍
핵심 로직을 구현하는 클래스,
공통 관심 사항을 적용 받게 되는 대상
여러 객체에 공통적으로 적용되는 공통 관심 사항,
여러 개의 Adivice와 여러 개의 PointCut의 결합체
공통 관심 기능을 언제 핵심 로직에 적용할 지 정의
(🍃스프링 : before, after, afterThrowing, afterRetuning, around)
스프링 Advice | XML스키마 tag | 애노테이션(@) | 의미 |
---|---|---|---|
Before | <aop:before> | @Before | target 객체의 메소드 호출 전 실행 |
After | <aop:after> | @After | target 객체의 메소드 호출 후 실행(정상 또는 예외 발생 유무와 상관없이 실행 ≒ finally) |
AfterThrowing | <aop:after-throwing> | @AfterThrowing | target 객체의 메소드 실행 중 예외 발생 시 실행 |
AfterReturning | <aop:after-returning> | @AfterReturning | target 객체의 메소드가 return 값이 있을 때, 정상 작동했을 경우 실행 |
Around | <aop:around> | @Around | target 객체의 메소드 전, 후, 예외 발생 등 위 4개 Adivce 시점에 모두 실행해야할 로직을 담는 경우 사용 |
연결점, Aspect를 적용할 수 있는지점, PointCut은 JoinPoint의 부분 집합
Aspect를 적용할 실제 타깃(핵심 로직) 메소드를 선택하는 지시자
execution([접근제한자 패턴]* 패키지명.클래스명.메서드명(파라미터 타입))
within(패키지명.메서드명.클래스명.메서드명)
*
로 표현공통 관심 사항 코드를 핵심 로직에 적용하는 것
스프링이 사용하는 위빙 방법은 방법 3) 런타임시 위빙
해당 방법은 소스 코드나 클래스 정보 자체를 변경하지 않고, 프록시를 이용하여 AOP 적용하는 방법,
프록시 기반의 AOP는 핵심 로직을 구현한 프록시를 통해서 핵심 로직을 구현한 객체에 접근할 뿐 원본을 건들지 않는다.
프록시, 프록시하는데 프록시가 뭐지..?
타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑(Wrapping) 오브젝트
클라이언트에서 Target을 호출하면,
Target을 감싸고 있는 프록시 호출 - Target 메소드 실행전에 전처리 - Target 메소드 실행 후 후처리 실행
프록시는 호출을 가로챈 후, Advice에 등록된 기능(before,after 시점의 공통 로직)을 수행 후 Target 메소드를 호출한다.
프록시는 타겟을 감싸 기존 코드를 건드리지 않고, 접근 제어 또는 부가 기능을 추가한다!
오늘의 TIL 끄읏-
그럼 이만.........