코코무의 코딩캔버스

[Spring] AOP에 대하여 본문

Spring

[Spring] AOP에 대하여

코코무 2024. 3. 7. 09:54

※ 본 글은 교재 [코드로 배우는 스프링 웹 프로젝트 - 구멍가게 코딩단]을 바탕으로 작성되었습니다.


 

AOP는 관점 지향 프로그래밍이라고 번역할 수 있습니다. 

이 때 '관점'은 '관심사(concern)'로 생각하면 의미를 이해하기 좀 더 쉽습니다.

 

관심사는 개발자가 코드를 작성하면서 어떤 것에 염두를 두는 것인데,

1. 파라미터가 올바르게 들어왔는지

2. 이 작업을 하는 사용자가 적절한 권한을 가진 사용자인지

3. 이 작업에서 발생할 수 있는 모든 예외는 어떻게 처리해야 하는지

위의 고민들을 하면서 코드에 반영하는 것입니다.

 

AOP는 이런 관심사들을 분리합니다. 관심사가 핵심이 되는 비즈니스 로직은 아니기 때문입니다.

그래서 관심사를 사전 조건이나 사후 조건이라고 간주하면 됩니다.

 

개발자가 작성한 코드와 분리된 관심사를 구현한 코드는 컴파일 혹은 실행 시점에서 결합됩니다.

우선 핵심 비즈니스 로직에만 근거해서 코드를 작성하고, 나머지는 어떤 관심사들과 결합할 지 설정하게 됩니다.

 


 

AOP 용어

 

AOP는 기존의 코드를 수정하지 않고 원하는 관심사들을 결합할 수 있습니다.

Proxy

- Target을 전체적으로 감싸고 있는 존재

- 내부적으로 Target을 호출하지만 중간에 필요한 관심사들을 거쳐 Target을 호출하도록 자동 혹은 수동으로 작성됨

- 대부분 스프링 AOP 기능을 이용해서 자동으로 생성되는 방식을 이용함

 

Target

- 순수한 비즈니스 로직으로 어떠한 관심사들과도 관계를 맺고 잊지 않음

 

JoinPoint

- Target 객체가 가진 여러 메서드(스프링 AOP에서는 메서드만이 JoinPoint)

 

Pointcut

- Target의 여러 메서드 중 어떤 메서드(JoinPoint)에 관심사를 결합할 것인지 결정하는 것

- 관심사와 비즈니스 로직이 결합되는 지점을 결정하는 것

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

- Proxy는 이 결합이 완성된 상태이기 때문에 메서드를 호출하면 자동으로 관심사가 결합된 상태로 동작하게 됨

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

 

 

 

관심사는 Aspect와 Advice라는 용어로 표현됩니다.

 

Aspect

- 관심사 자체를 의미하는 추상명사

 

Advice

- 실제 걱정거리를 분리해 놓은, Aspect를 구현한 코드

- 동작 위치에 따라 종류가 구분됨

- 과거에는 별도의 인터페이스로 구현된 것을 클래스로 구현하는 방식을 사용하였지만 스프링 3버전 이후에는 어노테이션만으로 해결

- Target에 어떤 어노테이션을 적용할지는 xml을 이용해 설정하거나 어노테이션을 이용해 설정

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

 


이번 포스팅에서는 AOP에 관해 알아보았습니다.

총총🐰