본문 바로가기

WEB

[Spring] AOP의 개념과 용어

[AOP의 개념]


AOPAspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.

 

관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화는 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.

 

 

예를들어 나눗셈을 구현한다고 가정해보자.

핵심 로직은 두 수를 나누는 것이고 주변 로직은 0 을 나누는 것이 아닌지 등을 체크하는 것이다.

 

 

AOP는 중요한 로직은 아니지만, 0 을 나누는 것과 같은 사전 조건이나 사후 조건 같은 '관심사'를 비즈니스 로직과 분리시켜 모듈화하고, 실행할 때 관심사와 비즈니스 로직을 결합하는 방식이다.

 

실제 실행은 관심사+비즈니스 로직인 결합된 상태의 코드가 실행되기 때문에 개발자들은 핵심 비즈니스 로직에만 근거해서 코드를 작성하고, 나머지는 어떤 관심사들과 결합할 것인지를 설정하는 것 만으로 모든 개발을 마칠 수 있게 된다.

 

이러한 AOP는 공통 관심 기능을 분리하여 반복되는 부분을 추출해 핵심 로직에 영향을 미치지 않고 소스의 중복을 줄이는 방법으로 기존 OOP(객체 지향 프로그래밍)에서 공통 관심 기능을 여러 모듈에서 적용하며 발생하는 중복된 코드 양산의 한계를 극복하기 위해 나오게 되었다.

 

 

위 그림에서 계좌이체, 입출금, 이자계산 모듈이 핵심기능에 해당되며, 로깅, 보안, 트랜잭션이 부가기능에 해당된다.

부가기능에 해당하는 로깅, 보안, 트랜잭션을 핵심기능에서 분리하여 코드를 짜는 방법이 AOP이다.

 

 

[AOP의 용어]


AOP
Advice와 JoinPoint의 관계를 상세하기 표현한 그림

 

1. Target

  • 개발자가 작성한 핵심 비즈니스 로직을 가지는 객체
  • 순수한 비즈니스 로직을 의미하고 어떠한 관심사들과도 관계를 맺지 않는다. 

 

2. Proxy

  • 내부적으로 Target을 호출하지만, 중간에 필요한 관심사들을 거쳐서 Target을 호출하도록 자동 혹은 수동으로 작성된다.
  • 외부에서의 호출은 Proxy객체를 통해서 Target 객체의 JoinPoint를 호출하는 방식이다. 

 

3. JoinPoint

  • Target이 가진 여러 메서드
  • Advice가 Target에 적용될 수 있는 위치, 시점

 

4. PointCut

  • 부가 기능이 적용될 대상(method)을 선정하는 방법
  • 관심사와 비즈니스 로직이 결합되는 지점을 결정하는 방법
  • Advice를 적용할 JoinPoint를 선별하는 기능을 정의한 모듈

 

5. Aspect

  • 관심사 자체를 의미하는 추상명사
  • 부가 기능 모듈
  • 부가될 기능을 정의한 Advice와, Advice를 어디에 적용할지를 결정하는 PointCut을 함께 갖고있음

 

6. Advice

  • Aspect를 구현한 코드
  • 실제적으로 부가기능을 담은 구현체
  • Target에 종속되지 않기 때문에 부가기능에만 집중할 수 있음

 

 

 

[Advice의 동작위치]


Advice는 실제 걱정거리를 분리해 놓은 코드를 의미한다. Advice는 그 동작 위치에 따라 다음과 같이 구분된다.

 

  • Before Advice - Target의 JoinPoint를 호출하기 전에 실행되는 코드로, 코드의 실행 자체에는 관여할 수 없음
  • After Returning Advice - 모든 실행이 정상적으로 이루어진 후에 동작하는 코드
  • After Throwing Advice - 예외가 발생한 뒤에 동작하는 코드
  • After Advice - 정상적으로 실행되거나 예외가 발생했을 때 구분 없이 실행되는 코드
  • Around Advice - 메서드의 실행 자체를 제어할 수 있는 가장 강력한 코드로, 직접 대상 메서드를 호출하고 결과나 예외를 처리 할 수 있음

 

Advice는 과거의 스프링에서는 별도의 인터페이스로 구현되고, 이를 클래스로 구현하는 방식으로 제작했으나 스프링 3 버전 이후에는 어노테이션만으로도 모든 설정이 가능하다.

Target에 어떤 Advice를 적용할 것인지는 1). XML 설정을 이용하는 방식을 사용하거나, 2). 어노테이션을 이용하는 방식을 사용할 수 있다. 

 

 

 

[Pointcut의 형태]


Pointcut은 어떤 JoinPoint에 결합할 것인지를 결정하는 설정이다.

AOP에서 Target은 결과적으로 Pointcut에 의해서 자신에게 없는 기능들을 가지게 된다.

Pointcut은 다양한 형태로 선언해서 사용할 수 있는데 주로 사용되는 설정은 다음과 같다.

 

  • execution(@execution) - 메서드를 기준으로 Pointcut을 설정한다.
  • within(@within) - 특정한 타입(클래스)을 기준으로 Pointcut을 설정한다.
  • this - 주어진 인터페이스를 구현한 객체를 대상으로 Pointcut을 설정한다.
  • args(@args) - 특정한 파라미터를 가지는 대상들만을 Pointcut으로 설정한다.
  • @annotation - 특정한 어노테이션이 적용된 대상들만을 Pointcut으로 설정한다.

 

 

 

[출처]

코드로 배우는 스프링 웹 프로젝트

https://dudwns3625.tistory.com/15

https://engkimbs.tistory.com/746

ss-o.tistory.com/137