Spring AOP
AOP
Aspect Oriented Programming의 약자로 관점 지향 프로그램을 의미한다.
어플리케이션에서 코드가 중복되고, 강력하게 결합되어 있어 다른 로직과 분리할 수 없는 로직인 ‘횡단 관심사’와 핵심 비즈니스 로직을 분리하는 것을 목적으로 둔다.
예시로 메서드의 실행 시간을 구하는 기능, 트랜잭션 등이있다.
장점
전체 코드 기반에 흩어져 있는 관ㅅ미 사항이 하나의 장소로 응집한다.
자신의 주요 관심사에 대한 코드만 포함하고 있어 코드가 깔끔해진다.
객체지향적으로 코드를 짤 수 있게 도와 유지보수가 용이해지게 된다.
사용되는 용어
Target: 부가기능을 부여할 대상
Advice: 타깃에게 제공할 부가기능 + 무슨기능인지, 어느시점에 주입할 것인지를 포함하는 개념
JoinPoint: 어드바이스가 적용될 수 있는 위치
Pointcut: 어드바이스를 적용할 조인 포인트를 선별하는 작업 (어떠한 메서드에 적용할 것인지)
Advisor: 포인트컷과 어드바이스를 하나씩 갖고 있는 오브젝트
어떤시점에 어느 기능을 어떤 메소드에 적용할 지에 대한 정보를 가지고 있다.
Weaving: 조인 포인트에 어드바이스를 적용하는 방법
동작 과정
스프링 컨테이너에 빈 객체를 등록하기 전 스프링에서 BeanPostProcessor(빈 후처리기)가 동작하여 객체에 특정 조작을 한다.
(1) 빈 객체를 생성한 뒤 빈 후처리기에 전달
(2) 빈 후처리기는 어드바이저를 모두 확인하여 어드바이저 내의 포인트컷을 이용해 전 달받은 빈이 프록시 적용 대상인지 확인, 어떤 메서드에 적용될 수 있는지 선별
(3) 프록시 생성기에 전달하여 프록시객체를 생성
(4) 프록시 생성한 빈이라면 프록시 객체를, 대상이 아니라면 그냥 빈을 반환
(5) 컨테이너에 빈을 등록
구현
구현 방식은 다양하나 가장 많이 사용되는 방식은 @AspectJ 어노테이션이다.
@Aspect @Component public class LoggingAspect { @Before("execution(* com.adjh.multiflexapi.controller.*.*(..))") public void logBefore(JoinPoint joinPoint) { log.info("Before: " + joinPoint.getSignature().getName()); } }
Configuration
에서@EnableAspectJAutoProxy
를 추가해야 동작함.AspectJ 포인트컷 표현식 예시) execution(int minus(int, int)) -> 반환 타입은 int, 두개의 int 파라미터를 전달받는 minus라는 이름의 메서드 execution(* minus(int, int)) -> 반환 타입은 상관없고 두개의 int 파라미터를 전달받는 minus라는 이름의 메서드 execution(* minus(..)) -> 반환 타입, 파라미터 타입과는 상관없고 minus라는 이름의 메서드 메서드 이름에도 *사용 가능.
AspectJ 어드바이스 - 어느 시점에 적용할 것인가
After: 메서드가 반환되거나 예외 상황이 발생한 이후에 호출
AfterReturning: 메서드가 반환된 이후에 호출
AfterThrowing: 메서드가 예외 상황을 발생시킨 이후에 호출
Before: 메서드가 호출되기 이전에 호출
Around: 메서드의 호출 전과 반환되거나 예외 상황 이후에 호출 (메서드의 앞과 뒤)
Subscribe to my newsletter
Read articles from KwonMInwoo directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by