회고

20200624 회고 - 배치 프로세스 및 데이터베이스

JeongHyeongKim 2020. 7. 28. 02:39

1. 상황

휴면회원에 대한 기록을 쌓는 배치 프로세스에 대하여 쿼리를 작성 중이었다. 프로세스 흐름도는 다음과 같다.

 

 

2. 문제점

    - 연관성이 없는 각 select에 대해 단일 스레드를 통해서 순차적으로 쿼리를 실행하였기 때문에, 현재 상황보다 더 많은 테이블에 대해 작 

       업을 할 경우, 많은 시간이 소모된다.

    - @Transactional이 동작하는 사이클에 대해서 제대로 알고 쓰지 못하였기 때문에, rollback이 제대로 되지 않고 있다.

    - Spring Boot Batch Starter가 있음에도 불구하고 일반 절차 함수를 작성하듯이 프로그램을 작성하였다.

    - 후에 내가 작성한 프레임워크에 다른 배치 프로세스가 추가적으로 작성하는 것을 잘 몰랐기 때문에, 확장성이 덜 고려된 공통 코드를            작성하였다.

    - 작성한 프레임워크는 jar파일로 build되어 

   

 

 

 

3. 개선(해야할)점

    - 상호 관련이 없고, 연계성이 없는 쿼리의 경우는 단일 스레드에서 작업하지 않고, 복수개의 스레드에서 작업하여 속도를 향상시킨다.

    - 자체 코드 리뷰 결과, @Transactional을 사용한 @Service 내부의 method에서 catch문에서 exception을 던지고 있지 않기 때문에, 

       Spring에서는 exception을 감지하지 못하고, rollback를 시키지 않는 점이 발견되었다. 각 catch 문에 대해서 마지막에 exception을

       던져서 rollback이 가능하게 한다.

    - AOP에서 배치프로세스에 대한 로그를 작성할 때, @Transactional 어노테이션 걸린 서비스에 대해 동작하도록 되어있는데, 이를 조금 

      더 적절한 방법으로 대체할 수 있으면 대체를 하는 것이 좋다.

    - 불필요하게 Embadded Tomcat과 서버가 실행되는 것을 disable하여 jar 파일이 실행되기 전 준비단계를 줄였다.

    - JVM이 running 되기 전 단계에서 프로세스를 처리하도록 ApplicationListener를 이용하여 ContextRefreshedEvent에 대해 핸들링   

       하였다. 그러나, ContextRefreshedEvent의 경우는 Context가 바뀌는 상황마다 ApplicationListener가 호출되므로, spring이 시작할 

       때, 단발성으로 호출되도록 ApplicationStartingEvent같은 것을 사용하는 것이 더 좋을 듯하다.

    - 실행파일 형태로 cron에 걸수 있도록 설계하라하여 지금 상황과 같이 설계하였다. 그러나, 현행방법과 데몬이 계속 떠있는 방식 중 어   

       떤것이 더 효율적일까를 따져봐야 할 것이다.

'회고' 카테고리의 다른 글

2019 회고  (1) 2020.02.01
20191126 회고 - 프로그래밍 패턴  (0) 2019.11.26