Skip to content

Conversation

@vumrra
Copy link
Contributor

@vumrra vumrra commented Jun 17, 2025

개요

정산 기능에 사용되는 Spring Batch를 개선했습니다.

본문

  • IteamReader -> IteamProcessor -> ItemWriter 구조에서, 기존에 단건으로 처리하는 ItemProcessor 레이어를 삭제하고 ItemWriter에서 일괄처리 하도록 구조를 개선했습니다.
  • IteamReader, IteamWriter 등 배치 처리에 JPA를 사용하지 않도록 하였습니다. (예측할 수 없는 쿼리, 영속성 컨텍스트 관리 비용)
  • 기존에는 IteamReader 단계에서 JpaPagingItemReader를 사용하여 offset-limit 쿼리로 청크 사이즈대로 페이징 쿼리를 사용했습니다.
    • 하지만 mysql 에서는 order by 정렬 비용과 offset 사이즈가 커진다면, 쿼리 성능이 크게 저하됩니다.
    • 이러한 구조를 JdbcCursorItemReader 를 사용하여 커서 방식으로 조회하도록 개선했습니다.
  • ItemWriter에서 Reader에서 조회해온 청크들을 순회하여 일괄 처리하고, JdbcBatchItemWriter 를 사용하여 Batch Insert 하였습니다.
    • 추후 DSL로 쿼리를 다루는 구조가 더 안정적이라 판단하여, Exposed의 DSL, Batch Insert 기능을 사용하여 개선했습니다.

성능 비교

chunk size: 1000, 처리되는 rows: 100만개

  • 기존: 30분 50초 / 개선 후: 1분 내외
  • 성능이 약 30배 향상되었습니다.
스크린샷 2025-06-17 14 55 30 스크린샷 2025-06-17 14 56 03

@vumrra vumrra requested a review from Umjiseung June 17, 2025 05:59
@vumrra vumrra self-assigned this Jun 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants