본문 바로가기
프로그래밍/스프링프레임워크

전자정부표준프레임워크 Controller에 AOP 적용하기

by pentode 2018. 4. 20.

전자정부표준프레임워크 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 가 적용된것을 확인할 수 있습니다.

반응형