Spring Batch 프로젝트 고도화 (1)

프로젝트 리펙터링 및 고도화를 도전!

프로젝트를 시작한 동기는 아무래도 포트폴리오가 미흡해서 면접 탈락이 많은 것 같아서

기존 프로젝트를 고도화하고, 정량적인 수치를 제시하는 기능 개선 사례를 생성해보고자 한다.

최근 프로젝트중에 Spring Batch를 사용한 프로젝트가 있었는데 대용량 더미데이터 핸들링과 성능테스트 경험을 추가할 수 있을 것 같아서(k6 이나 nGrinder 같은 툴도 사용할 수 있을 거라고 기대한다.)

이 프로젝트를 고도화하려고 한다.


AWS 배포도 내가 진행했었어서 그 부분도 나중에 고도화 할 계획이다!

리펙터링 및 고도화를 진행할 프로젝트 개요

부트캠프 최종프로젝트로 러닝을 좋아하는 고객을 위한 다양한 편의기능을 제공하는 서비스를 개발했었다. 예를 들어,

  1. 사용자 러닝 기록 관리
  2. 러닝 크루 개설 및 운영
  3. 러닝 기록 기반 랭킹 산정
  4. 러너들이 참여할 수 있는 대회 정보 제공 및 참가 신청 지원
  5. 러닝 기록 기반으로 월별로 사용자에게 유용한 통계량이 포함된 보고서 제공

등의 기능이 있었고,

나는 5번의 월 주기(monthly) 통계량 계산 배치 작업을 Spring Batch를 이용해서 구현했었다.

이루고자 하는 목표

이 프로젝트의 요구사항 중 하나는 MSA 구조로 개발하는 것이었다.

그래서 통계량 계산 배치 작업에서 사용자 러닝 기록을 읽어오는, Spring Batch 에 도메인 언어로 표현하면 ItemReader 에 해당하는 Step이 일반적인 DB 조회가 아닌 다른 마이크로서비스(러닝 기록 서비스)의 API를 호출하는 작업으로 구성되어 있었다. 즉, 사용자별 월별 데이터를 api로 호출해 작업함.

이때 배치 작업중에 호출하는 러닝 기록 서비스의 API를 담당 팀원과 얘기해서 배치작업에 최적화했어야 했는데 당시에는 시간이 부족해서 의견을 내지 못했었다.

Spring Batch가 제공하는 ItemReader 에 사전 구현된 상황이 아니므로 신중하게 생각하면서 개발했어야 했는데, 많이 아쉬운 부분이다. 그래서 지금이라도 개선해보고자 한다.

우선 러닝 기록 엔티티는 다음처럼 구현되어 있다.

// file: "RunningRecord.java"

public class RunningRecord{
	@Id
	@GeneratedValue
	@UuidGenerator
	@Column(name = "id", nullable = false)
	private UUID id;

	@Column(name = "user_id", nullable = false)
	private UUID userId;

	@Column(name = "distance", nullable = false)
	private double distance;

	@Column(name = "timer", nullable = false)
	private Duration timer;

	@Column(name = "pace", nullable = false)
	private double pace;
	
	@CreatedDate
	@Column(updatable = false, nullable = false)
	private LocalDateTime createdAt;
	
	// ...
}
  • 사용자가 한 번의 러닝에서 달린 거리, 페이스, 운동 시간 등을 기록함.
  • 실제 웨어러블 디바이스를 연동하진 못했어서 더미 데이터라고 생각하면 될 것 같다.

이를 읽어오는 API는 당시에 내가 구현하진 않았으니까 당사자의 동의 없이 그걸 자세하게 인터넷에 포스팅하기도 문제가 있다고 느껴지고, 공부하는 측면에서도 지금 시점에는 굳이 살펴볼 필요는 없을 것 같다.

그래서 기존의 것을 개선하기보다는 내가 새로 나이브하게 버전 1부터 구현해서 점차 개선하는 방향으로 진행해 보려 한다.

최종 구현 목표는 다음과 같다.

  • 대용량 데이터를 읽는 경우를 고려한 네트워크 I/O 최적화를 포함한 구현
  • 다른 서비스 API 호출을 고려한 예외 처리 (SAGA 패턴 같은 느낌)
  • Spring Batch의 각 스텝, 비즈니스 로직, 유닛 테스트, 전체 통합 테스트를 포함한 테스트 코드의 작성
  • K6, nGrinder 같은 부하 테스트 스크립트 작성 및 부하 테스트 결과 정리를 통한 성능 개선 포트폴리오 작성

목표는 정해졌으니 화이팅해보자!