AOP가 필요한 상황
- 모든 메소드의 실행 시간을 측정하고 싶을 때
- 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
- 회원 가입 시간, 회원 조회 시간 측정하고 싶을 때
모든 메소드의 실행시간 측정
MemberService.java
// 회원가입 (중복 이름 불가)
public Long join(Member member) {
long start = System.currentTimeMillis();
try {
validateDuplicateMember(member); // 중복 이름 체크
repository.save(member);
return member.getId();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join=" + timeMs + "ms");
}
}
위와 같이 실행 시간을 측정하는 코드를 모든 메소드에 입력해줘야 한다. -> 시간이 매우 오래 걸리고 생산성이 떨어짐
회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심사항이 X
시간을 측정하는 로직 -> 공통 관심 사항
시간을 측정하는 로직과 핵심 비즈니스 로직이 섞여서 유지보수가 어려움
시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어려움
시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 함
-> 이런 경우에 AOP를 이용해야 함
AOP 적용
AOP(Aspect Oriented Programming): 관점 지향 프로그래밍
AOP 정의 (TimeTraceAop.java)
@Aspect
public class TimeTraceAop {
// 원하는 타겟팅 조건
@Around("execution(* hello.hellospring..*(..))")
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");
}
}
}
@Around: 공통 관심 사항을 적용할 타겟팅 조건 설정
SpringConfig에 Bean 등록
@Bean
public TimeTraceAop timeTraceAop() {
return new TimeTraceAop();
}
AOP는 컴포넌트 어노테이션을 이용하는 것보다 직접 위와 같이 Bean으로 SpringConfig에 명시해 주는 것이 좋음 -> 정형화 된 것이 아니기 때문에 정확히 AOP라고 인지할 수 있도록
-> 지금은 테스트용이기 때문에 @Component 어노테이션으로 빈 등록해 줌
localhost:8080에서 회원 목록을 조회화면 아래와 같이 로그가 찍힘
핵심 관심사항(회원가입, 조회 등)과 공통 관심사항(시간 측정)을 분리
시간 측정 로직을 별도의 공통 로직으로 만들어서 사용함
핵심 관심 사항을 깔끔하게 유지할 수 있음
원하는 적용 대상을 선택할 수 있음(@Around)
AOP 동작 원리
'인프런 강의 > 김영한 Spring' 카테고리의 다른 글
[Spring] 스프링 핵심 원리 이해 (1) - 예제 만들기 (1) | 2024.01.24 |
---|---|
[Spring] 객체 지향 설계와 스프링 (0) | 2024.01.18 |
[Spring Boot] 회원 예제 만들기 (3) - 스프링 DB 접근 기술 (0) | 2023.11.25 |
[Spring Boot] 회원 예제 만들기 (2) - 웹 MVC 개발 (1) | 2023.11.25 |
[Spring Boot] 스프링 빈과 의존 관계 (0) | 2023.11.25 |