728x90
AOP가 없던 상황
모든 메서드의 호출 시간을 측정할 때 문제가 발생한다.
기존 방식
- 시간을 측정하는 공통된 로직은 공통 관심 사항이다.
- 핵심 비즈니스 로직과 섞여 유지보수가 어렵다.
기존 방식 코드
public Long join(Member member) {
long start = System.currentTimeMillis();
try {
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId(); // 이 3줄만 핵심 비즈니스 로직이다.
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join " + timeMs + "ms");
}
}
}
AOP
- 시간 측정 로직을 생성해 놓고, 원하는 곳에 적용시킨다.
- 핵심 비즈니스 로직을 깔끔하게 유지할 수 있다.
- @Aspect 를 추가해야 AOP로 사용할 수 있다.
- @Component 로 스프링 빈을 등록하거나, 직접 등록한다.
@Around : 적용할 범위를 지정한다.
컨트롤러가 가짜 서비스 객체(프록시)를 호출하고,
서비스 객체가 끝난 뒤 joinPoint.proceed( )가 호출되면 그때 진짜 서비스 객체를 실행한다.
예시 코드
@Aspect
@Component
public class TimeTraceAop {
@Around("execution(* hello.hello_spring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
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");
}
}
}
(AOP 실행 결과)
출처 | 스프링 입문(김영한) - 인프런
728x90
'💠프로그래밍 언어 > Spring' 카테고리의 다른 글
[Spring] 스프링 컨테이너 (애노테이션 기반, XML 기반) (1) | 2025.02.26 |
---|---|
[Spring] 스프링 빈 조회하기, 스프링 빈 설정 메타 정보(BeanDefinition) (0) | 2025.02.25 |
[Spring] 순수 JDBC → JdbcTemplate → JPA → 스프링 데이터 JPA (0) | 2024.12.30 |
[Spring] H2 데이터베이스 설치 (0) | 2024.12.30 |
[Spring] 스프링 빈 등록하는 2가지 방법 (컴포넌트 스캔, 직접 등록) !! (1) | 2024.12.20 |