[스프링]AOP

정태규·2023년 3월 17일
0

spring

목록 보기
2/14

AOP란?

  • Aspect Oriented Programming
  • 공통적인 부분을 spring이 도와서 처리해준다.
  • 특정 함수 호출 전이나 후에 뭔가 공통적인 처리가 필요하다면 사용
  • 전체적으로 쓰는 것이 아니라 특정 몇몇곳에서 써야할 때 유용하다.
  • ex) 로깅 , 트랜잭션, 인증..

기본개념

  • Aspect: 여러 클래스나 기능에 걸쳐져 있는 관심사, 그리고 그 것들을 모듈화함(Pointcut,Advice 포함되어 있다.)
  • AOP 중에서 가장 많이 쓰이는 부분은 @Transactional(트랜잭션 관리) 기능
    • Advice: AOP에서 실제로 적용하는 기능(로깅,트랜잭션,인증)을 뜻함.
    • Join point: 프로그램의 흐름안에서 모든 흐름들 마다 모두 AOP를 적용할 수는 없기 때문에, 그것을 적용할 특정 point들을 Join point라고 한다.
    • Pointcut: Aspect를 적용할 대상을 뽑을 조건식
    • Target Object: Advice가 적용될 대상 오브젝트
    • AOP proxy: 대상 오브젝트에 Aspect를 적용하는 경우 Advice를 덧붙이기 위해 하는 작업을 AOP proxy라고 한다. 주로 CGLIB(code Generation Library, 실행 중에 실시간으로 코드를 생성하는 라이브러리) 프록시를 사용하여 프록싱 처리를 한다.
    • weaving: Advice를 비지니스 로직 코드에 삽입하는 것을 말함

AspectJ

AspectJ는 AOP를 제대로 사용하기 위해 꼭 필요한 라이브러리
springboot에 기본적으로 포함되어 있어서 따로 라이브러리를 추가해 줄 필요는 없다.

  • Aspect의 생성
	package org.xyz;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    @Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
    public class UsefulAspect{
    
    }

이렇게 하면 하나의 Aspect가 생성된다.

  • Pointcut 생성
	package org.xyz;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    @Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
    public class UsefulAspect{
   		@Pointcut("excution(= transfer(..))")
        private void anyOldTransfer() {}
    }

"excution(= transfer(..))" 이런식으로 조건을 생성해서 넣어준다.
포인트 컷 표현식이라고 부름.

  • Pointcut 결합
	package org.xyz;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    @Component // Component를 붙인 것은 해당 Aspect를 스프링의 Bean으로 등록해서 사용하기 위함
    public class UsefulAspect{
   		@Pointcut("excution(public * *(...))")
        private void anypublicOperation() {} // public 대상 메서드 pointcut
        @Pointcut("within(com.xyz.myapp.trading..*)")
        private void inTrading(){} //특정 패키지 대상 포인트 컷
        @Pointcut("anyPublicOperation() && inTrading()")
        public void tradingOpertion() {} //위의 두조건을 and 조건으로 결합한 포인트 컷
    }
  • Before Advice
@Aspect
public class BeforeExample{
	
    @Before("com.xyz.myapp.CommonPointcuts.dataAcessOperation()")
    public void doAcessCheck(){
    
    }
}

dataAcessOperation() 이라는 메서드가 실행되기 바로 전에 doAcessCheck()가 실행된다.

  • AfterReturning Advice
@Aspect
public class AfterReturningExample{
	@AfterReturning("com.xyz.myapp.CommonPointcuts.dataAccessOpearation()")
public void doAcesscheck(){
	}
}

dataAcessOperation() 라는 메서드가 실행된후 doAcessCheck()가 실행된다.

  • Around Advice

businessService{}라는 포인트 컷의 전과후에 동작을 추가한다.

public class AroundExample{
	@Around("com.xyz.myapp.CommonPointcut.businessService()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
    	//start stopwatch
        Object retVal = pjp.proceed();
        //stop stopwatch
        return retVal;
    }
}

0개의 댓글