====== 실행환경 AOP 가이드라인 ====== ===== 개요 ===== 전자정부 실행환경은 XML Schema에 기반한 AOP 방법을 사용하며, 예외처리와 트랜잭션 처리에 적용하였다. XML Schema에 기반한 AOP 방법은 @AspectJ Annotation 기반 방법에 비해 횡단 관심사에 대한 설정관계를 파악하기 유리하다. ===== 설명 ===== ==== 예외 처리 ==== 실행환경은 DAO에서 발생한 Exception을 받아 Service단에서 처리할 수 있다. 실행환경에서 추가로 제공하는 Exception은 다음과 같다. * EgovBizException: 업무에서 Checked Exception인 경우에 공통으로 사용하는 Exception이다. 개발자가 특정한 오류에 대해서 throw하여 특정 메시지를 전달하고자 하는 경우에는 processException() 메소드를 이용하도록 한다. * ExceptionTransfer: AOP 기능을 이용하여 ServiceImpl 클래스에서 Exception이 발생한 경우(after-throwing인 경우)에 trace()메소드에서 처리한다. 내부적으로 EgovBizException인지 RuntimeException(ex.DataAccessException)인지 구분하여 throw한다. ExceptionTransfer는 내부적으로 DefaultExceptionHandleManager 클래스에 의해서 정의된 패턴에 대해서 Handler에 의해서 동작한다. === 관점(Aspect) 정의 === 예외 처리를 위한 Spring 설정 파일(resources/egovframework.spring/context-aspect.xml) 내에 관점(Aspect) 클래스를 빈으로 정의한 뒤, 해당 관점(Aspect)에 대한 포인트컷과 충고(Advice)를 정의한다. ... ... ExceptionTransfer는 egovframework.rte.sample.service 패키지 내에 속한 모든 클래스 중 클래스명이 Impl로 끝나는 클래스의 메소드 실행시 발생한 예외를 처리하는 역할을 수행한다. === 충고(Advice) 정의 === 충고(Advice)로 정의된 ExceptionTransfer 클래스는 실행환경 소스코드에 포함되어 있다. ExceptionTransfer 클래스는 예외가 발생된 경우 내부적으로 예외처리 설정 파일에 명시된 ExceptionHandler를 호출하는 기능을 한다. ExceptionTransfer 클래스의 코드 일부는 다음과 같다. public class ExceptionTransfer { ... public void transfer(JoinPoint thisJoinPoint, Exception exception) throws Exception { log.debug("execute ExceptionTransfer.transfer "); Class clazz = thisJoinPoint.getTarget().getClass(); Locale locale = LocaleContextHolder.getLocale(); // BizException 인 경우는 이미 메시지 처리 되었음. 로그만 기록 if (exception instanceof EgovBizException) { log.debug("Exception case :: EgovBizException "); EgovBizException be = (EgovBizException) exception; getLog(clazz).error(be.getMessage(), be.getCause()); // Exception Handler 에 발생된 Package 와 Exception 설정. processHandling(clazz, exception, pm, exceptionHandlerServices, false); throw be; } else if (exception instanceof RuntimeException) { log.debug("RuntimeException case :: RuntimeException "); RuntimeException be = (RuntimeException) exception; getLog(clazz).error(be.getMessage(), be.getCause()); // Exception Handler 에 발생된 Package 와 Exception 설정. processHandling(clazz, exception, pm, exceptionHandlerServices, true); if (be instanceof DataAccessException) { log.debug("RuntimeException case :: DataAccessException "); DataAccessException sqlEx = (DataAccessException) be; // throw processException(clazz, "fail.data.sql", // new String[] { // Integer.toString(((SQLException) sqlEx // .getCause()).getErrorCode()), // ((SQLException) sqlEx.getCause()) // .getLocalizedMessage() }, sqlEx, locale); throw sqlEx; } throw be; } else if (exception instanceof FdlException) { log.debug("FdlException case :: FdlException "); FdlException fe = (FdlException) exception; getLog(clazz).error(fe.getMessage(), fe.getCause()); throw fe; } else { log.debug("case :: Exception "); getLog(clazz).error(exception.getMessage(), exception.getCause()); throw processException(clazz, "fail.common.msg", new String[] {}, exception, locale); } } } ==== 트랜잭션 처리 ==== 실행환경에서 트랜잭션 설정은 "resources/egovframework.spring/context-transaction.xml" 파일을 참조한다. 다음은 context-transaction.xml 설정 파일을 일부이다. * txAdvice는 메소드에서 예외 발생시 트랜잭션 롤백을 수행한다. * requiredTx는 egovframework.rte.sample 패키지 하위 impl 패키지에서 Impl로 끝나는 모든 클래스의 메소드를 포인트컷으로 지정한다. ===== 참고자료 ===== * [[eGovframework:RTE:BSL: Exception Handling|실행환경 Exception Handling 서비스]] * [[eGovframework:RTE:PSL:Transaction|실행환경 Transaction 서비스]]