본문 바로가기

Spring

Spring - 관점 지향 프로그래밍(AOP)

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

 

AOP란?

스프링 공부를 하면서 나오는 생소한 개념 중 하나는 AOP이다.

 

AOP는 Aspect Of Programming이라는 개념으로 번역하면 관점 지향 프로그래밍이다.

사실 잘 와닿지 않은데, 개발자들 사이에서는 관심사(concern)'라는 말로 통용된다고 한다.

 

관심사라는 것은 핵심로직은 아니지만 코드를 작성하면서 고려해야하는 상황이다.

예를 들면, 올바른 파라미터가 들어왔는지, 사용자는 적절한 권한을 가졌는지, 예외처리는 어떻게 할 것인지 등의 관심사에 대한 것이다.

 

AOP는 이러한 관심사를 분리하고, 핵심 로직에 집중할 수 있도록 돕는다.

 

 

AOP관련 용어들

타겟 : 순수한 비즈니스 로직

Advice : 관심사(concern) 구현 코드

JoinPoint : 핵심 로직 메서드 (타겟 객체가 가진 메서드) Advice를 JoinPoint에 붙인다!

PointCut : 타겟의 어떤 로직(메서드)에 붙일지에 대한 경로.

Proxy : 타겟을 전체적으로 감싸며, 이를 호출하는 과정에 관심사를 거치도록 한다. -> 보통 자동으로 생성됨.

 

AOP는 따로 코딩된 특정 관심사(Advice)를 PointCut이 가리키는 JoinPoint메서드에 붙이는 것이다.

Advice의 구분

  • Before :  핵심 로직 수행 전에 실행되는 관심사
  • After Returning : 모든 실행이 정상적으로 이루어진 뒤 실행되는 관심사
  • After Throwing : 예외 발생 뒤 동작하는 관심사
  • After Advice : 예외, 정상처리 상관없이 실행되는 관심사
  • Around Advice : 핵심 로직 전체를 제어할 수 있는 관심사

PointCut의 구분

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

간단한 예시

1. 핵심로직인 Service의 특정 메서드(JoinPoint)를 생성한다.

2. AOP객체에 Advice를 생성한다.

(3. 각종 설정 필요!)

 

1. 핵심로직인 Service의 특정 메서드를 생성한다.

@Service
public class SampleService implement ISampleService{

   @Override
   public int doAdd(int a, int b) throws Exception {
      return a+b;
   }
   
}

 

2. AOP객체에 Advice를 생성한다.

@Aspect
@Component
public class SampleAop{

   @Before("execution(* com.mypjt.service.SampleService*.*(..))")
   public void logBefore(){
      log.info("~~~~~~");
   } 
}

 

SampleService의 doAddJoinPoint이다.

SampleAop의 logBefore메서드가 Advice이다.

 

Before어노테이션으로 doAdd 메서드 실행 이전에 수행된다는 것을 명시했다.

PointCut"execution(* com.mypjt.service.SampleService*.*(..))"이다. 이는 AspectJ의 표현식을 찾아보자.

 

 

@Around와 ProceedingJoinPoint

(----찾아보자----)