Crohasang Logo
#9

[Fedify] 첫 오픈소스 기여를 해보자

2025년 7월 20일 오후 05:24

오픈소스 컨트리뷰션 아카데미 발대식이 끝나고, Fedify에 기여를 해보기로 다짐했다. Fedify의 Issue 탭에 들어가 내가 시작해볼만한 이슈가 있는지 찾아보았는데, ‘good first issue’ 태그가 붙어있는 이슈들을 발견했다. 그 중 괜찮아 보이는 이슈를 발견해서 댓글로 이 이슈를 맡고 싶다고 했다.

image 1

이미 이 이슈를 맡고 계신분이 있나? 하는 생각이 잠시 들었지만, 잠시 후 멘토님께서 진행해도 된다는 댓글을 남겨주셨다. 이제 기여를 시작해보자.

image 2

1. 먼저 CONTRIBUTING.md를 읽어보자

발대식에서 오픈소스 기여자들을 위한 문서가 있다는 사실을 알게 되었다. 바로 CONTRIBUTING.md인데, 들어가자마자 전부 영어로 된 문서에 잠시 긴장을 하긴했지만 어렵지 않게 작성되어 있어서 다행이었다.

🔗 https://github.com/fedify-dev/fedify/blob/main/CONTRIBUTING.md

내용을 요약하자면 새로운 기능이나 중요한 변경 사항은 이슈를 먼저 열어 논의 해야하고 (오타 수정과 문서 개선 제외), 버그를 보고할 때, 기능을 요청할 때, 문서를 작성할때의 가이드라인이 적혀있었다.

  1. 코드 및 문서 변경 전에는 ‘deno task codegen’으로 코드를 생성할 수 있다.
  2. PR을 올리기 전에는 ‘deno task check-all’ 명령어로 타입 체크와 포맷팅 검사를 할 수 있다.
  3. ‘deno task test’로 테스트로 패키지, 런타임별 테스트를 할 수 있다.
  4. ‘deno fmt’로 포맷팅을 할 수 있다.

이 명령어들을 활용하여 추가한 코드에 문제가 있는지 확인할 수 있으니 혹시 내가 프로젝트를 망치는 것은 아닌지 걱정을 덜할 수 있게 되었다.

2. 문제를 파악해보자

🔗 https://github.com/fedify-dev/fedify/issues/262

이슈에는 아래와 같이 작성되어 있었다.

image 3

‘fedify inbox’ 명령어를 입력했으르 때, actor의 이름이 ‘Fedify Ephemeral Inbox’로 하드코딩되어 생성된다. 사용자가 원하는 이름을 사용하고 요약을 작성할 수 있도록 cli/inbox.tsx에 ‘—actor-name’ 명령어와 ‘—actor-summary’ 명령어 옵션을 추가하면 된다. 이 때, 사용자가 아무것도 작성하지 않으면 기본 값을 제공하면 된다.

3. 코드를 구현하고 PR을 생성했다

먼저, cli/inbox.tsx에 ‘—actor-name’과 ‘—actor-summary 옵션을 생성했다.

image 4

그리고 actorOptions 전역 변수를 생성하고, action 실행시 사용자가 입력한 actorName과 actorSummary를 actorOptions에 저장했다.

image 5

그리고, Application을 return할 때, name과 summary에 actorOptions의 값을 넣어줬다.

image 6

마지막으로, CHANGES.md에 업데이트 내용을 작성했다.

image 7

이제 문제는 PR을 올리는건데, 어떤 양식으로 올려야할지 몰라 다른 분들의 PR을 참고해봤는데 특별한 양식은 없는 것 같았다. 그래도 일정한 양식을 적용하는게 좋을 것 같아 다른 분의 양식을 참고했다.

image 8

(나중에 업데이트된 내용이 이미 적혀있는데 무시하면 된다)

무엇이 바뀌었고, 이슈에서 요구된 조건은 다 충족했는지, 그리고 테스트 결과는 어떤지 작성해서 올렸다. 테스트도 다 통과되고 큰 문제 없이 통과되지 않을까하는 기대를 품고, 첫 오픈소스 기여 PR을 업로드했다.

4. 멘토님과 Gemini의 피드백

PR을 올리자 Gemini가 먼저 피드백을 해주었다.

image 9

먼저 PR이 어떤 내용인지 짧게 요약을 해주었다. PR을 AI가 요약해준다니 새삼 기술 발전이 빠르다는걸 실감했다.

image 10

그리고 Gemini는 전역변수 사용에 문제가 있음을 알려주었다. 여러 번 사용될 때 의도하지 않은 행동을 이끌 수 있다는 관점은 코드를 작성할 때 생각하지 못했었다.

그리고 얼마 지나지 않아 멘토님이 리뷰를 해주셨다. Gemini가 지적한 문제에 공감을 해주셨고, CHANGES.md에 이슈 링크 뿐만 아니라, PR 링크도 추가해주실 것을 요청해주셨다.

5. 전역변수를 없애보자

전역변수를 없애자는 피드백을 받았다. 전역변수를 사용하지 않는다면, 어떻게 값을 전달할 수 있을까?

cli/inbox.tsx의 코드를 다시 살펴보니 fedCtx라는 컨텍스트를 사용하고 있었고, 이 컨텍스트에 actorName과 actorSummary를 담아서 제공하면 되겠다.

image 11

그런데 기존 함수들이 타입 때문에 actorName과 actorSummary 인식하지 못했고, 기존 함수를 actorName과 actorSummary를 인식할 수 있는 새로운 함수로 감싸는 function factory 방식을 사용하게 되었다.

image 12

그리고 CHANGES.md를 업데이트하고, 새로 커밋을 push하게 되었다.

6. conflict 발생과 git rebase

image 13

PR이 열려있던 와중 main이 업데이트되었다. 그래서 conflict가 발생했고, 멘토님께서는 main 브랜치 rebase를 요청하셨다. git rebase의 개념은 알고 있었지만 지금까지는 그냥 merge를 하거나 git reset을 사용했었기에, 실제로 사용한 적이 거의 없었다. 이번 기회에 git rebase를 사용했는데 다행히 충돌이 발생한 부분이 많지 않아서 고치고 ‘git rebase —continue’ 명령어를 입력하고를 반복하다 보니 문제를 해결할 수 있었다.

image 14

copilot이 지적한 또 다른 내용도 수정하고, 코드들을 force-push했다 (rebase이므로)

7. 드디어 첫 기여를 했다

image 15

그리고 멘토님께서 approve를 해주셨다! 조금 더 좋은 추상화가 있지 않을까라는 고민이 남긴했지만 나 또한 더 좋은 방법이 당장 떠오르지 않았다.

Pull Request 🔗 https://github.com/fedify-dev/fedify/pull/285

이렇게 나의 첫 번째 오픈소스 컨트리뷰션이 마무리되었다. 드디어 나도 오픈소스 컨트리뷰터! 우여곡절이 살짝 있긴했지만 작성한 코드가 성공적으로 main에 merge될 수 있었다. 생각보다 영어의 압박이 세긴했지만, 그래도 LLM과 함께하니 큰 어려움 없이 글을 작성할 수 있었다. 시작이 반절이라고 하는데, 다행히 반절을 채웠으니 이제 남은 반절을 열심히 채워보자.