AOP는 "관점 지향 프로그래밍"이라는 뜻
➡️ 특정 행동이 일어나면, 자동으로 추가 행동을 몰래 넣는 기술!
1. 로그 남기기 📋 : 관리자가 접근했네? 언제 무엇을 했는지 남길때
2. 보안 검사 🔐
3. 시간 측정 🕒
4. 트랜잭션 처리 💰
이런 공통적인 작업을 한 번에 관리하고 싶을 때 아쥬 딱
예제를 통해 이해해보자
이 예제는, 관리자가 접근할 때마다 로그를 남기는 AOP 코드이다
@Slf4j
@Aspect
@Component
@RequiredArgsConstructor
public class AdminAccessLoggingAspect {
private final HttpServletRequest request;
@After("execution(* org.example.expert.domain.user.controller.UserController.getUser(..))")
public void logAfterChangeUserRole(JoinPoint joinPoint) {
String userId = String.valueOf(request.getAttribute("userId"));
String requestUrl = request.getRequestURI();
LocalDateTime requestTime = LocalDateTime.now();
log.info("Admin Access Log - User ID: {}, Request Time: {}, Request URL: {}, Method: {}",
userId, requestTime, requestUrl, joinPoint.getSignature().getName());
}
}
@Slf4j
: "로그 남기기 도구(log)를 쓰겠다"는 뜻
→ log.info(...) 처럼 로그 메시지를 출력할 수 있따
@Aspect
: 🔍 '감시 역할'을 하겠다는 표시
→ 특정 행동을 몰래 보고 있다가, 그때 이 코드에 적힌걸 해버릴거야!!!!라는 뜻
@Component
: 이 클래스를 Spring이 관리하도록 등록해주는 표시
@RequiredArgsConstructor
: 생성자 자동 주입
| Aspect 어노테이션 | 언제 쓸까? |
|---|---|
@Before | 메서드 실행 전 |
@After | 메서드 실행 후 (성공, 예외 상관없음) |
@AfterReturning | 메서드 정상 종료 후 |
@AfterThrowing | 메서드 예외 발생 시 |
@Around | 메서드 전/후 모두 제어 가능 |
private final HttpServletRequest request;
지금 요청한 사람(관리자)의 정보 같은 걸 가져올 수 있는 도구
👉 누가 어떤 주소로 왔는지 등을 알 수 있다
@After("execution(* org.example.expert.domain.user.controller.UserController.getUser(..))")
몰래 지켜보는 포인트(지점)을 알려주는 어노테이션! @After
이 코드에서의 뜻은,
UserController라는 클래스 안의 getUser()라는 메서드가 끝난 직후에, 이 AOP의 기능을 수행한다!
public void logAfterChangeUserRole(JoinPoint joinPoint) {
JoinPoint는 누가 호출했는지 등의 정보를 담은 메서드
이렇게하면 로그로 출력해버릴 수 있따
log.info("Admin Access Log - User ID: {}, Request Time: {}, Request URL: {}, Method: {}",
userId, requestTime, requestUrl, joinPoint.getSignature().getName());