2013년 10월 27일 일요일

[Spring AOP, Advice, Aspect]스프링3.X 게시판(Spring AOP적용, DAO단 DML문 실행시 로깅, 스프링 충고 spring advice)

[Spring AOP, Advice, Aspect]스프링3.X 게시판(Spring AOP적용, DAO단 DML문 실행시 로깅, 스프링 충고 spring advice)

Spring Framework3.2 게시판 2단계 : 지금까지 구현한 게시판의 기본 기능에 Spring AOP를 적용하여 충고(Advice)를 적용하자.

onj.board.dao.SpringBoardDAO.java의 insert, update, delete등 DML문장 실행시 로그를 남기기 위해 ...

1. 로깅을 위해 Oracle Table 만들자.

SQL> create table boardlog (
          methof varchar2(50),
   sql varchar2(1000),
   ilsi date);
 
2. Spring AOP용 Aspect(Pointcut + advice)를 만들자.(LogginAspect.java)
 
package onj.board.aop;
 
import onj.board.dao.BoardDAO;
import onj.board.dao.LoggingDAO;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
@Aspect
public class LoggingAspect {
 @Autowired
 private LoggingDAO loggingDAO;
 
 @Autowired
 private BoardDAO boardDAO;
 // 사후충고(반드시 정상 리턴 후 호출)
 // SpringBoardDAO의 모든메소드중 파라미터가 1개 있는 메소드가 충고받을 포인트컷
 // 본 게시판에는 리스트보기와 , getSql() 만 메소드 파라미터가 없어 충고 적용 안됨
 @AfterReturning(pointcut="execution(* onj.board.dao.SpringBoardDAO.*(*))", returning="result")
 public void logAfterReturning(JoinPoint joinPoint) {
System.out.println("<<<<<<<<< DAO 로깅 충고 실행");  
  loggingDAO.writeLog(joinPoint.getSignature().getName(), boardDAO.getSql());  
 }
}

3. 로그를 DB에 넣을 DAO단 클래스 제작. LoggingDAO.java

package onj.board.dao;
 
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component("loggingDAO")
public class LoggingDAO {
 private JdbcTemplate jdbcTemplate;
 @Autowired
 private DataSource dataSource;
 public JdbcTemplate getTemplate() {
  if (jdbcTemplate == null) {
   this.jdbcTemplate = new JdbcTemplate(dataSource);
  }
  return jdbcTemplate;
 }
 // DAO단 쿼리 로깅
 public int writeLog(String mehtodName, String dml)
   throws DataAccessException {
  //로그용 테이블에 로그 저장
  String sql = "insert into boardlog(method, sql, ilsi) values (? , ? ,sysdate) ";
  
  Object[] obj = { mehtodName, dml };
  return getTemplate().update(sql, obj);
 }
}
 

4. boardConfig.xml에 aspect 추가
 <aop:aspectj-autoproxy/>
 <context:component-scan base-package="onj.board.dao"/>
 <context:component-scan base-package="onj.board.service"/> 
 
 <bean id="myLogger" class="onj.board.aop.LoggingAspect" />
 
</beans> 

5. [결과확인]
 
10월 09, 2013 2:13:52 오후 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
10월 09, 2013 2:13:52 오후 org.apache.catalina.startup.Catalina start
INFO: Server startup in 3491 ms
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행
<<<<<<<<< DAO 로깅 충고 실행

boardlog 테이블을 select 해보라!!

댓글 없음:

댓글 쓰기