관점 지향 프로그래밍 AOP

두별·2021년 11월 30일
0

Spring Framework

목록 보기
6/18
post-thumbnail

패캠 스프링 초격차 Part1. Spring Framework-Ch.02 필기노트

AOP : Aspect Oriented Programming

  • 공통적인 부분은 Spring이 받아서 처리해준다. (특정한 함수 호출전,후)
    • 로깅 : 자세한 로깅을 ㅎ고 싶을때
    • 트랜잭션 : 스프링 mvc를 하다보면 사용하게 되는 어노테이션. 내부적으로 AOP기법을 사용하여 프로젝트가 시작하는 부분과 끝나는 부분을 AOP가 대신 처리해주고 있다.
    • 인증 : 특정 영역에서만 추가적인 인증이 필요할때
  • OOP로 처리하기에는 다소 까다로운 부분을 AOP라는 처리방식을 도입하여 손쉽게 공통기능을 추가/수정/삭제할 수 있다.
  • 실무에서 적극적으로 AOP를 쓰려고 하진 않는다. (코드의 분석을 어렵게 만들어서)
  • AOP가 부수적으로 필요할때에만 사용하는 편

AOP의 기본 개념들

  • Aspect
    - 특정 관심에 대하여 모듈화
    • 가장 많이 활용되는 부분은 @Transactional (트래낵션 관리)
  • Advice
    - 조언, AOP가 실제로 적용되는 기능 (로깅, 트랜잭션, 인증 등)
  • Join point
    - 모듈화된 기능이 연결된 포인트 지점 (프로그램 흐름의 특정 포인트)
  • Pointcut
    - Aspect가 심어질 Join Point의 조건식
  • Target Object
    - Advice 적용 대상
  • AOP Proxy
    - 특정 클래스에 AOP를 입혀줄때 메소드 후에 입혀주는게 아니라 해당 클래스에 AOP를 한번더 Proxy, 겉에 덧씌워주는 것이다.
    • Class를 Target Obejct라고 하고 여기에 AOP를 덧씌우는 것을 AOP Proxy 라고 한다.
  • Weaving
    - advice를 비즈니스 로직에 삽입하는 것을 말함

Aspect 지원

AspectJ는 AOP를 제대로 사용하기 위해 꼭 필요한 라이브러리, 기본적으로 스프링 부트에 포함
별도의 Aspect를 생성하는 것은
UsefulAspect 퍼블릭 클래스를 생성해주고 그 클래스 위에
컴포넌트를 하나 붙혀서 빈으로 등록,
Aspect라는 어노테이션을 붙혀주면 이것은 하나의 Aspect(관점),
pointcut과 advice를 갖고 있는 Aspect를 만들게 된다.

import org.aspectj.lang.annotation.Aspect;

@Aspect
@Component // Conponent를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect{

}

Pointcut 선언

해당 Apsect의 Advice 실행할 액션이 적용될 Join Point를 찾기 위한 조건 생성
포인트 컷 표현식이라고 부름

import org.aspectj.lang.annotation.Aspect;

@Aspect
@Component // Conponent를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
public class UsefulAspect{
    @Pointcut("execution(* transfer(..))")
    private void anyOldTransfer(){
        
    }
}

Advice 정의

포인트컷들을 활용하여 포인트 컷의 전,후,주변에서 실행될 액션을 정의함

  • Before Advice
@Aspect
public class BeforeExaple {
    @Before("com.test.myapp.CommonPointcuts.dataAccessOperation()")
    public void doAccessCheck(){
        // ...
    }
}
  • After Returning Advice
    dataAccessOperation이라는 미리 정의된 포인트 컷에서 return이 발생된 후 실행
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;

@Aspect
public class AffterReturningExample {
    @AfterReturning("com.test.myapp.CommonPointcuts.dataAccessOperation()") 
    public void doAccessCheck(){
        // ...
    }
}
  • Around Advice
    businessService()라는 포인트컷의 전,후에 필요한 동작을 추가함
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;

@Aspect
public class AroundExaple {
    @AfterReturning("com.test.myapp.CommonPointcuts.businessService()") 
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
        // start stopwatch
        Object retVal = pjp.proceed();
        // stop 
        return retVal;
    }
}

0개의 댓글