전자정부표준프레임워크 Business 템플릿에서 Controller에 AOP를 적용해 보겠습니다.
1. 컨트롤러에 적용될 테스트 클래스입니다.
package com.tistory.pentode.log;
public class TestAspect {
public void callFromController() {
System.out.println("컨트롤러에 적용된 Aspect 입니다.");
}
}
2. context-aspect.xml 파일과 context-syslogaop.xml 파일에 예외 처리 및 로그를 남기기 위한 AOP가 적용되어 있습니다. 하지만, 여기서는 컨트롤러에 대한 AOP 를 추가하더라도 동작하지 않습니다. 루트 컨텍스트에서는 서비스와 DAO 객체만 로딩하고, 컨트롤러 객체는 없기 때문입니다. 컨트롤러에 대한 AOP는 웹 컨텍스트에서 설정해야 합니다.
3. /WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml 파일에 AOP 설정을 추가합니다.
- 먼저 aop 네임 스페이스 정의를 추가합니다.
<?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"
...
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
- 빈 설정 및 AOP 설정을 추가합니다. 로그인시 호출되도록 설정해 봤습니다.
<bean id="testAspect" class="com.tistory.pentode.log.TestAspect" /> <aop:config> <aop:aspect id="controllerAspect" ref="testAspect"> <aop:before pointcut="execution(public * egovframework.let.uat.uia.web.EgovLoginController.actionSecurityLogin(..))" method="callFromController" /> </aop:aspect> </aop:config>
- 에러가 발생합니다. 찾지 못하는 클래스가 있습니다.
java.lang.NoClassDefFoundError: org/springframework/cglib/transform/impl/MemorySafeUndeclaredThrowableStrategy
4. 이 에러는 전자정부표준프레임워크에서 spring-aop의 버전이 충돌하여 발생합니다.
egovframework.rte.fdl.property 3.6.0에서는 spring-web 4.1.2.RELEASE를 사용하는데 여기에서 spring-aop 4.1.2.RELEASE를 사용합니다. egovframework.rte.fdl.security 3.6.0에서는 spring-security-core 3.2.4.RELEASE를 사용하는데 여기서는 spring-aop 3.2.8.RELEASE 사용하고 있습니다.
두 spring-aop 버전의 충돌로 인해 최종적으로는 spring-aop 3.2.8.RELEASE가 사용되고 있습니다. pom.xml 파일의 Dependency Hierarchy 에서 확인할 수 있습니다.
3.2.8 버전에서는 포인트컷을 컨트롤러에 위빙하기 위해서 cglib의 proxy를 사용합니다. 앞의 에러에서 나오는 찾지 못한 클래스입니다. 이것은 spring-core에 포함되어 있습니다. 전자정부표준프레임워크 3.6.0 에서는 spring-core 4.1.2.RELEASE를 사용하는데 spring-core 4.0 버전부터는 cglib 가 빠졌습니다.
그럼 방법은 spring-core의 버전을 내리던가 spring-aop의 버전을 올리는 방법인데, 전자정부표준프레임웍은 건드릴수가 없으니까 spring-aop 4.1.2.RELEASE를 pom.xml 파일에 추가해서 해결합니다.
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
Tomcat을 재시작하고 로그인 해보면 컨트롤러에 AOP 가 적용된것을 확인할 수 있습니다.
'프로그래밍 > 스프링프레임워크' 카테고리의 다른 글
스프링프레임웍 다국어 메세지 프로퍼티 파일에 한글 바로쓰기 (0) | 2018.04.20 |
---|---|
전자정부표준프레임워크 Spring Security 사용시 로그인한 사용자정보에 추가정보 넣기 (0) | 2018.04.20 |
CKEditor 한글 파일명 이미지 업로드 에러(Spring Framework) (0) | 2018.04.20 |
Srping Security 권한 직접 체크하기(시큐리티 태그와 인증 클래스) (0) | 2018.04.20 |
CKEditor 이미지 업로드에 Spring Security CSRF 토큰 적용하기 (2) | 2018.04.20 |