
드디어 3주간의 대장정이 마침표를 찍었습니다. 처음엔 "과연 내가 할 수 있을까?"라는 의구심으로 시작했던 도전이, 실제 글로벌 프로젝트의 코드를 수정하고 '컨트리뷰터(Contributor)'라는 이름을 얻으며 마무리되었습니다.
오늘은 재현된 버그를 해결하고, 깐깐한 자동화 테스트를 넘어 최종 머지(Merge)에 성공하기까지의 마지막 기록을 남깁니다.
🛠️ 1. 삽질 3주의 결과물, 단 3줄의 코드
원래 계획은 이슈 재현 과정만 리포팅하고 마무리하려 했습니다. 하지만 3주 동안 이 버그와 씨름하며 쏟은 시간이 아까웠고, 이왕 시작한 거 **'내 손으로 직접 고쳐보자'**는 욕심이 생겼습니다.
수정한 코드는 놀라울 정도로 단순했습니다.
// Ensure we have a valid order, not a refund or other object.
if ( ! $order instanceof WC_Order ) {
return false;
}
웹훅으로 인입된 ID가 주문(WC_Order)이 아닌 환불(WC_Order_Refund) 객체라면 즉시 처리를 중단하는 가드 클로즈(Guard Clause)입니다. 이 단순한 3줄의 코드를 확신 있게 적기 위해 저는 3주 동안 환경을 세팅하고, DB를 조작하고, 로그를 분석했던 것입니다.
🚨 2. 첫 번째 난관: 워드프레스의 '엄격한' 컨벤션
코드를 수정하고 자신 있게 git commit을 날렸으나, Husky(Git Hooks)가 제 앞을 가로막았습니다.
✖ ./vendor/bin/phpcs --standard=phpcs.xml.dist ... [FAILED]
ERROR | [x] No space after opening parenthesis is prohibited
범인은 코드 컨벤션(WordPress Coding Standards)이었습니다. 일반적인 PHP 스타일(PSR)과 달리, 워드프레스는 괄호와 연산자 사이에 아주 넉넉한 공백을 요구하더군요.
수정 전: if (!$order instanceof WC_Order) {
수정 후: if ( ! $order instanceof WC_Order ) {
느낌표(!) 앞뒤와 괄호 안쪽에 공백을 하나씩 정성스럽게 넣어주고 나서야 첫 문턱을 넘을 수 있었습니다.
🧪 3. 두 번째 난관: "너무 완벽하게 고쳐서" 생긴 문제
컨벤션을 맞추고 git push를 하려는 순간, 이번엔 PHPStan(정적 분석 도구)이 화를 냅니다. 에러 내용을 보니 황당하면서도 기분이 좋았습니다.
# PHPStan 실행 결과
------ -----------------------------------------------------------------------
Line includes/class-wc-stripe-webhook-handler.php
------ -----------------------------------------------------------------------
Ignored error pattern #^Method ... was not matched in reported errors.
Ignored error pattern #^Parameter #1 $order ... was not matched in reported errors.
------ -----------------------------------------------------------------------
[ERROR] Found 3 errors
🕵️♂️ "에러가 안 나서 에러입니다?"
이게 무슨 뜻일까요? 제미나이와 분석해 보니 참 재미있는 상황이었습니다. 보통 오픈소스 프로젝트들은 너무 많은 레거시 에러를 한꺼번에 고칠 수 없어, phpstan-baseline.neon이라는 파일에 "이 에러들은 원래 나는 거니까 일단 무시해줘"라고 목록을 적어둡니다.
그런데 제가 코드를 너무 완벽하게 고치는 바람에 무시하기로 했던 에러가 더 이상 발생하지 않게 된 것입니다! 그러자 PHPStan은 이렇게 따졌습니다.
"어? 여기 에러 난다고 해서 무시 목록에 넣어놨는데, 왜 이제 에러가 안 나? 이 목록은 이제 필요 없으니까 지워!"
버그를 해결하면서 프로젝트의 기술 부채(Technical Debt)까지 덩달아 해결해 버린 셈입니다. 결국 베이스라인 파일에서 해당 무시 항목들을 삭제하고 나서야 비로소 푸시에 성공했습니다
🚀 4. Pull Request: 텍스트로 증명하는 시니어의 내공
드디어 공식 저장소에 Pull Request #5025를 올렸습니다.
https://github.com/woocommerce/woocommerce-gateway-stripe/pull/5025
Fix fatal error caused by webhook ID collisions by HomerSim · Pull Request #5025 · woocommerce/woocommerce-gateway-stripe
Fixes #4951 Changes proposed in this Pull Request: Description: This PR addresses a fatal TypeError in get_order_from_intent(). In multi-site environments sharing a single Stripe account, webhooks ...
github.com
오토매틱(Automattic)은 전 세계 개발자가 원격으로 일하는 만큼 '텍스트를 통한 소통'을 극도로 중요하게 생각합니다. 저는 지난 포스팅에서 정리했던 상세한 재현 과정, DB 스크린샷, 에러 로그를 PR 본문에 쏟아부었습니다.
메인테이너들이 제 PR을 열었을 때 "더 이상 질문할 필요가 없게" 만드는 것이 전략이었습니다.
🎉 5. 결과: 이틀 만의 승인과 머지(Merge)
결과는 놀라웠습니다. 글로벌 프로젝트임에도 불구하고 단 이틀 만에 리뷰어 2명의 승인이 떨어졌습니다.
- Reviewer A: "Thanks for the fix! Much appreciated!"
- Reviewer B: "This is looking good to me."
특히나 복잡한 E2E 테스트 실패가 제 코드 때문이 아니라고 메인테이너가 직접 실드(?)를 쳐줄 정도로 제 리포팅에 대한 신뢰가 두터웠습니다. 그리고 2월 17일, 제 코드가 메인 브랜치에 Merged 되었습니다.


🏁 에필로그: 벽을 허물다
저에게 오픈소스 기여는 항상 높고 거대한 벽이었습니다. 하지만 이번 도전을 통해 깨달은 것이 있습니다.
- 실무 경험은 배신하지 않는다: 결제 도메인에 대한 이해와 PHP 숙련도가 결국 결정적인 단서를 찾게 해 주었습니다.
- 재현(Reproduction)이 기여의 80%다: 코드 한 줄 고치는 것보다, 왜 고쳐야 하는지 증명하는 과정이 훨씬 가치 있습니다.
- 철저한 준비가 소통을 이긴다: 정성 들인 PR 문서는 언어의 장벽을 뛰어넘는 최고의 소통 도구였습니다.
이제 저의 GitHub 프로필에는 WooCommerce Stripe Gateway의 컨트리뷰터 배지가 붙었습니다. 이 작은 경험이 앞으로 글로벌 무대로 나아가는 저에게 큰 자산이 될 것 같습니다.
도전하세요. 단 3줄의 코드가 세상을 조금 더 낫게 만들 수도 있습니다.
'사이드프로젝트' 카테고리의 다른 글
| [오픈소스 기여 도전기 #1] 덫을 놓고 기다리다: ID 충돌 버그 강제 재현 성공 (With. 2PC & DB조작) (1) | 2026.02.18 |
|---|---|
| [오픈소스 기여 도전기 #1] 거대한 코드 숲에서 길을 찾다 (구조 분석 & 웹훅 테스트) (0) | 2026.02.17 |
| [오픈소스 기여 도전기 #1] 맨땅에 헤딩: 우커머스 로컬 환경 구축부터 결제 성공까지 (0) | 2026.02.17 |
| [오픈소스 기여 도전기 #1] 12년 차 개발자의 전략적 접근법: 프로젝트 선정부터 이슈 분석까지 (0) | 2026.02.17 |
| [사이드 프로젝트] #2. RAG 챗봇 개발기 (6) - 하이브리드 검색과 '의외의' 결과 (0) | 2025.11.21 |