-
SpringBatch Cursor 기반 vs Paging 기반프로젝트/스프링 배치 튜토리얼 2023. 2. 7. 00:01728x90
개요
SpringBatch의 ItemReader에 Cursor기반, Paging 기반이 존재한다는 것을 알게 되었습니다.
각각은 어떤 것인지 찾아보고 더 적합한 것을 적용해보고자 합니다.
Spring Batch의 ItemReader
Spring Batch의 Chunk Tasklet은 아래와 같은 과정을 통해 진행됩니다.
Spring Batch의 ItemReader는 데이터를 읽어들입니다.
꼭 DB의 데이터만을 이야기하는 것은 아니며 File, XML, JSON 등 다른 데이터 소스를 배치 처리의 입력으로 사용할 수 있습니다.
보통 Spring Batch에서 쓰이는 itemReader로서 가장 대표적인 구현체로 JdbcPagingItemReader가 있습니다.
해당 클래스의 계층 구조는 다음과 같습니다.
보통 개발자가 ItemReader와 ItemStream 인터페이스를 직접 구현해서 원하는 형태의 ItemReader를 만드는 일은 거의 없습니다.
대부분의 데이터 형태는 ItemReader로 이미 제공되고 있습니다.
단, 조회 프레임워크가 QueryDSL, Jooq라면 직접 구현해야 할 수도 있습니다.
Spring Batch의 대표적 Reader들
Spring Batch는 대표적으로 2개의 Reader 타입을 지원합니다.
Cursor 형식
Database와 커넥션을 맺은 후 데이터를 Streaming 해서 보냅니다.
그리고 Cursor를 한 칸씩 옮기면서 데이터를 가져옵니다.
하나의 Connection으로 Batch가 끝날 때까지 사용되기 때문에 Batch가 끝나기 전에 Database와 애플리케이션의 Connection이 먼저 끊어질 수 있어서 위험합니다.
모든 데이터를 메모리에 저장하기 때문에 메모리 사용량이 많습니다.
Paging
반면 Paging은 좀 더 많은 작업이 필요로 합니다.
Paging 개념은 페이지라는 Chunk로 Database에서 데이터를 검색합니다.
즉, 페이지 단위로 데이터를 한 번에 조회해오는 방식입니다.
페이지 단위로 DB Connection을 맺기 때문에 연결 시간이 상대적으로 적은 편입니다.
페이징 단위의 결과만 메모리에 저장하기 때문에 상대적으로 메모리 사용량이 적습니다.
주의사항으로 Paging을 사용할 것이라면 데이터가 정렬이 되어있어야 합니다.
Cursor와 Paging 기반의 동작 방식
위에서도 설명하였지만 더 빠른 이해를 위해 그림을 기반으로 보겠습니다.
Cursor는 특정한 데이터를 다 불러올 때까지 DB Connection이 위처럼 연결됩니다.
Paging은 특정 페이지의 페이지 사이즈만큼의 데이터를 읽어 온 다음 가지고 온 데이터를 한 개씩 읽는 형태로 되어 있습니다.
여러 번 DB 트랜잭션을 타야 하는 단점이 있지만, DB Connection Time과 한 번에 사용해야 하는 최대 메모리 용량이 적을 가능성이 큽니다.
결론
DB Connection 시간과 메모리를 고려했을 때는 Paging 방법이 더 좋아 보입니다.
하지만 Connection시간과 메모리를 커버할 수 있다면 Cursor방식이 더 빠르게 가능할 수 있습니다.
또한 Cursor방식에서 한 번에 가져오는 데이터 양이 많은 경우 Batch가 뻗어버립니다.
또한 Cursor는 Thread Safe 하지 않습니다.
Multi Thread로 Batch를 구현해야 하는 상황이라면 PagingItemReader를 사용해야 합니다.
하지만 Cursor의 성능 자체가 뛰어나기 때문에 대량의 데이터가 아니고, 멀티스레드 환경이 아닌 곳에서는 CursorItemReader를 사용하는 것도 좋아 보입니다.
만약 멀티쓰레드를 Step에서 사용하고 싶다면 TaskExecutor를 사용하면 됩니다.
참고자료
https://jojoldu.tistory.com/336
https://ojt90902.tistory.com/780
'프로젝트 > 스프링 배치 튜토리얼' 카테고리의 다른 글
Spring Batch 데이터베이스와 함께 사용하기 (0) 2023.10.11 Spring Batch 프로젝트 생성하기 - Spring Boot 3.1 (0) 2023.10.09 JobParameters Intellij 환경 변수 설정 (0) 2023.02.14 Spring Batch 프로젝트 생성하기 - Spring Boot 2.7.5 (0) 2023.02.05 Spring Batch란? (0) 2023.02.04