[AOP]
1. AOP란?
- 여러 메소드 혹은 여러 클래스에서 반복적으로 발생하는 코드에 작업에 대해 핵심 비즈니스 로직과 분리하여 클래스 생성
2. 사용방법
- AspectJ 프레임워크 dependency 주입
- Class명 위에 @Component + @Aspect 붙이기
- @Before, @PostDestory, @After, @Around 등 사용하여 조인포인트(메서드 실행 지점) 설정
-- @Before("execution ( com.spring.core.chap1_2.*(클래스).*(메서드) (..(매개변수))") : 해당 경로에 있는 모든 클래스의 모든 메서드의 모든 매개변수에 적용
-- @Before("execution ( com.spring.core.chap1.2.UserService.getInfo(..)") : 해당 경로의 UserService 클래스에 있는 getInfo() 메서드에 대해서만 적용
- @Before 밑에 실행할 메소드 적기
-- Around의 경우, 생성자로 ProceedingJointPoint joint를 받고, joint.proceed()를 실제 메소드 실행 시점 정하기
3. 코드 예제
package com.spring.core.chap04_2.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class LoggingAndSecurityAspect {
@Around("execution(* com.spring.core.chap04_2.service.UserService.*(..))")
public void logAspect(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("UserService의 메서드 실행!!");
joinPoint.proceed();
System.out.println("UserService의 메서드 실행종료!!");
}
@Before("execution(* com.spring.core.chap04_2.service.UserService.performAdminTask(..))")
public void checkUserAuth() {
String currentUser = "common";
if (!currentUser.equals("admin")) {
throw new SecurityException("접근 거부: 관리자 권한이 필요합니다.");
}
}
}