본문 바로가기
[ Developer ]/Spring Framework

[Spring] 스프링 AOP 설정 관점 지향 프로그래밍

by 김현섭. 2016. 6. 11.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
AOP:Aspect Oriented Programming
(관점 지향 프로그래밍)
  • ORM을 세팅하기 위해서는 AOP의 이해가 필요함
  • 기존의 해왔던 방식 OOP:Object Oriented Programming (객체 지향 프로그래밍)과는 다른 관점
  • 공통적으로 적용되는 기능들을 특정 Method 혹은 Class가 실행되기 전 / 후 등의 단계에서 자동으로 실행될 수 있게 지원하는 프로그래밍
  • Loggin, Transaction, Parameter Check 등 여러 기능들을 대상으로 함
  • AOP 적용시 하나의 .java 파일을 .class로 컴파일 시 컴파일 파일에 기능 코드를 주입시켜 마치 하나의 코드인 것 처럼 실행되게 한다
    • 하나의 코드 처럼 컴파일 되어 실행되어 진다면 실행 속도 측면에서 효율적이다
    • 위의 처리를 Weaving(위빙)이라고 부른다
  • AOP를 사용하기 위해 spring-aop가 필요하다

# AOP 설정
  • Spring-aop는 공통 기능이 실행될 시점을 제공
    1. <aop:before> : Method가 실행되기 이전
    2. <aop:after-returning> : Method가 실행된 이후 (실행 결과와 상관 없이)
    3. <aop:after-throwing> : Method가 실행된 이후 (Exception 발생 시)
    4. <aop:after> : Method가 정상적 실행된 이후
      • Try~catch~finally 블록에서 finally와 비슷
    5. <aop:around> : 1~4를 포함한 모든 시점
      • 모든 시점에 적용 가능한 Advice
      • 자주 사용됨
  • 모든 시점을 Advisor라고 부름

# AOP 정의
AOP 정의 소스
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
    <bean   id="aopPracticeBiz"
            class="com.hucloud.aop.sample2.biz.AOPPracticeBizImpl" />
 
    <!-- 공통기능 클래스 -->
    <bean   id="sayHello"
            class="com.hucloud.aop.sample2.aspect.AspectSayHello" />
 
    <aop:config>
    
        <!-- 공통으로 실행시킬 기능이 있는 클래스를 설정함. -->
        <aop:aspect id="aspect" ref="sayHello">
        
            <!-- 
                공통기능이 실행될 Target 설정 
                com.hucloud.aop.sample2 패키지 또는 그 하위 패키지의 파라미터가 0개 이상인 모든 메소드
            -->
            <aop:pointcut expression="execution(public * com.hucloud.aop.sample2..*.*(..))" id="pointCut"/>
            
            <!-- 메소드 호출 전, 호출 후, 예외발생시 모두 사용가능. -->
            <aop:around method="hello" pointcut-ref="pointCut"/>
            
            <!-- 
            <aop:after method=""/> 메소드가 정상적으로 실행되었는지, 예외가 발생했는지 여부에 관계없이 메소드 실행 이후에 실행함.
            <aop:after-returning method=""/> 메소드가 정상적을 실행된 이후 실행됨.
            <aop:after-throwing method=""/> 메소드가 예외를 발생시켰을 때 실행됨.
            <aop:before method=""/> 메소드가 실행되기 이전에 실행됨.
            -->
        </aop:aspect>
    </aop:config>
cs

execution 내용
  • public 은 접근 제어 지시자가 public인 것들을 실행시키겠다는 의미이고
  • *는 모든 리턴 타입을 뜻한다
  • com.hucloud.aop.sample2..*의 첫 번째 *은 패키지 내의 모든 클래스를 의미하고
  • .*을 통해 모든 클래스 내의 모든 메소드를 의미한다
  • *(..)는 모든 메소드의 파라미터 모든 것을 의미