Spring AOP란?
AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.
쉽게 말해 관점을 기준으로 각각 모듈화를 하고자 함을 말한다.
예를 들어 로그나 트랜잭션, 보안 관련 모듈을 AOP를 이용하여 동작하게 할 수 있다.
개념이야 검색하면 많이 나오니 실질적으로 어떤 것들이 있고 어떻게 쓰는 것인지 알아보겠다.
AOP 사용법
우선 AspectJ 라이브러리를 추가해야한다.
Spring Boot를 쓴다면 Spring Boot Starter AOP를 추가해도 된다.
implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.22'
implementation group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.22'
# spring boot starter
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-aop', version: '3.3.0'
추가하였다면 메인이나 Configuration클래스에 @EnableAspectJAutoProxy를 추가한다.
해당 어노테이션은 @Aspect가 적용된 클래스를 스캔하고 필요한 프록시를 자동으로 생성하여 AOP가 동작하게끔 설정한다.
간단하게 예시 Aspect 클래스를 만들어보았다.
@Aspect
@Component
public class ExampleAspect {
@Pointcut("execution(* com.example.service.ExampleService.*(..))")
public void examplePointCut() {
}
@Before(value = "examplePointCut()")
public void aopBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
@After(value = "examplePointCut()")
public void aopAfter(JoinPoint joinPoint) {
System.out.println("After method: " + joinPoint.getSignature().getName());
}
@Around(value = "examplePointCut()")
public Object aopAround(ProceedingJoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
Object result;
try {
result = joinPoint.proceed(); // 메서드 진행, result는 메서드 진행 후 반환 값
System.out.println("After method: " + joinPoint.getSignature().getName());
} catch (Throwable e) {
System.out.println("Exception in method: " + joinPoint.getSignature().getName() + " with message: " + e.getMessage());
throw e;
}
return result;
}
@AfterReturning(pointcut = "examplePointCut()", returning = "result")
public void aopAfterReturning(Object result) {
System.out.println("Method returned value: " + result);
}
@AfterThrowing(pointcut = "examplePointCut()", throwing = "error")
public void aopAfterThrowing(Throwable error) {
System.out.println("Exception thrown: " + error.getMessage());
}
}
위 예시를 기준으로 각각의 기능을 적어 보면
@PointCut - ExampleService의 모든 메서드를 포인트 컷으로 하였다. PointCut을 기준으로 동작하도록 하거나 PointCut을 제외하고 동작하도록 할 수 있다. 필터링이라 보면 된다.
포인트 컷은 특정 메서드도 가능하지만 어노테이션을 직접 생성하여 해당 어노테이션이 붙은 포인트에 aop가 실행되게끔 할 수도 있다.
그렇다면 ExampleService의 모든 메서드를 기준으로 동작하는데 아래와 같다.
@Before - ExampleService 메서드의 동작 이전
@After - ExampleService 메서드의 동작 이후
@Around - ExampleService 메서드의 동작 이전과 이후
@AfterReturning - ExampleService 메서드가 에러 없이 동작한 이후
@AfterThrowing - ExampleService 메서드가 동작 중 에러가 난 경우
'Java' 카테고리의 다른 글
Spring Boot Gradle 정보(Property)를 application.yml에서 활용해보자 (0) | 2024.01.17 |
---|---|
Spring Boot 3 Swagger 설정 (0) | 2023.09.05 |
Java transient란? transient 키워드, serialize 제외 (0) | 2023.08.21 |
Try-with-resources를 이용한 자원 해제 처리 (0) | 2023.08.19 |
[Spring Boot] jib로 AWS ECR에 docker image 올리기 (0) | 2023.08.14 |