Spring

[Spring] AOP

별토끼. 2017. 7. 31. 15:24
반응형
AOP




  • AOP란? (Aspect Oriented Programming)

- cross concern

- 기능을 핵심 비즈니스 로직과 공통 모듈로 구분하고 핵심 로직에 영향을 미치지 않고 효과적으로 잘 끼워넣도록 하는 방법

- 공통 모듈(보안 인증, 로깅 같은 요소 등)을 만든 후에 이것을 코드 밖에서 비즈니스 로직에 삽입하는 것


  • AOP가 사용되는 곳
- 간단한 메소드 성능 검사
- 트랜잭션 처리
- 예외 반환
- 아키텍처 검증

[참조] http://isstory83.tistory.com/90


  • AOP 이용 예제

1.

Java프로젝트 만든 후 convert MavenProject를 한다.


2.

pom.xml에 해당 라이브러리를 복/붙한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
      <!-- Spring 라이브러리 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>
    <!-- Aop 용 라이브러리 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>
      <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.0</version>
    </dependency>
      <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.2.0</version>
    </dependency>
cs


3.

test.main/test.service/test.aspect 패키지 생성


4.
- 아래와 같이 init.xml을 만든다. 

- aop를 체크해준다.





5.

memberService 생성


6.

init.xml에 bean생성하기

1
    <bean class="test.service.MemberServiceImpl"/>
cs

7.

- 해당 클래스(MemberServiceImpl)을 수정하지않고 중간중간 작업을 끼워 넣으려면?


8.

특정클래스를 이용한 미리 작성한다.


9.

-특정클래스로 만들어 놓은 것을 bean으로 만들고 id를 부여한다.

-gura에 있는 printLog메소드를 myPoint에 적용시켜라!



-이런식으로도 설정 가능

: in으로 시작하는 메소드에 적용

:리턴타입이 void인 모든 메소드





  • Annotation기반으로 AOP설정하기

1.

aspectj expression 참고하기

http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecSpring&wr_id=330


2.
- Service annotation을 붙여준다.


3.
-component-scan을 할 수 있도록 init.xml에 추가해준다.
1
2
    <context:component-scan base-package="test.service"/>
    <context:component-scan base-package="test.aspect"/>
cs



4.
-annotation기반으로 Aop를 적용하기 위해 설정해준다. init.xml에!
1
2
    <!-- Annotation 기반으로 Aop를 적용하기 위한 설정 -->
    <aop:aspectj-autoproxy/>
cs


5.

- @Aspect 로 AOP임을 annotation하고 @Component를 통해 Bean 등록을 한다.

- @Around annotation을 이용하고 public void select()가 있을 때 해당 메소드를 수행한다.

- public void select() 조건에 부합하는 object는 obj에 담긴다. 이 때, joinPoint.proceed()메소드를 이용한다.


6.

- main메소드


  • Aspectj Expression
 * 1. execution(public * *(..)) 
   => 접근 지정자가 public인 메소드가 point cut
 * 2. execution(* test.service.*.*(..)) 
   => test.service 패키지의 모든 메소드 point cut
 * 3. execution(public void insert*(..))
   => 접근 지정자는 public 리턴 type은 void 이고 메소드명이 insert로 시작하는 모든 메소드가 point cut
 * 4. execution(* delete*(*))
   => 메소드 명이 delete 로 시작하고 인자로 1개 전달받는 메소드가 point cut
 * 5. execution(* delete*(*.*))
   => 메소드 명이 delete 로 시작하고 인자로 2개 전달받는 메소드가 point cut



1.

- Service annotation등록


2.

- AOP 임을 알리는 annotation과 Bean임을 알리는 Component 등록

- write로 시작하는 메소드가 실행되기 전에 "펜을 준비해서 뚜껑을 열어요"라는 콘솔을 출력


3.

- init.xml


4.

- main클래스


- 출력하면 아래와 같은 결과가 나온다.

- WritingAspect에서 write*(*) 가 해당되는 것은 service.writeToTeacher("김구라") 메소드 뿐이라서!



반응형