Spring Batch : DB ItemReader, Cursor / Paging

    이 글은 인프런 정수원님의 강의를 복습하며 정리한 글입니다. 

    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가 된다.

    댓글

    Designed by JB FACTORY