본문 바로가기
Back/Spring

[Spring] AOP

by Inventer 2022. 2. 8.

1. 정의

정의부터 나열한다. 아래에서 최대한 쉽게 풀이해보도록 하겠다.

 

AOP, Aspect Oriented Programming(= 관점 지향 프로그래밍)은

횡단 관심사의 분리를 허용함으로, 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.

 

횡단(흩어진) 관심사(CrossCutting Concern)는 다른 관심사에 영향을 미치는 프로그램의 에스펙트이다.

 

에스펙트(Aspect)의 사전적의미는 측면, 양상, 관점과 같은 명사이며 Spring에서는 하나의 측면과 같은 부가적인 기능이다.

 

AOP는 횡단 관심사들을 에스펙트로 캡슐화함으로써 모듈화를 갖는 것을 목표로한다.

 

2. 설명

<Fig 1> AOP

 

<Fig 1>에서 분리되기 전 Class A, B, C는 다른 부가기능까지 하나의 클래스에서 정의되어 있다. 따라서 주황색 기능에서 수정이 필요하다면, A, B, C 각각 수정해야하는 번거로움을 가진다. 이런식으로 반복되고 있는 코드들을 횡단 관심사(CrossCutting Concerns)라고 부른다.

 

AOP의 정의는 횡단 관심사의 분리를 허용하는 것이다. 즉 화살표 이후의 아래그림처럼 각각의 색을 갖는 부가적인 기능(=Aspect)으로 분리한 것. (이해하면 당연한 그림인데, 정말 말들을 어렵게 써놓은 것 같다.)

 

AOP : 반복되는 코드를 분리해서 모듈화 시키는 방법

횡단 관심사 : 여러 코드에 영향을 미치는 기능 집합

Aspect : 부가적인 기능 하나

 

그러니 당연하게도 특정시점에 자주 발생하는 기능들을 AOP로 분리하여 처리할 것이다.

(계속 발생해서 귀찮은건 AOP로 처리하자란 느낌인 듯)

Spring에서는 아래와 같은 부분에서 AOP를 사용한다.

  • 로깅(logging)
  • 트랜잭션(transaction)
  • 인증(authentication)

<Fig 2> logic

<Fig 2>는 하나의 프로그램 흐름이고, 여기서 등장하는 Advice는 로깅, 트랜잭션, 인증과 같은 동작을 의미한다.

Pointcut은 하나의 조건 식이고, Join Point는 Aspect를 사용할 수 있는 시점인 것.

흐름으로 표현하면 아래와 같다.

 

1. B 지점에서 동작하는 B_Pointcut을 만들었다.

2. 이때 B_Pointcut 전후로는 B_Advice가 실행된다.

3. 따라서 B_Pointcut과 B_Advice를 합쳐서 B_Aspect라고 부르겠다.

4. 프로그램 흐름 중 Join Point는 총 A, B, C가 존재한다.

5. 흐름이 B지점에 도착했을 때 B_Pointcut에 맞물렸고, B_Advice가 실행된다. (= B_Aspect가 실행된다.)

 

 

3. AOP 적용(=AOP Proxy)

이번에는 AOP가 Spring에서 구현되는 방법에 대해 알아보도록 한다.

Proxy Pattern을 이용해서 구현하기에 AOP Proxy라고 한다.

아래는 하나의 예시이다.

 

만약 Class에 5개의 메서드가 있다고 가정하자. 이 Class의 모든 메서드에 AOP를 적용하기 위해서는 Proxy 패턴을 각 메서드마다 만들어 주어야한다. 불필요한 반복작업이기에, 정적으로 프록시를 만들어서 AOP를 구현하는 것이 아니라 프록시를 조건에 따라 자동으로 만들어주는 동적 프록시를 이용한다.

 

아래는 UsefulAspect라는 Aspect를 생성한 것이다.

Pointcut이 있고, Advice로 anyOldTransfer()이 존재하는 것을 알 수 있다.

package org.xyz;
import org.aspectj.lang.annotation.Aspect;

@Aspect
@Component  // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect {

	@Pointcut("execution(* transfer(..))")
	private void anyOldTransfer() {}
}

pointcut안에 있는 표현식은 따로 검색해보길 바란다.

ex) @Pointcut{"execution(public * * (..))"} 인 경우에는 public 메서드를 대상으로 전부 수행하는 pointcut임.

 

advice는 pointcut을 기준으로, 전, 후, 전후로 나눠 구분된다.

 


참고문헌

[1] AOP의 개요

https://engkimbs.tistory.com/746

 

[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP

| 스프링 AOP ( Aspect Oriented Programming ) AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으..

engkimbs.tistory.com

 

https://ko.wikipedia.org/wiki/%EA%B4%80%EC%A0%90_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

관점 지향 프로그래밍 - 위키백과, 우리 모두의 백과사전

컴퓨팅에서 관점 지향 프로그래밍(aspect-oriented programming, AOP)은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 코드 그 자체

ko.wikipedia.org

 

https://devlog-wjdrbs96.tistory.com/398

 

[Spring] AOP(Aspect Oriented Programming)란 무엇일까?

AOP(Aspect Oriented Programming)란 무엇일까? 스프링의 삼각형 중에 하나가 AOP(Aspect Oriented Programming) 입니다. 이번 글에서는 어렵고 중요한 AOP에 대해서 정리해보겠습니다. AOP 는 Aspect Oriented Pr..

devlog-wjdrbs96.tistory.com

 

https://sabarada.tistory.com/97

 

[Spring] Spring AOP - 원리편

안녕하세요. 오늘은 Spring AOP의 3번째 시간으로 마지막 시간입니다. 오늘은 AOP가 Spring 내부에서 구현되는 원리에 대해서 한번 알아보는 시간을 가져보도록 하겠습니다. AOP를 사용하는 방법 및 기

sabarada.tistory.com

 

'Back > Spring' 카테고리의 다른 글

[Spring] Null Safety  (0) 2022.02.08
[Spring] SpEL(Spring Expression Language)  (0) 2022.02.08
[Spring] Resource  (0) 2022.02.08
[Spring] Validation, Data Binding  (0) 2022.02.08
스프링(Spring)이란?  (0) 2022.01.11

댓글