AOP란(Aspect Oriented Programming ) ?  : 관심지향 프로그래밍

           1.  공통된 관심사항   <>   핵관심사항 을 분리 후, 

            2. 각각의 클래스로 작성한후 적절한 시점에  핵심 로직이 실행될 때 ,

              공통기능이 같이 실행되도록 처리

 

                   공통된 관심사항(cross-cutting concern) : 부가기능, 로그, 성능측정, 트랜잭션, 보안, 등

                   핵심 관심사항(core concern) : 비니스로직, 게시글등록, 게시글 목록,  


AOP를 정의 하기위해 필요한 것 1. 대상 : 공통기능을 적용할 핵심 로직을 담고 있는 메서드   (ex.  board패키지의 모든 것) 2. Advice : 공통기능을 구현한 클래스  (ex.  TimeCheckAopObj.java의 클래스) 3. 포인트컷 : aop를 실행하기위해서 타겟이 어떤 것인지 정의하기 위한 표현식 
         @Before : 메서드 호출전에,  공통모듈을 실행하겠다
        @After : 메서드 종료되고,  공통모듈을 실행하겠다
        @Around : 메서드 실행 전후에,  모두 공통모듈을 실행하겠다 (ProceedingJoinPoint)

   execution(정규표현식) 으로 실행

   execution(  [접근제어자], 리턴타입 패키지명. 클래스명. 메서드명. (매개변수)  ) 이순로 만들수 있다.      

     ㄴ [ ] 생략가능

 

공통
* 어떤 문자열이든 ok
. .  없음     or     1     or      모든것

 

리턴타입   패키지
* 모든리턴타입   com.multi.ggo 패키지라는 것을 정확하게 명시 
void void메서드   com.multi.ggo.. com.multi.ggo로 시작하든 모든 패키지
int int를 리턴하는 메서드   com.multi.ggo.*.get* com.multi.ggo 패키지의
모든 클래스 
get 시작하는 모든메서드에 적용
!void void가 아닌 메서   com.multi.ggo.*.*.get* com.multi.ggo로 시작하는 모든 패키지의
모든 클래스
get 시작하는 모든메서드에 적용
메서드   매개변수
* ( .. ) 모든메서드   ( .. ) 모든 매개변수
get*( .. ) get으로 시작하는 모든메서드   ( * ) 매개변수1개짜리 메서드 
      ( Integer, .. ) 1개 이상의 매개변수를 갖는 메서드
단, 첫번째 타입은 Integer
      ( Integer, * ) 2개의 매개변수를 갖는 메서드
단, 첫번째타입은 Integer

 

 

 

핵심로직은 원래대로 사용하고, 

   어느시점에 어떤로직에 실행할지를 정하는게 포인트컷 + execution(정규표현식 )

 


 

 

 

Q. 메서드별 실행시간이 어떻게 되는지  초단위로 측정 하라고한다면 ??

      ㄴ 전체메서드 가 한두군데도 아니고, 하게된다면 이런식으로 개노가다가 필요할것이다;

           갑자기 , 측정단위또한 바뀐다면 다시 노가다...

 

예를들어 이 메서드별시간을 한번만 써서 관리를 하는것이 aop이다. (공통관심사항)

 

방법은 3가지

 

 

 


 

 

프록시 패턴사용

1. 라이브러리추가 (pom.xml)

<!-- AOP관련 라이브러리 -->    
	     	     <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aop</artifactId>
                        <version>4.2.4.RELEASE</version>
                </dependency>
                <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aspects</artifactId>
                        <version>4.2.4.RELEASE</version>
                </dependency>

 

spring config에 namespace 가 확인이 되지않는다면, 수동으로 source 에추가

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

 

 

 

 

 

 

2. 공통된 관심사항을 분리할 클래스만들기

 공통으로 이거는 꼭실행할거다 ( 로그기록, 메서드실행시간 등등 분)

 

 

메서드 실행시간 체크

 

 

 

 

 

로그기록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts