AOP(Aspect-Oriented Programming)

공통 관심 사항을 분리하여 핵심 비즈니스 로직과 독립적으로 관리할 수 있게 하는 프로그래밍 기법
필요 상황
- 모든 메소드의 호출 시간 측정하고 싶을 때
- 회원 가입 시간, 회원 조회 시간을 측정하고 싶을 때(핵심 관심 사항x)
- 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
> 시간 측정 로직은 공통 관심 사항으로, 핵심 비즈니스 로직과 분리하는 것이 유지보수 좋음
> 시간 측정 로직이 핵심 로직과 섞이면 수정이 어렵고, 변경 시 모든 코드를 찾아 수정해야 하는 문제 발생
적용
-시간 측정 AOP 등록
@Component
@Aspect //AOP
public class TimeTraceAop {
@Around("execution(* hello.hello_spring..*(..))")//공통 관심사항 타겟팅
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
//ProceedingJoinPoint : AOP에서 메서드 실행 지점(join point)에 대한 정보, 메서드 실행 제어 할 수 있는 객체
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());//실행중인 메서드 정보 문자열
try {
return joinPoint.proceed(); //원래 메서드 실행
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString()+ " " + timeMs +"ms");
}
}
}
@Component 말고 코드로빈등록 하는게 좋음
execution( [반환타입] [패키지].[클래스].[메서드]( [매개변수] ) )
| execution(...) | 특정 메서드 실행 시점(AOP 적용 대상) 지정 |
| * | 모든 반환 타입 |
| hello.hello_spring.. | hello.hello_spring 패키지 및 그 하위 패키지 전부 포함 |
| * | 모든 클래스와 모든 메서드 적용 |
| (..) | 모든 매개변수 허용 |
결과
START: execution(MemberService hello.hello_spring.SpringConfig.memberService())
END: execution(MemberService hello.hello_spring.SpringConfig.memberService()) 1ms
동작 방식

컨테이너에 스프링빈 등록될 때 가짜 스프링 빈을 앞세움
joinPoint.proceed()실행되면 진짜를 호출함

'Spring' 카테고리의 다른 글
| [Spring] 스프링 컨테이너와 스프링 빈 조회 (0) | 2025.02.14 |
|---|---|
| [Spring] 스프링 개요, SOLID, DI 컨테이너 💡 (0) | 2025.01.31 |
| [Spring] 스프링 DB 접근(JDBC,JdbcTemplate,JPA,스프링 데이터 JPA) (0) | 2025.01.12 |
| [Spring] From 입력, 조회 (0) | 2024.12.22 |
| [Spring] 스프링 빈 등록과 의존관계 (0) | 2024.12.19 |