[spring-batch] 생에 처음으로 오픈 소스에 기여를 해보다

오픈 소스라는 존재에 대해서는 "언제 한번쯤은 기여해보고 싶다"는 마음은 항상있었지만,

막연하게만 생각하고 있었습니다.

그러다 우연히 오픈소스 기여 모임이라는 곳을 알게 되었습니다.

 

 

오픈소스 기여모임

“누구나 원하는 오픈소스에 기여를” 할 수 있게 기여를 직접 돕습니다!

medium.com

 

초심자 분들께도 체계적으로 가이드를 주신다는 후기를 봤기 때문에 이번에는 꼭 오픈 소스에 기여를 해보겠다는 생각으로 일단 참가부터 했던 것 같습니다.

오픈소스 기여 모임 10기 모집 글

 


Spring Batch를 선택한 이유

기여할 프로젝트를 고를 때, 고민 없이 spring-batch를 선택했습니다.

 

spring-batch는 저에게 꽤 특별한 프로젝트입니다. 본격적인 개발 스터디를 시작한 게 바로 spring-batch 스터디였기 때문입니다.

 

특히 최근에 스프링 배치 관련 책을 잠시 읽으면서 더욱 흥미를 가지게 되었습니다.

정확히 기억은 안나지만, 책의 서문에서 "백그라운드에서 항상 돌아가고 있지만 - 유저는 느끼지 못하는 서비스"라는 표현 때문이었던 것 같습니다.

이 표현을 보고 배치 서비스야말로 진짜 '백엔드'라는 느낌이었습니다. 그래서 백엔드 개발자로서 그런 부분을 더 깊이 이해하고 싶어 자연스럽게 spring-batch 프로젝트에 기여하고자 했습니다.

 


그런데... "기여할 수 있는 이슈가 없다"

기여 모임이 시작하기 전부터 불안함이 컸기 때문에, spring-batch에 기여하신 분들의 후기를 먼저 찾아보었습니다. 모임장이신 인제님께서 spring-batch 기여에 대해 직접 글을 남기신 게 있었고, 바로 카톡으로 조언을 구했습니다.

 

정말 별 말씀 안드렸는데도 엄청난 지지를 해주신 인제님… 천사이심이 틀림없으신 것같 습니다. 실제 모임에서도 500명이 넘는 인원들 전부 케어를 해주셨으니… 대단하신 분이십니다. 별로 여쭤본 것도 없는데 엄청난 응원을 해주셔서 무척 감사했습니다..

 

그리고 실제로 오픈소스 모임이 시작되고, 저는 1회차 오프라인 모임에 참가했습니다.

 

오픈소스 기여 모임에서는 AI를 적극 활용하기를 권장하고 있습니다. 기여를 원하는 프로젝트만 선정한다면 AI가 이슈 선정부터 해결까지 가이드를 해주는 방식으로 진행됩니다.

 

첫 번째 과정인 이슈 선정하는 것도 AI와 함께 진행하게 되는데요, 기여하고 싶었던 spring-batch 프로젝트는 오래됐기 때문에 이미 성숙도가 높아 초심자가 손대기 어려운 이슈들이 대부분이었습니다.

 

적합한 이슈가 하나도 없다.

 

충격

 

여러 코멘트들을 들으면서 '나는 spring-batch 프로젝트에 기여할 수 없겠구나', '나는 왜 이런 실력을 갖고있는 거지' 하는 생각에 갑자기 너무 우울해져서 혼술까지 했던 기억이 납니다. ㅋㅋㅋㅋ

 

오프라인 모임에서 인제님과 얘기를 하면서 그나마 초심자가 진행 하기에 적합한 이슈를 선정 해주셨고, 개인적으로 진행한 후에 개인 브랜치에 푸시 후 피드백을 받기로 했습니다.

 

그때 인제님께 혹시 다른 프로젝트를 선정 해야할지 고민을 말씀드렸는데,  "그래도 본인이 제일 하고 싶은 프로젝트에 기여하는 게 제일 좋죠"라고 하시며 도움을 주셨고, 그때 선정한 이슈가 아래와 같습니다.

 

선정한 이슈

 

MetaDataInstanceFactory default values cause StepContext collision in StepScopeTestUtils when @SpringBatchTest is active · Issu

Bug description: There is a logical collision in StepSynchronizationManager when using StepScopeTestUtils in a test environment managed by @SpringBatchTest. StepExecution determines equality based ...

github.com

MetaDataInstanceFactory default values cause StepContext collision in StepScopeTestUtils when @SpringBatchTest is active #5181

 

간단히 설명하면, @SpringBatchTest와 StepScopeTestUtils를 함께 사용했을 때, MetaDataInstanceFactory가 고정된 ID(1234L)로 StepExecution을 생성하면서 컨텍스트가 충돌하는 버그였습니다. 이로 인해 테스트에서 JobParameters가 제대로 주입되지 못하는 문제가 생겼습니다.

 

이슈 작성자 분이 재현 코드까지 꼼꼼히 남겨 주셔서 이해하거나 해결하는 데 수월했습니다.

 


AI와 함께 공부하고, 이해하는 과정

이슈를 해결하려면 spring-batch의 테스트 관련 클래스들을 어느 정도는 이해해야 했었습니다. 평소에 spring-batch 를 이용한 서비스 개발을 해본 건 맞지만, 테스트 유틸리티 클래스들은 거의 사용해본 적이 없었었습니다.

 

