[Spring] AOP

yimo22·2023년 5월 10일
0

WEB

목록 보기
7/8

AOP

About

AOP는 Aspect Of Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 이는 어떤 로직을 기준으로 핵심적인 관점, 부과적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화 하겠다는 것을 의미한다.

기존 OOP 에서는 공통관심사항을 여러 모듈에서 적용하는데 있어 중복된 코드를 양상하는 한계가 존재하여 등장하게 되었다.

적용 예시

  1. 간단한 메소드의 성능 검사
    1. 자바의 System.currentTimeMillis() 를 사용
    2. Spring 이 제공하는 StopWatch를 사용
  2. 트랜잭션 처리
    1. 트랜잭션의 경우 비즈니스 로직의 전후에 설정

용어

용어Description
Target핵심기능을 담고 있는 모듈로 target은 부가기능을 부여할 대상이 됨
Advice어느 시점에 어떤 공통관심기능을 적용할지 정의한 것
JointPointAspect가 적용 될 수 있는 지점, target 객체가 구현한 인터페이스의 모든 method는 JointPoint가 된다.
Pointcut공통 관심 사항이 적용될 JointPoint
Pointcut 표현식은 execution으로 시작하고 method의 Signature 를 비교하는 방법을 주로 이용한다.
Aspect여러 객체에서 공통으로 적용되는 공통 관심 사항.
AOP의 기본 모듈
AdvisorAdvisor = Advice + pointcut
Weaving어떤 Advice를 Pointcut 에 적용시킬 것인지에 대한 설정

특징

  • Spring은 프록시(Proxy) 기반 AOP를 지원한다.
    • Spring은 Target 객체에 대한 Proxy를 만들어 제공한다.
    • Target을 감싸는 Proxy는 실행시칸(Runtime)에 생성
    • Proxy는 Advice를 Target 객체에 적용하면서 생성되는 객체
  • Proxy가 호출을 가로챈다 (Intercept)
    • proxy는 target 객체에 대한 호출을 가로챈 다음 Advice의 부가기능 로직을 수행하고 난 후(or 수행하기 전)에 Target의 핵심 기능 로직을 호출한다.
  • Spring AOP는 method JointPoint만 지원한다.
    • spring 은 동적 proxy를 기반으로 AOP를 구현하므로 method JointPoint 만 지원한다. → 핵심기능(Target)은 method가 호출되는 런타임 시점에만 부가기능을 적용할 수 있다.
    • AspectJ 와 같은 고급 AOP Framework를 사용하면 객체의 생성, 필드값의 조회와 조작, static method 호출 및 초기화 등의 다양한 작업에 부가기능을 적용할 수 있다.

Spring AOP 구현

  1. POJO class 를 이용한 AOP 구현

    1. XML Schema 확장 기법을 통해 설정 파일을 작성

      • AOP 설정 태그
        Tagdesc
        <aop:config>AOP 설정의 root 태그 (weaving 들의 묶음)
        <aop:aspect>Aspect 설정 (하나의 weaving에 대한 설정)
        <aop:pointcut>Pointcut 설정
      • Advice 설정 태그
        Tagdesc
        <aop:before>method 실행 전 실행 될 Advice
        <aop:after-returning>method가 정상 실행 후 실행 될 advice
        <aop:after-throwing>method에서 예외 발생시 실행 될 advice.
        <aop:after>method가 정상 또는 예외발생에 상관없이 실행 될 advice
        <aop:around>모든 시점(전,후)에서 적용시킬 수 있는 advice
      • <aop:pointcut>
        • Pointcut(공통 기능이 적용될 곳)을 지정하는 태그
    2. POJO 기반 Advice Class 작성

  2. Spring API 를 이용한 AOP 구현

  3. Annotation 을 이용한 AOP 구현

    1. @Aspect Annotation 을 이용하여 AOP를 구현한다.

      → 설정 파일에 <aop:aspectj-autoproxy/> 를 추가해야한다.

      1. @Pointcut() 을 통해서 적용할 대상을 지정
      2. Around(), After(), Before(), AfterReturning(), AfterThrowing() 등을 사용하여 적용할 시점을 선택
    • Around를 제외한 나머지 method 들은 첫 args 로 JointPoint 를 가질 수 있다.
    • Around method 는 argument로 ProceedingJointPoint를 가질 수 있다.
profile
Viva La Vida!

0개의 댓글