ASPECT ORIENTED PROGRAMING
📌 AOP
- 여러객체에 공통적인 기능과 핵심적인 기능을 구분
- 재사용성을 높임
- 핵심기능의 수정없이 공통 기능을 적용할 수 있다.
- 핵심기능에 공통기능을 삽입
📌 구현방법
- 컴파일 시점에 코드에 공통기능 추가
- 클래스 로딩 시점에 바이트 코드에 공통기능 추가
- 런타임에 프록시 객체를 생성하여 공통기능을 추가
스프링 AOP는 프록시 객체를 자동으로 생성
공통기능을 구현한 클래스만 알맞게 구현
📌 AOP용어
- JoinPoint : Advice를 적용 가능한 지점. 스프링은 프록시를 사용하므로 메서드 호출 부분을 지칭
- Pointcut : JoinPoint에서 실제 Advice가 적용되는 JoinPoint 정규표현식이나 AspectJ의 문법으로 Pointcut을 정의
- Advice : 공통관심기능을 언제 핵심 로직에 적용할 것인지 정의
- Weaving : Advice를 핵심로직 코드에 적용하는 것
- Aspect : 여러 객체에 공통으로 적용되는 기능
📌 Adivce 종류
- Before : 대상객체의 메서드 호출 전
- AfterReturning : 대상객체의 메서드가 익셉션 없이 실행된 이후
- AfterThrowing : 대상객체의 메서드를 실행 중 익셉션이 발생한 경우
- After : 익셉션과 상관없이 메서드 실행 후
- Around : 메서드 실행 전, 후, 익셉션 발생시 모든 상황
📌 스프링 AOP구현 예제
팩토리얼 구하기
재귀함수 팩토리얼
반복문 팩토리얼
수행시간을 Around Advice로 구해보자
-
공통기능 인터페이스
-
반복문 팩토리얼(핵심기능)
-
재귀함수 팩토리얼(핵심기능)
-
AOP기능을 할 Aspect클래스(핵심기능 사이로 시스템시간을 받아온다(start, end). 이후 end-start로 수행시간을 구함(Around 사용))
-
메인에서 실행
-
xml설정