AOP (Aspect Oriented Programming)
여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법
-> 핵심 기능과 공통 기능의 구현을 분리하여, 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용하는 것
핵심 기능에 공통 기능(Aspect)을 삽입하는 방법에는 아래 세 가지가 있는데,
1) 컴파일 시점에 코드에 공통 기능을 삽입하는 방법
2) 클래스 로딩 시점에 바이트 코드에 공통 기능을 삽입하는 방법
3) 런타임에 프록시 객체를 생성해서 공통 기능을 생성하는 방법
Spring은 이 중 프록시를 이용한 세 번째 방법을 지원한다. (두 번째 방법은 일부 지원)
AOP 주요 용어
. Advice: 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의
. Joinpoint: Advice를 적용 가능한 지점을 의미(예를 들어 메서드 호출, 필드 값 변경 등)
스프링은 프록시를 이용해서 AOP를 구현하기 때문에 메서드 호출에 대한 Joinpoint만 지원
. Pointcut: Joinpoint의 부분 집합으로서 실제 Advice가 적용되는 Joinpoint
스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Pointcut을 정의할 수 있음
. Weaving: Advice를 핵심 로직 코드에 적용하는 것
. Aspect: 여러 객체에 공통으로 적용되는 기능(예를 들어 트랜잭션이나 보안 등)
스프링에서 구현 가능한 Advice 종류
. Before Advice: 대상 객체의 메서드 호출 전 공통 기능을 실행
. After Returning Advice: 대상 객체의 메서드가 익셉션 없이 실행된 이후 공통 기능을 실행
. After Throwing Advice: 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우 공통 기능을 실행
. After Advice: 익셉션 발생 여부에 상관없이 대상 객체의 메서드 실행 후 공통 기능을 실행
. Around Advice: 대상 객체의 메서드 실행 전, 후 또는 익셉션 발생 시점에 공통 기능을 실행
예시
** 간단한 회원가입 API의 E-mail 형식 검증을 AOP로 구현
- Service Layer의 joinUser 메소드에만 AOP가 적용되도록 설정
package org.hsl.sample_api.aspect;
@Aspect
public class ValidationAspect {
@Pointcut("execution(* org.hsl.sample_api.service.UserService.joinUser(..))")
private void joinUserTarget() {}
@Around("joinUserTarget()")
public Object checkEmail(ProceedingJoinPoint joinPoint) throws Throwable {
String email = (String) joinPoint.getArgs()[0];
if( ValidationUtils.isNotValidEmail(email) ) {
throw new IllegalArgumentException("유효하지 않은 이메일 형식입니다");
}
Object result = joinPoint.proceed();
return result;
}
}
- Bean 등록
package org.hsl.sample_api.config;
@Configuration
@EnableAspectJAutoProxy
public class AppCtx {
@Bean
public ValidationAspect ValidationAspect() {
return new ValidationAspect();
}
}
'~2022 > Spring' 카테고리의 다른 글
[Spring] 필터(Filter), 인터셉터(Interceptor), AOP 비교 정리 (0) | 2021.09.14 |
---|---|
[Spring] Dependency Injection 종류와 장단점 (0) | 2021.09.14 |