SW개발/개발이야기

오픈소스 기여하기 회고 1 (feat. Django Contributor)

안녕하세요, 오랜만에 블로그 포스팅으로 찾아왔습니다.

회사에서도 바쁜 시간을 보냈고 여러 오픈소스에 관심을 가지면서 시간을 보냈던 것 같습니다.

 

오늘은 틈나는대로 관심을 가지고 있던 오픈소스 생태계에서 Django Contributor가 된 경험을 공유하려고 합니다. 바로 시작하겠습니다!

 

오픈소스 Contributor 되기로 마음 먹기

시작하기 전 오픈소스와 관련된 여러 글들을 읽어 보았는데 공통적으로 하는 말이 꽤나 고되며, 시간이 많이 소요된다라는 말들을 종종 볼 수 있었습니다. 하지만 그럼에도 불구하고 장점이 더 많았고 무엇보다 너무 해보고 싶었던 일이었기에 올해 안에는 오픈소스에 기여를 무조건 해보자 라는 마음가짐으로 시작했습니다.

 

제가 오픈소스를 시작하면서 기대했던 효과는 다음과 같습니다.

  • 각국의 다양한 개발자들이 협업하는 과정을 배우기
  • 유명 오픈소스의 유지보수가 잘 되는 이유/과정을 경험하기
  • 내 자신의 코드레벨을 한층 올려보기 & 잘 짜여진 코드란 무엇인가

정말 큰 규모의 프로젝트가 어떤 방식으로, 어떤 코드베이스로 인해 유지보수가 되는지 늘 궁금했습니다. 그리고 이러한 프로젝트에 나의 코드 한줄이라도 기여할 수 있다면 정말 재미있을 것 같았습니다.

 

그렇게 야심찬 오픈소스 여정을 시작합니다.

 

무슨 프로젝트에 기여하지 ?

기여하기로 마음을 먹었으니, 프로젝트를 정해야 했습니다. 우선, 사용해본적 없는 프레임워크나 라이브러리는 선택 대상에서 제외했습니다. 기왕이면 버그 패치 같은 코드베이스 수정에 기여하고 싶었기 때문에 일면식도 없는 프로젝트의 버그를 고친다는 것은 쉽지 않을 것 같았기 때문입니다.

 

그래서, 제가 많이 사용하고 있는 프로젝트들 중 관심있는 것을 추려보았습니다.

  1. 파이썬 규모 No.1 Django
  2. Strawberry (Python Graphql client)
  3. 신흥강자 FastAPI

위 3가지의 프로젝트를 중심으로 발행된 이슈, 버그 리포트를 중점적으로 살펴보았습니다. 사용하다가 생긴 버그를 리포트하고 패치하는 플로우가 아니고, 다른 사람이 발행한 버그 리포트를 찾아서 패치 한다는 것은 생각보다 고된 일이었습니다. 

잘 모르는 부분(DB level)의 버그도 많았고, 어떤 이슈들은 잘못된 사용방법에서 발생하는 것들도 있었습니다.

 

버그 티켓 발견 !

그래도 꽤나 관심을 기울이다보니 패치 해볼만한 것은 몇가지 있었습니다. (버그없는 소프트웨어는 없으니까요)

 

그 중 첫번째로 시도한 것은 장고 어드민에서 Json 데이터를 저장할 때 발생하는 데이터 누락 이슈에 대한 패치 였습니다.

문제점을 파악하고, 코드베이스를 이해하고 디버깅하며 해결책을 만들어 나가는 것까지 꽤 오랜 시간이 소요되었습니다. 이 과정에서 다른 사람의 소스코드를 이해하는 능력이 부족하다는 생각도 많이 들었습니다. (자꾸 똑같은 곳을 되풀이하며 코드를 읽고 있었습니다..) 그래서 종이에 써내려가며 한번 정리를 하고나니 큰 그림이 머리에 그려지기 시작했습니다.

 

각설하고, 아래의 링크가 해당 패치에 대한 PR 입니다.

https://github.com/django/django/pull/16019

 

Fixed #33871 -- Fix bug value cannot be detected after form validation fails by na86421 · Pull Request #16019 · django/django

Fixed Ticket #33871 Changes After form validation check fails, set form's data as initial data Added set_initial_data function in BaseForm Added unit test for set_intial_data Description It is b...

github.com

PR을 오픈한지 꽤 오랜 시간이 지났지만 아직까지 리뷰가 된 상태는 아닙니다.. 그래서 PR을 오픈한 채로 다른 버그 패치를 또 찾게 됩니다.

 

두번째로 시도했던 것은 Strawberry에서 exclude_unset 옵션을 사용할 때 제대로 동작하지 않는 이슈에 대한 패치 였습니다. 이번에는 생각보다 빠른 시간에 패치에 대한 PR을 열었습니다.

https://github.com/strawberry-graphql/strawberry/pull/2180

 

Fix exclude_unset issue when converting strawberry type to pydantic type by na86421 · Pull Request #2180 · strawberry-graphql/

Description Fix exclude_unset issue when converting strawberry type to pydantic type In the process of converting to pydantic type through to_pydantic_default, if Value is unset(== None) it is not...

github.com

하지만, 약 10일뒤 리뷰가 달렸는데 너무 안일하게 접근했다는 것을 깨닫게 됩니다. 리뷰를 확인하고 난 뒤에 근본적인 해결책을 계속 생각해보고 있는 중입니다..

 

마지막은 장고의 Migrate 옵션 사용시 불필요하게 방출되는 signal에 대한 이슈에 대한 패치 입니다. Django Contributor가 된 첫 PR 입니다!!

https://github.com/django/django/pull/16120

 

Fixed #34052 -- Made migrate --check don't emit signals and output when up to date. by na86421 · Pull Request #16120 · django/

Fixed ticket-34052 Changes Changed migrate condition according to --check and already reflected_changes Tests Added testcase. Tested migrate already reflected changes with check FYI In the sit...

github.com

이 PR도 처음에는 쉽게 접근 하였습니다만, 리뷰 과정에서 여러 피드백을 받으면서 수정이 이루어졌습니다. 빠르게 수정을 진행했고 우려? 와는 다르게 다음날 자고있던 새벽에 Main에 Merged 되었다는 메일을 받을 수 있었습니다!

 

처음에는 이게 진짜인가 싶어서 여러 번 확인 했었는데 정말 내 패치가 반영이 된 것을 확인하고 되게 행복하고 짜릿했습니다..!!

또, 아무래도 제가 가장 잘 그리고 많이 사용하고 있는 Django 프레임워크에 기여를 하게 되어서 상당히 기쁘고 뿌듯합니다.

 

아무래도 오픈소스에 첫 Merged된 PR 이다보니 구체적으로 설명을 드리는게 좋을 것 같습니다.

이번 포스팅은 이 정도로 마무리하고 다음 포스팅에서 부가적인 코드 설명과 함께 더 자세한 내용으로 찾아뵙도록 하겠습니다.

 

읽어주셔서 감사합니다 :)

 

728x90