이 글은 인프런 정수원님의 강의를 복습하며 정리한 글입니다.
DB ItermReader
배치 프로세스는 기본적으로 실시간으로 처리하기 어려울만큼의 방대한 데이터를 다룬다. 따라서 메모리의 효율성, 동작 시간등을 고려해야한다. 스프링 배치는 이에 대응하기 위해 크게 두 가지 방식의 ItemReader의 대응방식을 제공해준다.
Cursor / Paging
Cursor 형식
- 현재 cursor가 가리키는 곳의 데이터를 읽고, Cursor는 다음 데이터를 가리킨다.
- ResultSet이 Open 될 때 마다 next() 메서드가 호출되어 DB의 데이터가 반환되고, 객체와 맵핑이 이루어진다.
- DB Connection은 배치 처리가 완료될 때까지 데이터를 읽어오기 때문에 DB 연결시간이 길다.
- 모든 데이터를 메모리에 저장하기 때문에 메모리 사용량이 많다.
- Connection 시간과 메모리를 충분히 감당할 수 있다면 대용량 데이터 처리에 적합하다(Fetch Size로 조절)
Paging
- 페이징 단위로 데이터를 조회한다. 특정 페이지의 Page Size만큼 한번에 메모리로 가져온 다음 한 개씩 읽는다.
- 페이지 단위로 DB Connection을 읽고 종료한다. 따라서 DB Connection 연결 시간이 상대적으로 적은 편이다.
- 페이징 단위의 결과만 메모리에 저장하기 때문에 상대적으로 메모리 사용량이 적다.
- 따라서 Connection 시간이 짧아야 하고, 메모리가 작은 환경의 데이터 처리에 적합하다.
Cursor / Paging 기반의 동작방식 확인
Cursor는 특정한 데이터를 다 불러올 때까지 DB Connection이 위처럼 연결된다. 그리고 현재 가리키는 Cursor의 데이터를 반환해주고, 다음 Cursor를 가리키는 형식으로 동작한다. 왼쪽 그림이 Cursor 기반의 ItemReader의 동작방식을 의미하는데 Item을 1개씩 가져오는 것을 볼 수 있다. 이 때, Fetch Size는 1로 설정되어있는데, FetchSize를 좀 더 적게 설정하면서 빠르게 동작할 수 있도록 할 수 있다.
Paging은 특정 페이지의 페이지 사이즈만큼의 데이터를 한번에 DB에서 가지고 온 다음, 가지고 온 데이터를 한 개씩 읽는 형태로 되어있다. 따라서 여러 번 DB 트랜잭션을 타야하는 단점이 있지만, DB Connection Time과 한번에 사용해야 하는 최대 메모리 용량이 적을 가능성이 크다.
위의 예시를 볼 때, Cursor는 DB Connection 한번에 처리가 가능하다. 반대로 Paging은 DB Connection 두번에 처리가 가능하다. 이 때, Fetch Size는 1이고, Page Size는 4가 된다.
'Spring > Spring Batch' 카테고리의 다른 글
Spring Batch : Step 도메인 이해 (0) | 2022.03.09 |
---|---|
Spring Batch : Job 도메인 이해 (0) | 2022.03.09 |
Spring Batch : ChunkOrientedTaskletStep 순서도 (0) | 2022.03.09 |
Spring Batch : ItemReader / ItemProcessor / ItemWriter / ItemStream (0) | 2022.03.09 |
Spring Batch : ChunkOrientedTaskLet, ChunkProvider, ChunkProcessor (0) | 2022.03.08 |