이때 AI에게 "spring-batch 테스트 클래스를 공부하려는데, 어떤 순서대로 봐야할까?"라고 물어보니 학습 경로까지 정리해주었습니다. 큰 그림을 잡고, 각 클래스를 하나씩 들어가며 읽고, 이해가 안 되는 부분은 다시 AI와 얘기하며 반복하는 방식으로 진행했습니다.

 

공부한 주요 클래스들은 다음과 같습니다.

  • MetaDataInstanceFactory — 테스트용 Job/Step 객체를 생성하는 핵심 유틸리티
  • ExecutionContextTestUtils — ExecutionContext에서 값을 편리하게 꺼내는 테스트 유틸리티
  • JobOperatorTestUtils — Job 실행과 단일 Step 테스트를 위한 헬퍼 (기존 JobLauncherTestUtils의 후속)
  • JobRepositoryTestUtils — 배치 메타데이터 저장소의 테스트 유틸리티
  • StepScopeTestExecutionListener — @StepScope/@JobScope 빈을 단위 테스트에서 사용 가능하게 해주는 리스너

이렇게 테스트 클래스들을 공부하고 나니, 이슈가 왜 발생한 건지 그리고 어떻게 접근할 수 있는지가 조금씩 보이기 시작했습니다.


PR과 merge — 실제 기여한 내용

접근 방향

이슈에서도 언급되었듯이 해결 방법은 여러 가지입니다. ID 생성 전략을 바꾸거나, 중복 등록 회피 로직을 추가하거나, 사용자에게 ID를 직접 받도록 하는 등이 있을 수 있습니다.

저는 수정을 최소화하는 방향을 선택했습니다. 기존에 사용되던 상수값을 그대로 유지하되, 새로운 ID를 생성할 때마다 해당 상수에 기반하여 매번 고유한 ID를 제공하도록 했습니다.

 

AtomicLong

이 과정에서 AtomigLong을 사용할 필요가 생겼는데, 사실 회사에서 서비스를 구현하면서 Long은 많이 사용하지만 AtomicXXX라는 클래스는 처음 접해보았습니다.

spring-batch 코드를 들여다보면서 그 존재를 알게 되었고, 멀티 스레드 환경에서 long 값의 정합성을 유지하기 위해 이 클래스를 사용한다는 것을 알게 되었습니다.

 

PR 제출

 

PR #5208

 

Fix ID collision in MetaDataInstanceFactory for test scenarios with @SpringBatchTest by HongYeseul · Pull Request #5208 · spri

Problem Tests using StepScopeTestUtils with @SpringBatchTest failed with ClassCastException due to ID collisions. MetaDataInstanceFactory always created instances with the same default IDs (123L), ...

github.com

 

"내가 이런 곳에 기여를 할 수 있는 건가?"라는 생각이 많이 들었지만, 인제님의 응원 덕분에 용기를 내어 PR을 올릴 수 있었습니다.

 

 

merge가 되다

PR을 올린 후, 약 열흘 정도가 지나고 이메일 알림이 하나 날아왔습니다.

 

짜릿했던 메인테이너 분께 LGTM 받기

 

이 때, 팀원 한 분과 회의 중이었는데 너무 기뻐서 바로 자랑했던 기억이 납니다. 생에 첫 오픈 소스 기여라니.

 

어떤 기준으로 프로필이 뜨는 건진 모르겠지만 바로 두번째 언급에서 프로필을 찾아 볼 수 있었습니다

 

spring-batch v6.0.2 릴리즈에서 저의 커밋 내용이 반영되었습니다.

 

그러고 그 다음 온라인 모임에 참여했을 때

인제님께서 스프링 배치 기여 축하드린다면서 샤라웃 ..! 까지 해주시고 감사했습니다 ㅎㅎ

 

한국 스프링 사용자 모임에서도 릴리즈 됐을 때 언급해주신 분도 계셔서 반가웠답니다.

 

뭔가 오픈소스 모임이 진행될 때는 spring-batch를 기여하겠다는 글은 못 본 것 같은데도 많은 관심을 가져주셔서 감사했던 것 같습니다.

특히 인제님께서 해당 프로젝트의 경우 메인테이너 한 분께서 전부 검토하고 계시기 때문에 머지까지 엄청난 시간이 걸리는 경우가 잦다는데 운도 엄청 좋았던 케이스라고 해주셨습니다. 😆

 


그리고...

이번 기여로 "오픈소스에 기여해보고 싶다"라는 몇 년간의 숙제(??)를 하나 넘게 되었습니다.

또한 기여하는 것 자체에 대한 두려움이 많이 없어졌습니다.

 

앞으로는 여러 프로젝트에 기여하면서, 코드를 많이 읽고 레거시한 프로젝트도 빠르게 파악할 수 있는 개발자가 되고 싶습니다. 그리고 기여를 통해서 운영진 역할까지 맡을 수 있는 사람이 되고 싶다는 목표도 생겼습니다.

 

마지막으로, 이 과정 전반에서 엄청난 도움을 주신 운영진 분들, 특히 인제님께 정말 큰 감사의 인사를 드리고 싶습니다. 덕분에 오픈소스 기여에 대한 자신감을 가질 수 있었습니다.

 

다음 기수에도, 그 다음 기수에도 반드시 참여하고 싶은 마음입니다.

 

오픈 소스에 조금이라도 기여하고 싶다는 마음이 있다면 꼭 다들 참여 해보셨으면 좋겠습니다! 😄

 

읽어주셔서 감사합니다.

'기타 > 일기' 카테고리의 다른 글

10월의 이모 저모  (1) 2025.11.01