java, spring

[Spring]AOP, Aspect-Oriented Programming/관점 지향 프로그래밍 개념 이해하기

isaac.kim 2021. 8. 20.
728x90
반응형

[Spring]AOP, Aspect-Oriented Programming/관점 지향 프로그래밍 개념 이해하기

 

AOP, Aspect-Oriendted Programming 

AOP는 관점 지향 프로그래밍 이라는 의미로 변역됩니다. 관점은 개발자들에게 '관심사(concern)'로 불리기도 합니다.


AOP 관점 지향 프로그래밍은 특정 비즈니스 로직에 걸림돌이 되는 공통 로직을 제거할 수 있는 방밥을 제공합니다.
AOP를 적용하면 기존의 코드에 첨삭 없이, 메서드의 호출 이전 혹은 이후에 필요한 로직을 수행하는 방법을 제공합니다.

AOP가 추구하는 것은 '관심사의 분리(separate concerns)'입니다. AOP는 염두에 두어야 하는 서브로직은 별도의 '관심사'로 분리하고, 핵심 비즈니스 로직만 작성할 것을 권장합니다.

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


AOP 용어

AOP는 기존의 코드를 수정하지 않고, 원하는 기능들과 결합할 수 있는 패러다임입니다. AOP를 구현하기 위해 다음과 같은 핵심적인 그림을 이해할 필요가 있습니다.

위 그림에서 Target에 해당하는 것이 바로 개발자가 작성한 핵심 비즈니스 로직을 가지는 객체입니다.

 

Target은 순수한 비즈니스 로직을 의미하고, 어떠한 관심사들과도 관계를 맺지 않습니다. 순수한 코어(core)라고 볼 수 있습니다. Target을 전체적으로 감싸고 있는 존재를 Proxy라고 합니다. Proxy는 내부적으로 Target을 호출하지만, 중간에 필요한 관심사들을 거쳐서 Target을 호출하도록 자동 혹은 수동으로 작성됩니다. Proxy의 존재는 코드를 통해 구현하는 경우도 있지만, 대부분의 경우 스프링 AOP 기능을 이용해서 자동으로 생성되는(auto-proxy) 방식을 이용합니다. JoinPointTarget 객체가 가진 메서드입니다. 외부에서의 호출은 Proxy 객체를 통해서 Target 객체의 JoinPoint를 호출하는 방식이라고 이해할 수 있습니다.

 

좀 더 상세하게 표현하면,

JoinPoint는 Target이 가진 여러 메서드라고 보면됩니다(엄밀하게 스프링 AOP에서는 메서드만이 JoinPoint가 됩니다.). Target에는 여러 메서드가 존재하기 때문에 어떤 메서드에 관심사를 결합할 것인지 결정해야 하는데 이 결정을 'Pointcut' 이라고 합니다.

 

Pointcut은 관심사와 비즈니스 로직이 결합되는 지점을 결정하는 것입니다. 앞의 Proxy는 이 결합이 완성된 상태이므로 메서드를 호출하게 되면 자동으로 관심사가 결합된 상태로 동작하게 됩니다. 관심사(concern)는 위 그림에서 Aspect와 Advice라는 용어로 표현되어 있습니다. Aspect는 조금 추상적인 개념을 의미합니다. Aspect는 관심사 자체를 의미하는 추상명사라고 볼 수 있고, Advice는 Aspect를 구현한 코드입니다.

 

Advice는 동작 위치에 따라 다음과 같이 구분됩니다.

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

Advice는 과거의 스프링에서는 별도의 인터페이스로 구현되고, 이를 클래스로 구현하는 방식으로 제작했으나 스프링 3버전 이후에는 어노테이션만으로도 모든 설정이 가능합니다. Target에 어떤 Advice를 적용할 것인지는 XML을 이용한 설정을 이용할 수 있고, 어노테이션을 이용하는 방식을 이용할 수 있습니다.

 

Pointcut은 Advice를 어떤 JoinPoint에 결합할 것인지를 결정하는 설정입니다. AOP에서 Target은 결과적으로 Pointcut에 의해서 자신에게는 없는 기능들을 갖게 됩니다. Pointcut은 다양한 형태로 선언해 사용할 수 있는데 주로 사용되는 설정은 다음과 같습니다.

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

 

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

728x90
반응형