spring AOP 요약정리(용어정리)

참고

Spirng AOP를 이용하여 Service클래스에 로그 찍기

들어가기

개인적으로 Spring의 AOP는 말, 단어가 어렵고 햇갈리는 것 같다. 요약정리를 통해, AOP(Aspect Oriented Programming)를 후려쳐보겠다. 이 글을 예제를 포함하지 않고 대략적인 AOP의 정의 정도만 설명하고 있다.

만약 예제를 보고 싶다면 위 참고링크를 보길...

AOP(Aspect Oriented Programming)란?

Aspect Oriented Programming는 한국말로 관점지향프로그래밍 이다. 어우야 한국말은 더 어렵다.

아주 간단하게 후려치면 AOP는 프로그램의 전체 로직을 크게 비지니스 로직과 공통로직(Aspect라고 부른다.)을 분리하는 프로그래밍 기법이다.

AOP의 가장 큰 기능은 로직(소스코드의 연관성)의 분리이다.

위 그림처럼 공통로직(로깅, 트랜젝션 등)을 비지니스 로직 내부에서 호출하는 것이 아니라, AOP라는 대리자가 대신 호출해주는 구조이다. 여기서 프록시 패턴이 이용된다.(스프링에 AOP설정을 할때, 프록시 오브젝트를 생성해야 한다.)

스프링의 지향점은 비 침투적인 프로그래밍이다. 로깅, 트랜젝션같은 로직(소스코드)은 프로그램 전체에서 사용할 공통 로직이다. 예를 들어 100개의 서비스 클래스에 전달되는 파라미터를 찍는 로깅 이런 공통 로직이 만약 비지니스 로직에 침투적으로 사용되어 의존성이 발생하는 것을 피할수 있는 프로그래밍이 AOP이다.

즉 비지니스 로직 소스코드에 트랜잭션, 로깅과 같은 기능의 소스코드가 없이 트랜잭션과 로깅을 사용 할 수 있다는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
//비지니스 로직을 담당하는 클래스가 아래처럼 있었다면.
class BizObj{

...
public runSomething(){

//이렇게 로그를 찍는 공통로직이 비지니스 로직에 침투적으로 있던 것을
BizLogUtil bizLog = new BizLogUtil();
bizLog.log();
...
}

}

AOP를 이용하면 아래처럼 만들 수 있다.

1
2
3
4
5
6
7
8
9
10

class BizObj{

...
public runSomething(){
//이렇게 순수한 비지니스 로직으로 만들수 있다.
...
}

}

위 비지니스 로직 클래스에서는 로깅에 관한 어떠한 소스코드도 없지만 AOP를 사용여 runSomething 함수가 동작할때, BizLogUtil를 호출 할 수 있다.


AOP 용어 정리

Aspect: 공통 관심사에 대한 추상적인 명칭. 예를 들어 로깅이나 보안, 트랜잭션과 같은 기능 등을 가리킨다.

Advice: 실제로 기능을 구현한 객체, 공통로직을 담고 있는 클래스가 된다.

Join points: 공통 관심사를 적용할 수 있는 대상. Spring AOP에서는 각 객체의 메소드가 이에 해당

Pointcuts: 여러 메소드 중 실제 Advice가 적용될 대상 메소드

target: 대상 메소드를 가지는 객체

Proxy: Advice가 적용되었을 때 만들어지는 객체

Introduction: target에는 없는 새로운 메소드나 인스턴스 변수를 추가하는 기능

Weaving: Advice와 target이 결함되어서 프록시 객체를 만드는 과정