스프링 배치란?
실시간 데이터 처리가 아닌 대량의 데이터를 일괄적으로 한번에 처리하는 방식이다.
스프링 배치의 종류
배치는 메모리의 효율성, 동작 시간을 고려해야한다. 그리고 스프링에서는 두가지 방식의 ItemReader를 제공한다.
Cursor/Paging
Cursor
- 현재 cursor가 가리키는 곳의 데이터를 읽고, cursor는 다음 데이터를 가리킨다.
- 그러나 조회 된 모든 데이터를 메모리에 저장해야한다.
- 배치처리가 완료될떄까지 데이터를 읽어오기때문에 DB커넥션이 길다.
- 커넥션 시간과 메모리가 감당가능하다면 대용량 데이터를 fetchSize로 조절하며 빠르게 처리할 수 있다.
나와 같은 경우에는 120만건을 처리해야했고 조회건수가 1000건으로 제한되어있었다. 또한 120만건을 메모리에 모두 저장할 경우 서버에 과부하가 올수있기 때문에 cursor방식을 선택하지 않았다.
Paging
- 페이징 단위로 데이터를 조회하여 처리하는 방식이다. 나 같은 경우에는 pageSize만큼 한번에 메모리로 가져오고 프로세서에서 단건으로 처리후, pagesize만큼 일괄로 업데이트를 했다.
- 페이징 단위로 dbConnection을 읽고 종료하기 때문에 커넥션 시간이 상대적으로 적다. 또한 페이징 단위의 결과만큼만 메모리에 저장하기 때문에 메모리 사용량이 적다.
- 따라서 connection시간이 짧고, 메모리가 작은 환경의 데이터 처리에 적합하다. 여러번 db트랜잭션을 타야하는 단점이 있지만 한번에 사용해야하는 최대 메모리 용량이 작다.
실제 운영에서 최대 조회가능건수가 최대 1000었기 때문에 나는 900단위로 pagesize를 설정하고 batchwriter를 통해 chunk900으로 하여 900건씩 일괄 업데이트를 하였다. 그 결과 운영에서 계속 돌려도 서버에 무리가 가지 않게 실행할 수 있었다.
(나는 writer에서 read하는 테이블쪽을 update해야했기 때문에 pagesize와 chunksize를 맞췄다. update하면서 reader쪽 데이터 건수에 영향을 받기때문에,,, 실제로는 이럴경우 페이징 방식이 적합하지않다. 나는 reader조회조건에 걸리지 않는 방식으로 update하였기 때문에 가능했다. 그래서 limit {_skiprows},{pageSize}가 아닌 limit 0,{pageSize}로 함->조회조건에서는 status='L' 프로세서에서 처리 후에 status='S'또는 'O'로 업데이트)
https://ojt90902.tistory.com/780
Spring Batch : DB ItemReader, Cursor / Paging
이 글은 인프런 정수원님의 강의를 복습하며 정리한 글입니다. DB ItermReader 배치 프로세스는 기본적으로 실시간으로 처리하기 어려울만큼의 방대한 데이터를 다룬다. 따라서 메모리의 효율성,
ojt90902.tistory.com
'스프링' 카테고리의 다른 글
스프링, 스프링 부트 접미사 (0) | 2022.04.24 |
---|---|
Spring Annotation 정리 (0) | 2022.04.16 |
ORM과 JPA에 대하여 (0) | 2022.03.29 |
[카프카]카프카에 대하여 (0) | 2021.12.12 |
[스프링] IoC(Inversion of Control)와 DI(Dependency Injection) (0) | 2021.09.08 |