Spring AOP (2)

앞선 포스팅에선 간단하게 AOP의 필요성과 간단한 예제 코드를 통해 풀어보는 방법을 적어보았다.

여기서는 AOP의 개념적인 의미에 대해서 정리해보고 AOP 세상에서 사용되는 용어들에 대한 정리 해보았다.

AOP(Aspect Oriented Programming) 란?

AOP의 등장배경

AOP의 등장배경을 알기 위해 프로그래밍의 패러다임을 살펴보면, 오랜 옛날에는 절차적 프로그래밍(procedural programming)이 있었다. 이는 기계에 필요한 기능, 로직을 설계하던 프로그래밍 방식이었고, 쉽게 위에서 아래로 실행 되는 구조를 가지고 있었다. 이전에는 규모가 작았기 때문에 프로그램을 효율적으로 작성하는 방식에 대해서는 대두되지 않았다. 하지만 고 수준의 Enterprise System을 개발하는데에는 무리가 있고, 유지보수의 어려움, 스파게티 코드를 양산하는 프로그래밍 방식이었다.

수 년에 걸쳐 프로그래밍의 패러다임은 객체 지향 프로그래밍 (Object Oriented Programming) 방식을 도입 하였다. 객체지향 프로그래밍 방식은 목표한 기능을 수행하기 위해 기능적, 개념적 단위를 설계하고 이를 class라는 추상화 된 명세를 통해 독립된 기능을 수행하는 프로그래밍 방식이다. 또한 객체들이 유기적으로 협력하여 로직을 수행할 수 있고 유지보수, 확장성이 용이한 프로그래밍 방식이다.

하지만 객체지향 프로그래밍 방식에도 헛점은 있었다.
실제 핵심 로직을 수행하는 Method에서 아무리 설계를 잘하더라도 분리된 모듈로 작성하기 힘든 부분이 발생한다. 횡단 관심사 (CrossCutting Concerns)이라 한다. 횡단 관심사의 예시로는 로깅, 인증, 트랜잭션과 같은 공통적이고 중복되는 내용들이 있다. 이는 중복코드를 발생 시키고 Method의 핵심 로직을 파악하기 어렵게 하고, 코드 가독성을 떨어뜨리며, 유지보수의 난이도를 높이는 요소들이다. 이를 해결 하기 위해 AOP(Aspect Oriented Programming) 이라는 개념이 탄생하였다.

AOP의 개념

실제 핵심 로직(Core Concern)을 수행하면서 발생하는 횡단 관심사 (CrossCutting Concerns) 를 한데 모아 처리하는 것을 AOP라 한다. AOP를 사용하기 위해 Aspect Class를 별도로 지정하여 실행 Method의 조인포인트(Join Point)를 기반으로 포인트 컷(Point Cut)을 설정하여 실제 모듈의 핵심 로직에 관여하지 않고도 횡단 로직을 처리 할 수 있도록 해준다.

횡단관심사와 핵심로직

AOP는 이러한 횡단 관심사 로직을 Method가 실행되는 조인포인트에 코드를 적용 시켜, 실제 메소드에 코드가 있는 것 처럼 실행 하도록 해준다. 이러한 개념을 위빙(Weaving)이라고 한다.

AOP에서는 이러한 기능을 Aspect라는 이름으로 부르고 있다.
Aspect를 정의 하자면,
실제 모듈에 대한 핵심기능을 담고 있지는 않지만 모듈이나 Method를 구성하는 한가지 요소이고, 핵심기능에 부가되어 의미를 갖는 모듈을 가르킨다.

이러한 설명을 보게 되면은 AOP는 OOP를 대체 할 수 있는 획기적인 방법론이라고 생각할 수 있다.
AOP는 OOP를 대체 하는 것이 아닌 OOP의 가치를 더 올려 줄 수 있는 보조적이고 상호 보완적인 관계라고 생각 해야 한다.

AOP 에서 사용되는 용어들

Join Point

말그대로 Join + Point이다. 횡단관심사(Cross Cutting Concern) 로 분리 된 로직이 끼어들 수 있는 (조인할 수 있는) 위치 또는 시점을 일컫는 말이다.

Advice

횡단관심사(Cross Cutting Concern) 으로 분리 된 로직에 대한 코드
Aspect로 분리 되어 실행 시, 위빙되어 구체적인 처리를 하는 로직을 일컫는 단어

Point Cut

말그대로 (Join) Point + cut이다. Join Point는 모든 메소드에 있는 위치 또는 시점을 일컫는 말이지만,
Point cut은 공통으로 적용할 Join Point를 표현식 같은 기능을 사용하여 하나로 묶어내는 역할을 한다. 실제 Advice코드가 적용 될 지점을 의미 하는 단어

Weaving

Advice 코드를 핵심 로직의 Point cut에 적용하는 것을 의미하는 단어이다.
즉, Advice로 분리한 코드를 핵심 로직에 다시 합치는 일이다.
방법에 따라

  • 런타임 시, Proxy로 생성하며 코드를 합치는 방법
  • 컴파일 시, 클래스 로드 시, 바이트 코드를 조작하여 실제 코드를 끼워 넣는 방법
    이 있다.

Aspect

여러 객체에 공통으로 적용되는 관심 사항을 Aspect라고 한다.
보안, 트랜잭션, 로깅등이 대표적인 예이다.
Aspect는 AOP의 핵심 단위 이며 Advice + Point cut = Aspect 이다.

Target

핵심 로직을 구현하는 클래스 또는 객체
AOP를 적용하여 Advice를 받을 대상을 의미하는 단어이다.

Advisor

Advice 코드와 Pointcut을 합쳐놓은 것을 Advisor라고 부른다.
공통 관심사 코드를 뽑아서 하나의 클래스에 담은 것이다.


참고

https://jongmin92.github.io/2018/02/17/Spring/spring-aop/#aop%EC%9D%98-%EB%93%B1%EC%9E%A5-%EB%B0%B0%EA%B2%BD

http://blog.naver.com/PostView.nhn?blogId=tmondev&logNo=220556587811

http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000039147106