[Spring] AOP
- AOP란? (Aspect Oriented Programming)
- cross concern
- 기능을 핵심 비즈니스 로직과 공통 모듈로 구분하고 핵심 로직에 영향을 미치지 않고 효과적으로 잘 끼워넣도록 하는 방법
- 공통 모듈(보안 인증, 로깅 같은 요소 등)을 만든 후에 이것을 코드 밖에서 비즈니스 로직에 삽입하는 것
- AOP가 사용되는 곳
- 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
1 2 | <context:component-scan base-package="test.service"/> <context:component-scan base-package="test.aspect"/> | cs |
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.
- Service annotation등록
2.
- AOP 임을 알리는 annotation과 Bean임을 알리는 Component 등록
- write로 시작하는 메소드가 실행되기 전에 "펜을 준비해서 뚜껑을 열어요"라는 콘솔을 출력
3.
- init.xml
4.
- main클래스
- 출력하면 아래와 같은 결과가 나온다.
- WritingAspect에서 write*(*) 가 해당되는 것은 service.writeToTeacher("김구라") 메소드 뿐이라서!