Spring Batch 테스트 환경 OOM 장애 해결, 메모리 성능 개선

Spring Batch 테스트 환경 OOM 장애 해결, 메모리 성능 개선

업무 유형
기술부채
[기여도]
  • 백엔드 개발자(본인)
[문제]
테스트 실패로 인한 배포 지연
  • Spring Batch 프로젝트의 테스트코드 양이 증가하며, OOM 문제로 인해, 테스트가 50분이 넘도록 돌아가지 않고 실패
[어려웠던 점과 극복 방법]
  1. 테스트 환경의 복잡성
    1. Spring Batch는 Writer/Reader/Processor 활용한 대규모 데이터 처리와 @SpringBatchTest를 활용한 Job Test로 인해 Application Context 설정이 복잡했고 이는 테스트 시 불필요한 의존성까지 로드하게 만드는 주요 원인이었음
      → Spring Batch의 동작 원리 학습
      • Spring Batch 공식 문서와 기존 코드 분석을 통해 BatchJob, Step, Tasklet 간의 관계 및 실행 흐름을 파악
      • Application Context의 캐싱 원리 및 의존성 주입 방식에 대해 추가 학습
      → 코드 분석 및 불필요한 의존성 파악
      • 테스트 실행 시 메모리 사용량과 성능 저하를 유발하는 불필요한 빈 및 의존성을 추적
      • Mock 객체를 사용해 테스트가 꼭 필요한 로직만 실행되도록 수정
  1. 테스트 전략이 통일되지 않아 과도한 통합 테스트와 중복 설정
    1. 일부 테스트는 단위 테스트로 작성되어야 할 부분에서도 과도하게 통합 테스트를 수행함
      → 코드리뷰 및 사내 전파
      • 테스트 최적화 작업 후, 이를 팀원들에게 가이드로 작성하여 전파
      • 코드 리뷰 → 표준화된 테스트 전략이 유지되도록 피드백 제공
[해결방안]
Spring Batch 테스트 코드 최적화
  • Application Context 캐싱이 제대로 되지 않아 테스트 성능 저하 → 캐싱 활용
    • Mock 객체 전략 부재로 Context 캐싱 방해 → 제거
  • 불필요한 의존성 주입으로 전체 컨텍스트를 로드하는 비효율적인 테스트 구성 → 필요한 의존성만 주입
    • Tasklet, Repository 단위 테스트에서 과도한 설정 사용 → 필요한 의존성만 주입
  • 중복 어노테이션 사용으로 인한 리소스 낭비 → 제거
[결과]
notion image
개선되기 전 Heap Memory 사용량
notion image
개선 이후 Heap Memory 사용량
Heap Memory 사용량 45% 절감 (750MB → 412MB), 테스트코드 실행 속도 90% 개선
[활용기술]
  • Kotlin, Spring Batch, Junit5, Kotest, JPA, QueryDSL
 
Built with Potion.so