우리가 구현해야 할 것은 데이터 삽입 중 에러가 났을 때 해당 데이터만 제외하고 삽입이 되어야하는 것이였다.
그래서 배치 구현 시
1. Tasklet으로 한방에 Select 해와서 Transaction을 분리해서 처리하는 방법
2. Chunk를 이용해 페이징해서 Chunk 단위로 Transaction을 분리하는 방법에 대한 고민을 하였다.
1의 방법을 시도하면 Select 는 1번이지만 모든 Insert에 대하여 Transaction이 발생되기 때문에 Overhead가 발생할 가능성이 있고 성능상 부담이 많아지기 때문에 별로 좋은 것 같진 않았다.
2의 방법은 Chunk 방식일 경우 나는 처음에 Chunk를 이용했을 때 하나의 Chunk가 실행되다가 에러가 발생하면 모든 데이터가 롤백되는 것인 줄 알았다.
하지만 Retry, Skip으로 인해 다시 실행하면서 문제가 되었던 데이터를 제외하고 커밋이 되는 것을 오늘 테스트를 해보면서 알게 되었다.
그렇기 때문에 OFFSET #{_skiprows} ROWS FETCH NEXT {_pagesize} ROWS ONLY
를 SQL에 추가함으로써 페이징을 줘서 Chunk 방식으로 처리하는 것으로 정리하였다!
Skip에 대한 참고용 링크 : https://ojt90902.tistory.com/802