ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] AOP사용방법
    Web/Servlet && Spring 2019. 8. 10. 21:50

    AOP(Aspect Oriented Programming)

    어플리케이션의 핵심 기능은 아니지만 어플리케이션을 구성하는 중요한 요소이다.

     

    Aspect: 예를들어 쇼핑몰에서 물건 선택 장바구니 결제는 코어 기능이다. 하지만 어떤 사용자가 어떤 물건을 사는지 등의 처리는 부가적인 기능이다. 

    어플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 Aspect모듈로 만들어서 설계하고 개발하는 방법이다.

    개발자는 핵심 기능에 집중하고, 나머지 부가적인 기능은 담당해주겠다는 것이다.

    OOP 모듈화의 핵심은 클래스 이지만, AOP 모듈화의 핵심은 관점이다.

     

    Advice - 부가기능을 담은 모듈로 공통 로직을 담고 있는 코드( 트랜잭션, 보안 등)

    동작시점

    Before: 메소드 실행 전 동작 

    After Returning: 메소드가 성공적으로 리턴되면 동작

    After Throwing: 메소드 실행 중 예외 발생시 동작 (try ~catch)

    After: 메소드 실행 후 동작 (finally)

    Around: 메소드 실행 전후에 처리할 로직을 삽입하여 동작

     

    execution(* t_siri03.ItemTarget.*())

    *: 리턴 타입

    t_siri03: 패키지 경로

    ItemTarget: 클래스명.*Target, *Impl, *

    *(): 모든 메소드

    get*(): get으로 시작하는 모든 메소드

    set*(): set으로 시작하는 모든 메소드

    buy*(..): buy로 실행하는 모든 메소드

     

    JoinPoint - Advice를 적용 가능한 지점 (스프링에서는 각 객체의 메소드)

    Pointcut - Joinpoint를 선별하는 기능을 정의한 모듈(

    Target - 대상 메소드를 가지는 객체, 비즈니스 로직을 처리하는 클래스(상품조회, 상품등록, 결제)

    Proxy - Advice가 적용되었을 때 만들어지는 객체

    Weaving - Advice를 핵심로직 코드에 적용하는 것

     

    pom.xml에

    Maven Repository - aspectjweave, aspectjrt, aspectjtools 복붙, 클래스로 aop사용할 것이라면 cglib추가

    <!-- AspectJ -->
    
    		<dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjweaver</artifactId>
    			<version>${org.aspectj-version}</version>
    		</dependency>
            
    		<dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjrt</artifactId>
    			<version>${org.aspectj-version}</version>
    		</dependency>
    		
    		<dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjtools</artifactId>
    			<version>${org.aspectj-version}</version>
    		</dependency>
            
    		<!-- 클래스 단위의 aop를 사용하기 위해선 필요하다. -->
    		<dependency>
    			<groupId>cglib</groupId>
    			<artifactId>cglib</artifactId>
    			<version>2.2</version>
    		</dependency>

     

    AOP사용을 위해선 이 한줄을 최상단 beans에 추가해 줘야 한다.

    xmlns:aop="http://www.springframework.org/schema/aop"

     

    xsi:schemaLocation 아래에 

    http://www.springframework.org/schema/aop

    https://www.springframework.org/schema/aop/spring-aop.xsd"

    추가!

     

    servlet-context.xml 내용 추가

    <!-- aop의 타겟을 인터페이스가 아닌 클래스로도 사용하겠다. 라는 옵션 -->
    	<aop:config proxy-target-class="true"/>
    	<beans:bean id="myLoggingAdvice" class="com.myway.tok.aop.MyLoggingAdvice"></beans:bean>
    	<aop:config>
    		<!--  -->
    		<aop:aspect ref="myLoggingAdvice">
    			<!-- pointcut :언제 실행할래? -->
    			<aop:around method="aroundAdvice" pointcut="execution(* com.myway.tok.dao.*DAO.*(..))"/>
    		</aop:aspect>
    	</aop:config>	

    joinPoint사용방법

    public void aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable{
    		//추가로직
    		Signature method= joinPoint.getSignature();
    		System.out.println("&&&&내가 실행한 메소드&&&&"+method.getName());
    		
    		//메소드 실행
    		joinPoint.proceed();//꼭 실행해야 한다. <-- 아이템을 대량으로 구매합니다. 를 실행
    		
    		//추가로직
    		if("buyGoods".equals(method.getName())){
    			System.out.println("Goods를 구매해 주셔서 감사합니다.");
    		}else{
    			System.out.println("Item을 구매해 주셔서 감사합니다.");
    		}
    	}

     

    반응형

    댓글

Designed by Tistory.