오늘은 Spring Batch의 약간 심화 과정을 알아보자.
현재 본인은 회사 업무에서 Spring Batch를 개발하여 운영 업무를 담당하고 있다.
맨땅에 Spring Batch 시리즈로 공부하여 개발했다.
https://thecardeveloper.tistory.com/33
맨땅에 Spring Batch - 설정
그럼 이제 정말 Spring Batch를 코드에 적용해 보자 우선 언제나 가장 서터레서인 설정이다. 잘 한번 해보자고 본인의 서비스는 gradle 프로젝트이다. gradle 의존성을 추가 해준다. gradle 새로고침 한번
thecardeveloper.tistory.com
우선 만들어 내는 걸 중점으로 후다닥 개발을 하다 보니 개발하면서 놓친 것이 많은 거 같다.
이제는 한 번 되돌아볼 수 있는 시점인 거 같아 이것저것 Refactoring을 해보려 한다.
그렇게 Batch를 조금 더 알아보던 중 알게 된 것이
Batch Process는 우선적으로 대용량 데이터를 처리하는 Process이기 때문에 성능 최적화가 중요하다는 것이다.
그리고 Batch Process에서 가장 메모리 사용이 많은 곳이 대부분 Reader라고 한다.
간단한 Batch 작업으로 예를 들어보자.
회원의 주문/결제 내역을 불러와 월별 회원 결제 통계를 남기는 Batch 작업이 있다.
그렇다면 위 작업은 이런 식으로 만들어질 거 같다.
1. Reader에서 회원의 월별 주문 중에 결제가 완료된 내역을 SELECT한다.
2. Processor에서 결제 금액을 SUM한다.
3. Writer로 통계 TABLE에 INSERT한다.
물론 Reader에서 SUM을 해서 가져오고 Processor를 사용하지 않고 Writer로 Insert 할 수도 있겠다.
하지만 본인 생각에는 Reader를 무겁게 개발하는 것은 Batch 최적화에 맞지 않는 개발인 거 같다.
만약에 우리 서비스에 회원이 100,000명이 있다고 치자
그럼 1 회원 당 1 주문을 했다고 해도 100,000건의 주문 데이터가 있고 결제 데이터 또한 100,000건 이상이 생기게 된다.
회원, 주문, 결제 데이터만 300,000건 이상이다.
그럼 Reader에서 회원, 주문, 결제 table join도 해야 하고 각각 sql 마다 SUM을 하고 당연히 기본적인 where 조건들도 들어갈 것이고,,,
이렇게 Sql에서 너무 많은 일들을 하게 되는 것이다.
(사실,,,300,000건 생각보다 Batch에선 그렇게 많은 데이터 양도 아니다)
그럼 Reader에서 실행하는 SQL만 가볍게 하면 대용량 데이터 처리에 문제가 없느냐
그것도 아니다.
우리들이 흔히 사용하는 Database (MySQL, MSSQL, PostgreSQL, Maria db ,,,)는 기본적으로 제공하는 Paging 방법이 있다.
거기서 빠지지 않고 등장하는 녀석이 offSet이란 녀석이다.
Database마다 다르긴 하지만 어찌 됐든 offSet이란 녀석이 커질수록 해당 SQL은 많은 메모리를 사용하게 되고 성능이 떨어지게 된다.
MySQL을 예시로 들면
300,000건의 데이터 중에 299,000번부터 100개의 data를 가져오려면
SELECT *
FROM 테이블
ORDER BY COLUME
LIMIT 100
OFFSET 299000;
위와 같은 SQL이 나가게 되는데
MySQL에서 LIMIT OFFSET 방식은 일단 무조건 299,000번째 까지 데이터를 읽어서 299,000번째의 데이터를 찾아야 한다.
따라서 우리 생각엔 그냥 299,000번째부터 100개 가져오면 되는 거 아니야?라고 생각할 수 있지만 실제론 그렇지 않다는 것이다.
현재 Spring Batch에서 제공하는 대용량 데이터 Reader(JpaPaginItemReader, RepositoryItemReader) 들을 살펴본 결과 모두 LIMIT OFFSET을 사용하는 것으로 확인되었다.
그럼 어떤 걸 사용해야 하나!!!!!
없다.
그럼 어떻게 해야 하나!!!!!!!!!!!!!!
직접 만들어보자.
다음 편에서.
'Web > Spring' 카테고리의 다른 글
[Spring Batch] Batch Performance 성능 향상 (CustomItemReader) (1) | 2024.05.21 |
---|---|
[Spring] 파일 업로드/다운로드 (다운로드) (0) | 2024.04.08 |
[Spring] 파일 업로드/다운로드 (업로드) (0) | 2024.04.08 |
Spring Open Feign 녀석을 만났다. (0) | 2024.03.04 |
맨땅에 Spring Batch - 회원 복제 (0) | 2024.01.16 |