첫 오픈소스 기여 과정 정리
1. 서론
오픈소스에 기여해보고 싶지만 어떻게 해야할지, 내가 잘못하면 어떻게 하지 겁이나서 시도하지 못하고 있던 와중에 기여 모임을 통해서 첫 오픈소스 PR을 열게 되었다.
2. 오픈소스 선정
평소 자주 사용하면서 일주일 이내에 PR이 merge된게 있는 라이브러리를 찾아보다가 zod로 선정하게 되었다.
라이브러리의 이슈나 PR을 찾아보면서 이과정에 가장 많은 시간이 들었고, 내가 평소 사용하는 어떤 라이브러리가 굉장히 업데이트가 안 되고 있구나, 사람들이 관심을 별로 가지지 않는구나 같은 깨달음을 얻기도 해서 이슈 해결을 위해서가 아니더라도 지속적으로 깃허브 오픈소스에 관심을 가지면 좋을 것 같다는 생각을 가지게 되었다.
3. 이슈 선정
초보자에게 추천하는 Good first issue라벨의 이슈는 여러 라이브러리를 둘러보면서도 생각보다 찾기가 힘들었다.
때문에 라벨에는 큰 신경을 쓰지 않고 코드의 수정이 적으면서 큰 영향을 끼치지 않는 것, 해결 방식이 명확한 것, 내가 해결할 수 있는 범위 내에 있는 것을 선택하려했다.
AI를 통해서 이슈 분석을 진행했고 zod issues #5466 (opens in a new tab)로 선정했다.
이슈를 올린 사람과 bot의 대화에서 해결 방식과 수정이 필요한 파일이 이미 다 제시되어있었다.
4. 이슈 분석
Zod 내부 로직에서 context 객체를 복사하지 않고 직접 수정(Object.assign)하여, 같은 옵션을 여러 번 재사용할 때 의도치 않은 상태 변화가 발생하는 버그였다.
원인은 packages/zod/src/v4/core/parse.ts 파일 내부 코드에서 일부 파싱 함수들이 Object.assign()을 사용하여 전달된 컨텍스트 객체를 수정하는 것이었다. (컨텍스트 객체를 여러 호출에서 재사용하면 첫 번째 호출이 객체를 수정한다.)
원래도 스프레드 연산자를 사용하여 수정하지 않는 함수도 있었다.
5. 해결 방법
packages/zod/src/v4/core/parse.ts 내에 Object.assign() 사용 함수들을 스프레드 연산자로 통일
packages/zod/src/v4/classic/tests/codec.test.ts 파일에 컨텍스트 불변성 검증 테스트 코드 추가
6. 결과
_safeParse 함수와 동일하게 스프레드 연산자로 수정
수정된 함수:
- _parse
- _parseAsync
- _safeParseAsync
- _encode
- _encodeAsync
- _safeEncode
- _safeEncodeAsync
Before Example:
const ctx: schemas.ParseContextInternal = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };After Example:
const ctx: schemas.ParseContextInternal = _ctx ? { ..._ctx, async: false } : { async: false };이슈를 수정하는 과정에서 발견한 오타도 PR을 올렸다. 오타 수정 PR은 금방 Merge가 되었는데 현재 선정했던 이슈 해결 PR은 메인테이너의 확인을 받지 못했다. 일단 간단한 PR이 우선적으로 Merge되는 것 같다.
7. 후기
전에는 내가 잘못 수정하면 어떻게 하지라는 고민과 두려움 때문에 오픈소스 기여하는 것에 쉽게 접근하지 못했는데 한 번 해보고 나니까 그렇게 겁먹지 않아도 될 것 같다는 생각을 하게 되었다.
© bgkRSS