AOP(Aspect Oriented Programming) : 핵심 기능이 아닌 부가 기능(로깅,보안,예외처리,트랜잭션 등 공통적으로 쓰이는 기능)을 분리하여 관리하는 방법으로 코드 중복을 방지하고 변경에 유리한 코드를 만들어 유지보수성을 높인다.
-> 코드 실행중에 동적으로 메서드의 시작 또는 끝에 부가 기능 자동 추가
Aop 관련 용어
target : advice가 추가될 객체(핵심기능)
advice : target에 동적으로 추가될 부가 기능
proxy : target에 advice가 동적으로 추가되어 생성된 객체
weaving : target에 advice를 추가해서 proxy를 생성하는 것
join point : advice가 추가(join)될 메서드
poincut : join point들을 정의한 패턴
-> execution(접근제어자(생략가능) 반환타입 패키지명.클래스명.메서드명(매개변수 목록))
매개변수 목록 => (int,int)
매개변수 목록 => (..) = 개수상관 x 모든타입 ok
@Around : 메서드 시작과 끝 부분에 추가되는 부가 기능
@Before : 메서드의 시작 부분
@After : 메서드의 끝 부분
@AfterReturning : try블럭 끝 부분
@AfterThrowing : catch블럭 끝 부분
@Aspect
public class TimeTraceAop {
@Around("execution(* com.example.spring3..*(..)) && !target(com.example.spring3.SpringConfig)")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
long start = System.currentTimeMillis();
System.out.println("strat : " + joinPoint.toString());
try {
return joinPoint.proceed();
}finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("end : " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}