[20210531] Spring AOP

핵심 기능과 공통 기능을 분리하는 AOP에 대해 공부한다.

실행 시간을 출력한다거나, DB와의 커넥션을 생성하거나 종료하는 것처럼 주요 기능이 아니지만 주요 기능과 함께 코드로 작성되어 있다면 가독성도 떨어지고 또한 해당 코드가 여러 군데 복붙되어 있다면, 예로 실행 시간을 ms가 아닌 ns로 출력하고 싶다면, 중복되는 코드를 모두 수정해야만 한다.

이러한 문제점을 proxy패턴으로 해결할 수 있다. proxy를 이용하면 기존 코드(주요 함수의 로직)를 수정하지 않고도 공통 기능을 수정할 수 있다. 이게 가능한 이유는 주요 로직을 대상 객체(proxy가 아닌 객체)에 위임시키기 때문이다. 그러면 주요 로직을 제외한 부가적인 기능은 proxy 객체에서 실행하면 된다.

이렇게 공통 기능 구현과 핵심 기능 구현을 분리하는 것이 AOP의 핵심이다.

AOP(Aspect Oriented Programming)

여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법 AOP는 핵심 기능과 공통 기능의 구현을 분리함으로써 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용할 수 있게 만들어 준다. 스프링도 프록시를 이용해서 AOP를 구현하고 있다.

핵심 기능에 공통 기능을 삽입하는 방법(3가지)

  • 컴파일 시점에 코드에 공통 기능을 삽입하는 방법
  • 클래스 로딩 시점에 바이트 코드에 공통 기능을 삽입하는 방법
  • 런타임에 프록시 객체를 생성해서 공통 기능을 삽입하는 방법

1, 2번 방식은 스프링 AOP에서는 지원하지 않지만 AspectJ와 같이 AOP 전용 도구를 사용해서 적용할 수 있다. 3번 방식은 스프링이 제공하는 방식이다. 스프링 AOP는 프록시 객체를 자동으로 만들어 주기 때문에 우리는 공통 기능을 구현한 클래스만 알맞게 구현하면 된다.

AOP 주요 용어

  • Advice : 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의
  • Joinpoint : Advice를 적용 가능한 지점을 의미. 메서드 호출, 필드 값 변경 등이 이에 해당. 하지만 스프링를 이용해서 구현하기 때문에 메서드 호출에 대한 Joinpoint만 지원.
  • Pointcut : Joinpoint의 부분 집합으로서 실제 Advice가 적용되는 Joinpoint를 나타냄. 스프링에서는 정규 표현식으로 정의
  • Weaving : Advice를 핵심 로직 코드에 적용하는 것을 weaving이라함
  • Aspect : 여러 객체에 공통으로 적용되는 기능. 트랜잭션이나 보안 등이 Aspect의 좋은 예

Advice의 종류(스프링에서 구현 가능한)

  • Before Advice : 대상 객체의 메서드 호출 전
  • After Returning Advice : 대상 객체의 메서드가 익셉션 없이 실행된 이후
  • After Throwing Advice : 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우
  • After Advice : 익셉션 발생 여부에 상관없이 대상 객체의 메서드 실행 후
  • Around Advice : 대상 객체의 메서드 실행 전, 후

스프링 AOP 구현

  • Aspect로 사용할 클래스에 @Aspect 어노테이션을 붙인다.(bean으로 등록해야함)
  • @Pointcut 어노테이션으로 공통 기능을 적용할 Pointcut을 정의한다.
  • 공통 기능을 구현한 메서드에 @Around 어노테이션(Advice)을 적용한다.

출처

최범균 저 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문 참고