25.02.13 Spring Boot AOP
개요
오늘은 설계가 끝나고 각자 팀원이 어떤 역할을 맡을지 정했다.
여러 기능 중에 나는 User , User의 배송지 , Spring Security 를 담당하게 되었다.
혼자서도 몇 번 security를 적용해봤다. 프로젝트에서 담당해서 진행하게되면 나중에 포트폴리오에 도움이 될거라 생각해
자진해서 해당 역할을 맡는다고했다. user와 배송지는 간단한 curd 선에서 끝날 것이기 때문에 security도 금방 끝나게 된다면 Spring Boot의 AOP 기능을 추가해 user의 서비스 이용시간을 축적하는 기능을 만들어보고싶다.
그래서 오늘은 Spring Boot의 AOP에 대해 정리해보려한다.
Spring Boot AOP
💡 AOP 는 특정한 긴으을 애플리케이션의 여러 부분에 걸쳐 재사용할 수 있는 프로그래밍 기법이다.
로깅, 보안, 트랜잭션 관리, 예외 처리 등과 같은 공통적인 관심사를 비즈니스 로직과 분리할 수 있다.
주요 개념
- Aspect : 공통된 관심사를 모듈화한 단위이다.
- Advice : Acpect가 실행될 시점을 정의한다. 여러 타입이 존재한다.
- Before : 대상 메서드가 실행되기 전에 실행
- After : 대상 메서드가 실행된 후 실행
- AfterReturning : 메서드가 정상적으로 종료된 후 실행
- AfterThrowing : 예외가 발생했을 때 실행
- Around : 메서드 실행 전 후에 실행된다. 메서드 실행을 제어할 수 있다.
- JoinPoint : Advice가 적용될 수 있는 지점을 의미한다. 보통 메서드 호출이 지점이다.
- Pointcut : Advice를 적용할 메서드가 객체를 정의하는 표현식
적용 방법
1. 의존성
spring boot 에서는 기본적으로 'spring-boot-starter-aop' 의존성이 포함되어있기 때문에 따로 추가할 건 없다.
2. Aspect 클래스 작성
Aspect 를 생성하기 위해선 적용할 클래스에 @Aspect 어노테이션을 적용하고 @Component 를 사용해
Spring Bean으로 등록해야 사용할 수 있다.
@Aspect
@Component
public class AOP {
// 1. Before Advice
@Before("execution(* com.example.demo.service.*.*(..))")
public void beforeTest() {
System.out.println("메서드 실행 전에 로깅합니다.");
}
// 2. After Advice
@After("execution(* com.example.demo.service.*.*(..))")
public void afterTest() {
System.out.println("메서드 실행 후에 로깅합니다.");
}
// 3. Around Advice
@Around("execution(* com.example.demo.service.*.*(..))")
public Object aroundTest(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("메서드 실행 전...");
Object result = joinPoint.proceed(); // 실제 메서드 실행
System.out.println("메서드 실행 후...");
return result;
}
}
Porintcut 표현식
"excution(* com.example.demo.service.*.*(..))" 는 com.example.demo.service 패키지 아래의 모든 클래스와 모든 메서드에 적용한다는 의미이다.
메서드의 반환값, 이름, 매개 변수에 따라 세부적인 필터링도 가능하다.
- execution(public void com.example..*(..)) : 반환값이 void인 모든 메서드
- execution(* com.example..*Service.*(..)) : 클래스 이름에 'service'가 포함된 모든 클래스의 메서드
이런식으로 각각 상황에 맞게 적용해 사용할 수 있다.
간단한 예시 코드이기 때문에 별 다른 설명은 작성하지않겠다.
AOP 활성화
위에서서 생성한 AOP를 활성화 시키기 위해서는 Spring Boot 실행 클래스 즉 @SpringBootApplication이 있는 클래스에
@EnableAspectJAutoProxy 를 적용해 AOP를 활성화 시켜준다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication
public class MyselectshopApplication {
public static void main(String[] args) {
SpringApplication.run(MyselectshopApplication.class, args);
}
}
이렇게 간단한게 스프링부트의 AOP를 적용하는 법을 정리했다.
조금 더 검색을 통해서 다른 사람들은 AOP를 어떻게 다뤘는지 보고 나도 이번 프로젝트에 적용해봐야겠다.
팀원분들과 어제보다 조금 더 친해진 거 같아서 덜어색해서 좋다. 그래서 약간의 긴장이 도는 지금이 서로에게 자극이되서 좋은 거 같다. 다들 웃으면서 만족하는 프로젝트면 좋겠다.