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 |