김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의를 듣고 정리한 내용입니다.
개발을 할 때 회원 가입
, 회원 조회
등 비즈니스의 핵심 로직을 수행하는 것들을 핵심 관심 사항(core concern)이라고 하고, 보안, 로그, 메서드 호출 시간 측정
과 같이 어플리케이션의 여러 군데에서 공통적으로 사용하고 싶은 기능들을 공통 관심 사항(cross-cutting concern)이라고 한다.
근데 이게 메서드마다 흩어져 있으면 중복코드가 많이 생기고 결합도도 높아져서 유지 보수가 힘들고 코드가 지저분해지기 쉽다. 이 때 AOP를 사용하면 이걸 한군데에 모아서 한꺼번에 원하는 곳에 적용해줄 수 있다.
전체 회원 조회 메서드 안에서 직접 메스드 호출 시간을 측정하는 로직을 같이 작성해준 코드
public List<Member> findMembers() {
long start = System.currentTimeMillis();
try {
// 실제로 회원을 조회하는 코드는 여기 한줄임.
List result = memberRepository.findAll();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + timeMs + "ms");
}
return result;
}
public List<Member> findMembers() {
return memberRepository.findAll();
}
hello.hellosping.aop
패키지 만들고, TimeTraceAop.java
클래스를 생성한다.@Aspect
@Component
- 스프링에 Bean으로 등록하기 위해 추가해준다.@Around("execution(* hello.hellosping..*(..))")
- 괄호 안의 문법은 hello.hellosping
패키지 밑에 있는 모든 메서드에서 적용한다는 뜻이다.@Aspect
@Component
public class TimeTraceAop {
@Around("execution(* hello.springintro..*(..))")
public Object exeute(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");
}
}
}