AOP (Aspect Oriented Programming)

관점지향 프로그래밍
:어떤 로직을 핵심적인 관점, 부가적인 관점로 나누어서 보고 그 관점을 기준으로 각각 모듈화
=> ‘중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가’ 에 대한 해결책을 지원

  • 하나의 코드를 core concern (target, 핵심기능) & crosscutting concern (advice, 부가기능) 으로 나눠서 개발
  • 실행중에 weaving = 하나의 객체인 proxy로 합침
  • ProxyFactoryBean 이 weaving 된 Dynamic Proxy 생성 -> 런타임에 Dynamic Proxy을 자동 생성하는 Auto Proxy

Proxy

: 타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑오브젝트
클라이언트가 타겟을 호출하면 타겟이 아닌 타겟을 감싸고 있는 프록시가 호출 -> 타겟메소드 실행전에 선처리, 후처리

  • dynamic proxy : 런타임시에 동적으로 만들어지는 오브젝트
    java의 reflection 을 이용해서 proxy 객체 생성
    프록시 대상의 객체가 최소 하나 이상의 인터페이스를 구현했다면 JDK 동적 프록시 이용하면 됨

Weaving

: aspect(부가기능) 와 application(핵심기능)의 linking 하는과정 -> 해당 객체들을 묶어 새로운 객체 생성 = joinpoint들을 advice로 감싸는 과정

Aspect

crosscutting concern 을 모듈화한 것 (= 비즈니스 로직에서 분리) -> 재사용!
JointPoint + PointCut

Target

: 핵심 로직을 구현하는 클래스 또는 객체 / Aspect 를 적용하는 곳 (class, method)

Advice

: cross cutting concern으로 분리된 로직에 대한 코드 = 실질적으로 부가기능을 담은 구현체 = joinpoint에서 실행되어야 하는 코드

  • DB연결, 예외처리, 트랜잭션, 로그, 보안, 인증 등 소스코드 상에서 계속 반복해 쓰는 코드
  • 타겟 오브젝트에 종속안됨 -> 순수하게 부가기능에만 집중가능

JointPoint

Advice(corss cutting concern로 분리된 로직)가 적용될 위치 또는 끼어들 수 있는(조인할 수 있는) 지점

  • 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등

PointCut

JointPoint의 상세한 스펙을 정의한 것 (조건) = 부가기능이 적용될 대상을 선정하는 방법 ex) ‘A란 메서드의 진입 시점에 호출할 것

PointCut(“execution(접근제어자 반환타입 패키지명.클래스명.메소드명(매개변수))

@Pointcut("execution(public void get*())") 
// 접근제어자 public, 반환타입 void 형태의 메소드 중 get으로 시작하는 메소드 중 파라미터가 존재하지 않는 메소드들에게 적용
@Pointcut("execution(**(..))") 
// *접근제어자와 반환타입 모두를 상관하지 않고 적용, *어떠한 경로에 존재하는 클래스도 상관하지 않고 적용, (..)메소드의 파라미터가 몇개가 존재하던지 상관없이 적용

업데이트: