[Spring] AOP Aspect Orientend Programming(관점 지향 프로그래밍)

AOP

  • Aspect Orientend Programming(관점 지향 프로그래밍)
    : 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나눠 보고 그 관점을 기준으로 각각 모듈화하는 것
  • Crosscutting Concerns(흩어진 관심사) : 소스 코드 상 다른 부분에 계속 반복해서 쓰는 코드들
  • AOP의 취지 : 흩어진 관심사를 관점(Aspect)으로 모듈화하고 핵심적인 비지니스 로직에서 분리하여 재사용
  • 주요 개념
    • Aspect : 흩어진 관심사를 모듈화
    • Target : Aspect를 적용하는 곳(ex. 클래스, 메서드...)
    • Advice : 실질적인 부가기능을 담은 구현체
    • JointPoint : Advice가 적용될 위치. 다양한 시점에 적용 가능
    • PointCut : JointPoint의 상세한 스펙을 정의한 것. 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
  • 특징
    • 프록시 패턴 기반
      • 프록시 객체를 쓰는 이유 : 접근 제어 및 부가기능 추가
      • client(호출부) -> proxy -> target(핵심기능)
    • 스프링 빈에만 AOP 적용 가능

 

어노테이션

  1. @Around : 타겟 메소드를 감싸 특정 Advice를 실행
    • @Around("execution(* com.saelobi..*.EventService.*(..))") : com.saelobi 아래의 패키지 경로의 EventService 객체의 모든 메서드에 이 Aspect를 적용
    • "execution([수식어] 리턴타입 [클래스이름].이름(파라미터)"
      • 수식어 : public, private 등 수식어를 명시합니다. (생략 가능)
      • 리턴타입 : 리턴 타입을 명시합니다.
      • 클래스이름 및 이름 : 클래스이름과 메서드 이름을 명시합니다. (클래스 이름은 풀 패키지명으로 명시해야합니다. 생략도 가능)
      • 파라미터 : 메서드의 파라미터를 명시합니다.
      • " * " : 모든 값을 표현합니다.
      • " .. " : 0개 이상을 의미합니다.
    • @Around("@annotation(PerLogging)") :@PerLogging 어노테이션이 붙은 메서드만 Aspect가 적용
  2. @Before (이전) : 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행
  3. @After (이후) : 타겟 메소드의 결과에 관계없이(즉 성공, 예외 관계없이) 타겟 메소드가 완료 되면 어드바이스 기능을 수행
  4. @AfterReturning (정상적 반환 이후)타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
  5. @AfterThrowing (예외 발생 이후) : 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행
  6. @Around (메소드 실행 전후) : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행

 

 

참고 자료

728x90