금융에 대한 모든 것

AOP 기능으로 실행되는 특정 메서드에 로그 처리를 해두면 좀 더 간편하게 로그를 수집할 수 있기 때문에 디버깅에 큰 도움이 됩니다. 로그 수집을 통해 해당 메서드가 언제 실행되었는지, 어떤 파라미터를 받았는지 쉽게 알 수 있기 때문입니다. 

 

실행되는 메서드의 이름, 파라미터 등에 접근하려면 jointPoint 인터페이스를 사용해야 합니다.

BoardAspect.java

import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
...

@Component
@Aspect
public class BoardAspect {
        
        private static final Logger logger = LoggerFactory.getLogger(BoardAspect.class);
    
        // spring01/모든 폴더/service/이름이 ~Serviceimpl로 끝나는 클래스에 적용 
        @Around("execution(* com.example.spring01.*.service.*ServiceImpl.*(..))")
        public Object logging(ProceedingJoinPoint jp) throws Throwable {
    
        // 메서드가 실행되기 전
        logger.info("메서드 명: " + jp.getSignature().getName() + " 시작");
        logger.info("파라미터: " + Arrays.toString(jp.getArgs()));
        
        // 메서드 실행
        Object result = jointPoint.proceed();
                
        // 메서드가 실행된 후
        logger.info("메서드 명: " + jp.getSignature().getName() + " 종료");
        return result;
     }

 AOP 기능은 execution 명시자를 통해 BoardService 인터페이스를 구현한 BoardServiceImpl 클래스의 메서드를 지정했습니다. 메서드가 실행되기 전에는 getName 메서드로 이름을 출력하고 getArgs() 메서드가 반환한 파라미터 배열을 toString으로 출력합니다. 그리고 메서드가 실행된 후에는 다시 메서드의 이름을 출력해 해당 메서드가 종료되었음을 출력합니다.

 

BoardVO

public class BoardVO {
        
    //프로퍼티 정의
    private int BoardId;
    private String BoardTitle;
            ...
    
    // getter, setter 설정
    public void setBoardId(int boardId) {
        this.BoardId = boardId;
    }
            ...
    
    @Override
    public String toString() {
        return "BoardVO [boardId=" + boardId + ", boardTitle=" + boardTitle + ", boardContent=" + boardContent
             + ", boardType=" + boardType + ", boardDate=" + boardDate + ", userId=" + userId + "]";
        }
}

메서드의 파라미터로 넘길 VO 객체 클래스입니다. 프로퍼티들을 정의하고 getter/setter 들을 정의한 후 프로퍼티 값들을 출력하기 위해 toString 메서드를 위와 같이 재정의합니다. 단축키 Alt + Shift + S를 누르고 Generate toString...을 클릭하면 자동으로 쉽게 만들 수 있습니다.

 

BoardController.java

@Controller
public clas BoardController {

    @Resource
    private BoardService boardService;

    @RequestMapping("/url")
    public String init(BoardVO boardVO) {
            // AOP가 적용된 selectBoardList 메서드
            List<BoardVO> homeList = homeService.selectBoardList(boardVO);
            
            return null;
    }
}

컨트롤러에서 AOP 기능이 적용된 selectBoardList 메서드를 호출합니다. 실행하고 콘솔 창을 확인해보면 수많은 로그들 중에 위에서 정의한 로그가 출력한 것을 확인할 수 있습니다.

 

결과

14:42:03.438 [http-nio-8079-exec-1] INFO com.example.project.aop.LogAspect - selectBoardList 시작
14:42:03.456 [http-nio-8079-exec-1] INFO com.example.project.aop.LogAspect - 파라미터: [BoardVO [boardId=0, boardTitle=null, boardContent=null, boardType=null, boardDate=null, userId=null]]
반응형