출처 : http://cocomo.tistory.com/229


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


 

자동으로 공통되는 코드를 클래스 안에 넣어준다.

분리된 로직이 마치 하나인것처럼 작동한다.

기존 Base Code에 공통 기능 코드를 삽입(Weaving)하여 변경된 자바 파일을 만든다.

트랜잭션, 보안, 로그 처리


pointCut에 정의된 패키지 혹은 클래스들 에게

관점 : .. 실행되기 전, 후, 등등..(adviser)

공통적으로 실행이 되어야 하는것들을 적는것.

Weaving 을통해 공통된 일을 묶는다.

트랜잭션처리, 로그, 어떤 파라미터가 있는지 확인, 보안



Weaving

공통 기능 코드를 자바 클래스 파일 내에 삽입하는 방식이다.




AOP 용어

용어

의미 

 Joinpoint 

 Advice를 적용 가능한 지점.

 메소드 호출, 필드 값 변경등이 Joinpoint에 해당됨. 

 Pointcut 

 Joinpoint의 부분집합, 실제로 Advice가 적용되는 Joinpoint를 나타냄.

 스프링에서는 정규 표현식이나 AspectJ의 문법을 사용하여 Pointcut을 정의할 수 있다.

 Advice 

 언제 공통 관심 기능을 핵심로직에 적용할 지를 정의한다.

 예를 들어, '메소드를 호출하기 전(언제)'에 트랜잭션 시작(공통기능)' 기능을 적용한다는 것을 정의한다. 

 Weaving 

 Advice를 핵심로직에 적용하는 것 

 Aspect

 여러 객체에 공통으로 적용되는 기능을 Aspect라고 함.

 트랜잭션이나 보안등이 Aspect의 좋은 예 



Advice 설정

 용어

의미 

<aop:before> 

 메소드 실행 전에 적용되는 advice를 정의

<aop:after-returning> 

 메소드가 정상적으로 실행한 후에 적용되는 advice를 정의한다.

 <aop:after-throwing>

 메소드가 익셉션을 발생시킬 때 적용되는 advice를 정의한다.

 try-catch블록에서 catch블록과 비슷하다.

 <aop:after>

 메소드가 정상적으로 실행되는지 또는 익셉션을 발생시키는지 여부에 상관없이 적용되는 Advice를 정의한다.

 finally와 비슷.

 <aop:around>

 메소드 호출 이전, 이후, 익셉션 발생 등 모든 시점에 적용가능한 advice를 정의한다.



pom.xml Dependency 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>4.1.6.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>4.1.6.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.8.5</version>
      </dependency>





<Guide.java>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.ktds.mcjang.aop;
 
import org.aspectj.lang.ProceedingJoinPoint;
 
public class Guide {
 
    public Object guide(ProceedingJoinPoint joinPoint) throws Throwable{
        
        
        //className.MethodName 을 가져온다
        String classAndMethod = joinPoint.getSignature().toShortString();
        
        //className.MethodName 을 출력한다.
        System.out.println(classAndMethod + "시작");
        
        //Method 수행전에 수행해야 할 공통기능 작성.
        System.out.println("반갑게인사!");
        
        try {
            // 원래 실행될 Method를 실행시킨다.
            Object result = joinPoint.proceed();
            return result;
        } 
        //Method 수행 후에 실행해야할 공통기능 작성
        finally {
            System.out.println("반갑게인사!");
            
        }
        
    }
}
 
cs

 




 

Hello, Bye, Main class 생성

 

 

 




메인

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.ktds.mcjang;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class Main {
 
    public static void main(String[] args){
        
        String contextLocation = "classpath:applicationContext.xml";
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(contextLocation);
        
        Hello hello =  ctx.getBean("hello", Hello.class);
        Bye bye = ctx.getBean("bye", Bye.class);
        
        hello.hello();
        bye.bye();
    }
}
cs

 





헬로

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.ktds.mcjang;
 
public class Hello {
 
    public void hello(){
        System.out.println("ㅎㅇㅎㅇ");
    }
    
    public void hello(String name){
        System.out.println(name+"님 ㅎㅇ");
    }
}
 
cs

 




바이

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.ktds.mcjang;
 
public class Bye {
 
    public void bye(){
        System.out.println("ㅂ2ㅂ2");
    }
    
    public void bye(String name){
        System.out.println(name+"님 ㅂ2ㅂ2");
    }
}
 
cs

 





 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
 
    <bean id="bye" class="com.ktds.mcjang.Bye"/>
    <bean id="hello" class="com.ktds.mcjang.Hello"/>
    
    <!-- aop 수행 클래스 -->
    <bean id="guide" class="com.ktds.mcjang.aop.Guide"/>
    
    <aop:config>
        <!-- 아래 기능을 공통으로 수행하게끔 설정. -->
        <aop:aspect id="guideAspect" ref="guide">
            <!-- 실행하게될 범위(scope)를 설정한다.  -->
            <!--
                 execution(public * com.ktds.mcjang..*(..))
                 실행(public 메소드이고 모든 Return Type을 가지는 com.ktds.mcjang 패키지 아래의 모든 메소드) 
              -->
            <aop:pointcut expression="execution(public * com.ktds.mcjang..*(..))" id="publicMethod"/>
            <!-- aop:around는 실행되는 모든 시점 -->
            <aop:around method="guide" pointcut-ref="publicMethod"/>
        </aop:aspect>
    
    </aop:config>
 
 
</beans>
 




Expression 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<aop:config>
        <!-- 아래 기능을 공통으로 수행하게끔 설정. -->
        <aop:aspect id="guideAspect" ref="guide">
            <!-- 실행하게될 범위(scope)를 설정한다.  -->
            <!--
                 execution(public * com.ktds.mcjang..*(..))
                 실행(public 메소드이고 모든 Return Type을 가지는 com.ktds.mcjang 패키지 아래의 모든 메소드) 
              -->
            <aop:pointcut expression="execution(public * com.ktds.mcjang..*(..))" id="publicMethod"/>
            <!-- aop:around는 실행되는 모든 시점 -->
            <aop:around method="guide" pointcut-ref="publicMethod"/>
        </aop:aspect>
    
    </aop:config>




결과




출처: http://cocomo.tistory.com/229 [Cocomo Coding]

'Freamwork > Explain' 카테고리의 다른 글

의존성주입의 의미와 이점  (0) 2017.06.24
프로그래밍에서 의존성이란?  (0) 2017.06.24
IOC란?  (0) 2017.06.24
vo, dao, dto란 무엇인가  (0) 2015.11.23

+ Recent posts