[Spring] AOP(Aspect Oriented Programming)

지수·2021년 10월 4일
1

플레이데이터

목록 보기
40/50
post-thumbnail

1. AOP란?

Aspect Oriented Programming(관점 지향 프로그래밍)


: 컴퓨팅에서 관점 지향 프로그래밍(aspect-oriented programming, AOP)은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.
코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행하며, 어느 코드가 포인트컷(pointcut) 사양을 통해 수정되는지를 따로 지정한다.
이를 통해 기능의 코드 핵심부를 어수선하게 채우지 않고도 비즈니스 로직에 핵심적이지 않은 동작들을 프로그램에 추가할 수 있게 한다. (위키백과, 관점 지향 프로그래밍)



오늘도 하나씩 쪼개어 살펴보자..

횡단 관심사(a.k.a 흩어진 관심사)?

횡단 관심사를 표현한 가장 흔한 예시는 은행 어플리케이션 로직이다.
은행 어플리케이션에서 계좌이체, 입출금, 이자계산은 해당 어플리케이션의 ⭐핵심 비즈니스 로직⭐이다.
반면, 로깅, 보안, 트랜잭션은 각각의 핵심 비즈니스 로직에서 공통적으로 동작하는 일종의 ➰부가 기능➰이다.

위와 같이 프로그램을 짜면,
로깅, 보안, 트랜잭션과 같은 공통된 로직이 매 비즈니스 로직마다 반복되어 작성된다. (= 퇴근 SSAP 불가능 ㅇㅇ)
반복된 코드 작성을 피하고, 유지 보수 및 확장을 용이하게 하려면!?



AOP를 적용하여 비즈니스 로직과 공통 로직을 분리하고, 매핑해주어야 한다. 이렇게!

ㄴ AOP = 횡단 관심 사항의 분리+매핑 = 모듈화

ㄴ Aspect = 핵심 로직에 적용되어야만 의미를 갖는 부수적 기능

: 비즈니스 로직의 여러 부분에 공통적으로 사용되는 부가적인 횡단 관심 사항들을 비즈니스 로직에서 분리하여 Aspect라는 별도의 모듈로 설계, 개발하는 방법

  • OOP만 적용된 코드의 단점(중복되는 부분이 많아 길고 지저분한 코드, 개발 생산성 및 재사용성 저하)을 극복
  • 핵심 비즈니스 로직 코드 수정 없이도 횡단 관심 로직 적용 가능하도록 분리
  • 필요에 따라 횡단 관심 사항의 로직들 언제든지 쉽게 추가, 삭제 가능
  • 핵심 비즈니스 로직과 횡단 관심 사항 로직을 서로 독립성을 가진 다차원의 모듈로 작성 가능
  • OOP 버리고 AOP = ❌ / OOP와 같이 적용하여 OOP의 단점 보완 = ⭕
    AOP + OOP(AOP를 적용한 OOP) = 👍



2. AOP 주요 용어

> Target

핵심 로직을 구현하는 클래스,
공통 관심 사항을 적용 받게 되는 대상

> Aspect

여러 객체에 공통적으로 적용되는 공통 관심 사항,
여러 개의 Adivice와 여러 개의 PointCut의 결합체

> Advice

공통 관심 기능을 언제 핵심 로직에 적용할 지 정의
(🍃스프링 : before, after, afterThrowing, afterRetuning, around)

스프링 AdviceXML스키마 tag애노테이션(@)의미
Before<aop:before>@Beforetarget 객체의 메소드 호출 전 실행
After<aop:after>@Aftertarget 객체의 메소드 호출 후 실행(정상 또는 예외 발생 유무와 상관없이 실행 ≒ finally)
AfterThrowing<aop:after-throwing>@AfterThrowingtarget 객체의 메소드 실행 중 예외 발생 시 실행
AfterReturning<aop:after-returning>@AfterReturningtarget 객체의 메소드가 return 값이 있을 때, 정상 작동했을 경우 실행
Around<aop:around>@Aroundtarget 객체의 메소드 전, 후, 예외 발생 등 위 4개 Adivce 시점에 모두 실행해야할 로직을 담는 경우 사용

> JoinPoint

연결점, Aspect를 적용할 수 있는지점, PointCut은 JoinPoint의 부분 집합

> PointCut

Aspect를 적용할 실제 타깃(핵심 로직) 메소드를 선택하는 지시자

  • excution() 표현식 : execution([접근제한자 패턴]* 패키지명.클래스명.메서드명(파라미터 타입))
  • within() 표현식 : within(패키지명.메서드명.클래스명.메서드명)
  • 전체를 선택할 때는 *로 표현

> Weaving

공통 관심 사항 코드를 핵심 로직에 적용하는 것




3. Weaving 방식 3가지

방법 1) 컴파일 시 위빙

방법 2) 클래스 로딩시(메모리에 올릴 때) 위빙

방법 3) 런타임시 위빙(🍃스프링)

스프링이 사용하는 위빙 방법은 방법 3) 런타임시 위빙
해당 방법은 소스 코드나 클래스 정보 자체를 변경하지 않고, 프록시를 이용하여 AOP 적용하는 방법,
프록시 기반의 AOP는 핵심 로직을 구현한 프록시를 통해서 핵심 로직을 구현한 객체에 접근할 뿐 원본을 건들지 않는다.




4. 프록시(proxy)

프록시, 프록시하는데 프록시가 뭐지..?

타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑(Wrapping) 오브젝트

클라이언트에서 Target을 호출하면,
Target을 감싸고 있는 프록시 호출 - Target 메소드 실행전에 전처리 - Target 메소드 실행 후 후처리 실행

프록시는 호출을 가로챈 후, Advice에 등록된 기능(before,after 시점의 공통 로직)을 수행 후 Target 메소드를 호출한다.

프록시는 타겟을 감싸 기존 코드를 건드리지 않고, 접근 제어 또는 부가 기능을 추가한다!




오늘의 TIL 끄읏-
그럼 이만.........

profile
사부작 사부작

0개의 댓글