관점 지향 프로그래밍(AOP)

CO빈·2024년 10월 27일
0

백엔드

목록 보기
2/8
post-thumbnail

관점 지향 프로그래밍

핵심 관심 사항과 공통 관심 사항

적용 예

  • 간단한 메소드의 성능 검사
    • 배치 작업에 대하여 시간을 측정해보고 쿼리를 개선하는 작업은 매우 의미있다.
    • 그러나 매번 사용하기에는 번거로우므로, 이 경우 코드 밖에서 설정하고 해당 부분을 사용하는 것이 편리하다.
  • 트랜잭션 처리
    • 트랜잭션의 경우 비즈니스 로직 전후에 설정
    • 매번 사용하는 try catch부분의 코드는 번거로움
  • 그외 : 예외반환, 아키텍처 검증.. 등

Spring AOP

  • Target : 핵심기능을 담고 있는 모듈

  • Advice : 어느시점에 공통 관심 기능을 적용할지 정의한 것
    @Before @After @Around @AfterThrowing @AfterReturning 지원

  • joinPoint : Aspect가 적용될 수 있는 지점

  • Pointcut : 공통 관심 사항이 적용될 JoinPoint, Advice를 적용할 타겟의 메소드를 선별하는 정규표현식, execution으로 시작

  • Aspect : 여러 객체에서 공통으로 적용되는 공통 관심 사항, 싱글톤 형태의 객체로 존재
    Aspect = advice + pointcut

  • advisor : advice + pointcut

  • weaving : 어떤 advice를 어떤 pointcut에 적용시킬 것인지 대한 설정

AOP 특징

  • 스프링은 프록시 기반 aop를 지원
  • 프록시가 호출을 가로챈다
  • 스프링 aop는 method JoinPoint만 지원

자바의 proxy 패턴이란?

  • 프록시 객체가 객체를 감싸서 client의 요청을 처리하게 하는 패턴
  • spring aop는 proxy기반 runtime weaving 방식이다

구현

POJO Class 이용

  • xml 스키마 확장 기법을 통해 설정 파일 작성
<aop:config> //root태그(weaving들의 묶음)
	<aop:aspect ref="myAdvice"> //공통 기능을 가지고 있는 bean연결
		<aop:before method="login" pointcut="execution(* work())"/>
		<aop:after method="logout" pointcut="execution(* work())"/>
	</aop:aspect>
</aop:config>

Spring API 이용

Annotation 이용

<aop:aspectj-autoproxy/>

설정파일에 추가

@Aspect
public class AdviceEx {
	  //@Before("within(aop08.CoreEx)")   // pointcut 주입
		@Before("execution(* zeroMethod(..))")
		public void before(){
			System.out.println("Joinpoint앞에서 실행되는 Advice");
		}
		
		//@AfterThrowing(pointcut="within(aop08.CoreEx)", throwing="e" )
		@AfterThrowing(pointcut="execution(* zeroMethod(..))", throwing="e" )
		public void afterThrowing(Throwable e){
			System.out.println("예외가 실행될때 호출되는 Advice");
			System.out.println(e.getMessage());
		}
		
		//@AfterReturning(pointcut="within(aop08.CoreEx)", returning="ret" )
		@AfterReturning(pointcut="execution(* zeroMethod(..))", returning="ret" )
		public void afterReturing(Object ret){
			System.out.println("Joinpoint가 정상 종료후 실행되는 Advice");
		}
		
		//@After("within(aop08.CoreEx)")
		@After("execution(* zeroMethod(..))")
		public void after(){
			System.out.println("Joinpoint뒤에서 실행되는 Advice");
		}
		
		//@Around("within(aop08.CoreEx)")
		@Around("execution(* zeroMethod(..))")
		public Object around(ProceedingJoinPoint  jp) throws Throwable{
			System.out.println("Joinpoint 전역에서 실행되는 Advice");
			return jp.proceed();
		}	
}

0개의 댓글

관련 채용 정보