Spring boot AOP

이민우·2023년 8월 1일
0

오늘은 Spring boot 의 AOP를 알아보겠다.

Spring AOP
Spring AOP란 Spring 빈(bean) 클레스에만 적용 가능한 기능으로 Spring boot 에서 구현한
핵심기능 즉 API의 실행 전후에 동작 가능한 기능이다.

쉽게말해 API가 동작하기 전 이나 동작한 후에 또한 동작전 동작후 모두에 추가 기능을 동작 시킬 수 있다.

AOP는 클레스에 @Aspect 어노테이션을 이용해 사용할 수 있다.

@Component
@Aspect
public class Aspect {}

위와같이 사용할 수 있고 앞서 설명한 것과 같이 빈(bean) 클레스에만 적용 가능하므로 @Component 어노테이션을 사용해 빈으로 등록해 준다.

이러한 Spring AOP 사용하기전에 알아야할 점들이 몇가지 더있다.

우선 AOP가 언제 기능을 동작할 지 인 어드바이스와 어떠한 API에 적용 할지의 포인트 컷이다.

어드바이스의 종류는 다음과 같다.

@Around
핵심기능(API) 수행 전과 후 동작하도록 하는 어노테이션이다.

@Befor
핵심기능(API) 호출 정 동작하도록 하는 어노테이션이다.

@After
핵심기능(API) 수행 성공/실패 여부와 상관없이 언제나 동작 하는 어노테이션이다.

@AfterReturning
핵심기능(API) 호풀 성공시 동작하는 어노테이션이다.

@AfterThrowing
핵심기능(API) 호출 실패 시 즉 예외 가 발생한 경우만 동작하는 어노테이션이다.

포인트 컷은 앞서 설명한것과 같이 어떠한 API에 적용할지 인데 설정 방법은 다음과 같다.

@Around("execution(public com.sparta.myselectshop.controller..(..))")

위의 예시는 수행전과 후 동작하는 AOP를 설정한 것으로 적용대상이 되는 API의 종류는 execution 다음으로 이어지는 ()안의 내용을 통해 알 수 있다.

우선 첫번째 public 으로 구현된 API로 두번째 부분은 반환타입을 적는 곳으로 현 API는 모든 반환타입을 가진것이다.
세번째로 패키지명으로 현 API는 com.sparta.myselectshop.controller..
로 해당 패키지에 해당하는 모든 controller를 말한다.
마지막으로 (..)는 API의 인수를 뜻하는데 인수가 0~N개인 타입이 상관없는 API를 뜻한다.

이렇게 위의 모든 조건을 총족하느 API 전후에 동작하는 AOP를 구현 할 수 있다.

마지막으로 포인트 컷을 재사용하는 방법을 적어보겠다.
개인저으로 이해한 부분으로는 포인트컷을 함수로 정의해 그에 해당하는 Controller들을 지정한다고 이해했다.
예시 코드를 확인해 보자.

@Component
@Aspect
public class Aspect {
@Pointcut("execution( com.sparta.myselectshop.controller..*(..))")
private void forAllController() {}

우선 위와같이 @Around 어노테이션을 바로 달지 않고 포인트컷이라는 것을 나타내는 @Pointcut 어노테이션을 적용해 앞서 설명한 API를 지정해 준다.
중요한것은 그다음으로 private void forAllController() {} 와 같이 지정한 API를 지정하는 함수를 만들어준다는 것이다.
쉽게말해 @Pointcut("execution( com.sparta.myselectshop.controller..(..))") 를 지정하는 forAllController() 함수를 만든 것이다.
forAllController() 함수를 사용하면 "execution(
com.sparta.myselectshop.controller..(..))" 이란 API를 뜻하는 것이다.

바로 다음 예제를 살펴보자.

@Around("!forAllContorller()")
public void saveRestApiLog() {
	...
}

위의 예제를 살펴보면 @Around 다음으로 앞서 선언한 함수를 인자로 준것을 볼 수 있다.
포인트것을 설명할 때와 같은 모습으로
@Around("execution(public com.sparta.myselectshop.controller..(..))")
과 같다.

설명하자면 함수로 지정한 API들이 아닌 API들이 동작하는 전 후에 동작하는 AOP인 것이다.
이유는 함수앞에 ! 가 붙어있기 때문이다.

profile
개린이

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

유익한 글이었습니다.

답글 달기

관련 채용 정보