1. 목적/배경
- 가끔 대용량 데이터 처리(예. DB에 100만건 insert values로 bulk insert할때) 부하 분산을 위해 적절한 데이터 사이즈로 분할하여 처리할 필요가 있음
(간단한 수학 계산인데 필요할때마다 다시 코딩하는게 번거롭고 헷갈려서 메모 목적으로 작성해둡니다.
2. 처리 방법
- 적절한 데이터 사이즈만큼 잘라서 loop처리
샘플 소스
/**
* N개의 데이터 리스트를 자르는 간단한 소스
* - 대용량 DB 저장 등의 기능 구현때 부하 분산 목적
*
* @param args
*/
public static void main(String[] args) {
//테스트 데이터 셋팅
int dataSize = 103;
ArrayList<Integer> dataList = new ArrayList<>(dataSize);
for (int i = 1; i <= dataSize; i++) {
dataList.add(i);
}
//처리 시작
final int dataCnt = dataList.size();
final int PER_CNT = 10; //1회 처리 건수
int fromIndex = 0;
int toIndex = 0;
boolean isNeedNextLoop = true;
int loopCompleteCnt = 0; //loop처리 완료된 횟수
do {
fromIndex = loopCompleteCnt * PER_CNT; //최초 시작은 0, 이후 PER_SAVE_CNT개 만큼씩 fromIndex는 증가
toIndex = fromIndex + PER_CNT; //from index에서 1회 최대 건수만큼까지 toIndex는 증가
if (toIndex >= dataCnt) { //증가한 toIndex가 데이터 전체 갯수보다 클때는 toIndex 값을 변경(마지막 loop에서는 데이터 element갯수가 1회 처리량보다 적거나 같음)
toIndex = dataCnt;
isNeedNextLoop = false;
}
//비즈니스 로직 작성
System.out.println(String.format("%s회 data subList: %s", loopCompleteCnt+1, dataList.subList(fromIndex, toIndex)));
loopCompleteCnt++;
} while (isNeedNextLoop);
}
샘플소스 결과
1회 data subList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2회 data subList: [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
3회 data subList: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
4회 data subList: [31, 32, 33, 34, 35, 36, 37, 38, 39, 40]
5회 data subList: [41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
6회 data subList: [51, 52, 53, 54, 55, 56, 57, 58, 59, 60]
7회 data subList: [61, 62, 63, 64, 65, 66, 67, 68, 69, 70]
8회 data subList: [71, 72, 73, 74, 75, 76, 77, 78, 79, 80]
9회 data subList: [81, 82, 83, 84, 85, 86, 87, 88, 89, 90]
10회 data subList: [91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
11회 data subList: [101, 102, 103]