본문 바로가기
Study_Framework

[Spring] JUnit4와 AspectJ 연동 예제

by 타블로 2008. 10. 20.
파일이름 : /WEB-INF/src/aspect/TestAspect.java
@Aspect
public class TestAspect {
    private static final Logger logger = Logger.getLogger(TestAspect.class);
  
    @Before("execution(* *..*add*(..))") 
    public void test(JoinPoint point) throws Throwable{
        logger.info("# 테스트로 실행해봅시다  #");   
    }
 
    @Around("execution(* *..modityMember(..))")
    public void test2(ProceedingJoinPoint point) throws Throwable{ 
  
        logger.info("# 모든 수정을 이것을 실행한다!!!#"); 
        point.proceed();
        logger.info("# 모든 수정을 이것을 실행한다!!!#");
  
    } 
 
}

특정 메소드에 적용할 Aspect 소스 파일입니다.

예제로써 2가지(Before와 Around)를 작성해보았습니다.

@Before는 패키지에 상관없이 add가 포함되는 모든 메소드에 적용됩니다.

@Around는 패키지에 상관없이 modifyMember로 끝나는 모든 메소드에 적용됩니다.

파일이름 : /WEB-INF/src/dao/MemberDAOImpl.java
public class MemberDAOImpl extends JdbcDaoSupport implements MemberDAO {

    private static final Logger logger = Logger.getLogger(MemberDAOImpl.class);
 
    private DataSource dataSource;
 
    public int addMember(MemberDTO memberDTO) throws DataAccessException{
  
        logger.info("## DAO Method Start ##\n");
  
        StringBuffer sql = new StringBuffer();
        List paramList = new ArrayList();
        int result = 0;
  
        sql.append(" INSERT INTO MEMBER   \n");
        sql.append(" VALUES(0,?,?)    \n");
  
        paramList.add(memberDTO.getMemeId());
        paramList.add(memberDTO.getMemPwd());
  
        result = getJdbcTemplate().update(sql.toString(),paramList.toArray());
  
        logger.info("## DAO Method End ##\n");
  
        return result;  
    }
 
    public int modityMember(MemberDTO memberDTO) throws DataAccessException{
        logger.info("## DAO Method Start ##\n");
  
        System.out.println("faffafds");
  
        logger.info("## DAO Method End ##\n");
        return 0; 
    }
}

이 부분은 따로 설명이 필요없는 단순한 DAO인터페이스를 구현한 구현체 클래스입니다.

파일이름 : /WEB-INF/config/applicationContext.xml
<!-- <beans> 부분 생량 -->
    <aop:aspectj-autoproxy />
      
    <bean id="memberDAO" class="dao.MemberDAOImpl" 
        p:dataSource-ref="dataSource" 
    />

    <bean id="testAspect" class="aspect.TestAspect" /> 

<aop:aspectj-autoproxy /> 태크를 작성하여 @Aspect 및 @Before , @Around를 자동으로
인식할 수 있게 했습니다.

그리고 적용될 MemberDAOImpl클래스와 적용할 Aspect를 빈으로 등록하였습니다.

파일이름 : /WEB-INF/src/test/ServiceTest.java

/*
@RunWith와  @ContextConfiguration은 생략
*/
public class ServiceTest extends Assert {
 
    @Autowired
    private MemberDAO memberDAO;
 
    @Test
    public void serviceTest(){
        MemberDTO memberDTO = new MemberDTO();
  
        memberDTO.setMemeId("test1");
        memberDTO.setMemPwd("test1");
  
        assertEquals(memberDAO.addMember(memberDTO), 1);
        assertEquals(memberDAO.modityMember(memberDTO), 0);
    }
}

실제 테스트 클래스입니다.

일단 @Autowired로 applicationContext.xml에 등록되어있는 빈객체를 자동으로 memberDAO에 삽입합니다.

그리고 serviceTest()에서는 그 memberDAO를 가지고 addMember와 modifyMember를 실행합니다.

그 결과는 아래와 같습니다.

[main] aspect.TestAspect (TestAspect.java:19)     - # 테스트로 실행해봅시다  #
[main] dao.MemberDAOImpl (MemberDAOImpl.java:25)     - ## DAO Method Start ##

[main] dao.MemberDAOImpl (MemberDAOImpl.java:39)     - ## DAO Method End ##
[main] aspect.TestAspect (TestAspect.java:25)     - # 모든 수정을 이것을 실행한다!!!#
[main] dao.MemberDAOImpl (MemberDAOImpl.java:47)     - ## DAO Method Start ##

faffafds
[main] dao.MemberDAOImpl (MemberDAOImpl.java:51)     - ## DAO Method End ##

[main] aspect.TestAspect (TestAspect.java:27)     - # 모든 수정을 이것을 실행한다!!!#

위와 같이 제대로 실행이 되었습니다._+

※ 주의사항 : 현재 스프링 2.5.5까지 확인해을 해 본 결과 JUnit4.4와는 테스트가 잘 되지만 JUnit4.5과의
                   테스트에서는 @Around가 자꾸 에러가 난다. 계속 찾아본 결과 스프링의 특정 클래스의
                   메소드에서 JUnit의 특정 클래스를 사용하는데 JUnit4.5로 넘어오면서 특정 클래스가 다른
                   패키지로 이동하는 바람에 계속 오류가 난다. 그러므로 차기 버전이 나오기 전까진
                   JUnit4.4로 테스트를 해야겠다. (현재 2008년 10월 20일)


참고자료 :
1. 웹개발자를 위한 스프링 2.5 프로그래밍 / 저자 최범균