[오픈소스 컨트리뷰션 아카데미] 참여형 멘티 Challenges ~ Masters 기간 활동 후기

.·2024년 12월 7일
1
post-thumbnail

이번에 운 좋게 합격하여 뛰어난 멘토님과 열정적인 팀원분들과 함께 4개월 동안 오픈소스 컨트리뷰션 아카데미 활동을 하였습니다. 제가 했던 활동 기록 겸 많은 분들이 이러한 좋은 프로젝트를 참여하면 좋겠다는 마음에 작성하였습니다:)

프로그램 관련 자세한 내용은 밑에 있는 링크 참고하시면 되겠습니다 !
https://www.contribution.ac/

이제 편하게 하나씩 기록해보고자 합니다.

오픈소스 컨트리뷰션 아카데미 지원 동기

... 제가 오픈소스 컨트리뷰션 node.js 프로젝트에 관심을 갖게 된 계기는 먼저 평소에 오픈소스 소프트웨어를 사용하면서 이 분야에 큰 흥미를 갖게 되었습니다. 누구나 사용이 가능하며, 공동 개발을 통해 더 뛰어난 소프트웨어를 만드는 과정을 보면서, 저도 한 번쯤 기여해보고 싶다는 생각을 하게 되었습니다. 하지만, 학생으로서 기여할 실력이 부족하다고 느꼈고, 오픈소스 커뮤니티와 생태계에 대해 자세히 알지 못해 주저하고 있었습니다. ...

... 마지막으로, 저는 오픈소스 SW 프로젝트를 멘토님과 함께 공부하면서 기여할 수 있다는 점이 저를 더 나은 개발자로 성장시킬 수 있을 것이라는 생각에 지원하게 되었습니다. 오픈소스 SW 기여를 어렵게 생각하여 시도하지 못했던 제가 이 오픈소스 컨트리뷰션 활동을 통해 오픈소스SW를 하나씩 공부해 가면서 오픈소스 생태계는 물론 실무에 필요한 경험과 커뮤니케이션 능력까지 키울 수 있다고 생각합니다. ...

... 또한, 백엔드 분야에 관심이 많은 학생으로서, 평소 Spring만 공부해오던 제가 Node.js를 사용해보면서 다양한 백엔드 기술 스택에 대한 경험을 쌓을 수 있는 좋은 기회가 될 것이라고 생각하고, 비동기 프로그래밍 방식과 실시간 애플리케이션에 적합한 node.js의 매력을 느껴보고 싶습니다. ...

실제 저의 지원동기 일부분 입니다.

저는 2-1학기 때 오픈소스 관련 수업을 들으면서, 오픈소스로 제공되는 다양한 프로그램과 코드를 사용해 볼 기회가 있었습니다. 처음에는 “왜 개발자들이 자신의 코드를 공개할까?”라는 의문과 함께, 공개를 통해 얻을 수 있는 것이 무엇인지 궁금했습니다. 그러나 시간이 지나며, 오픈소스는 더 나은 개발 환경을 구축하려는 많은 개발자들의 노력과 열정이 모여 만들어졌다는 것을 깨닫게 되었습니다. 이러한 가치를 알게 된 후, 저 또한 오픈소스에 기여해 더 많은 사람들에게 도움을 주고, 함께 성장할 수 있는 커뮤니티를 만들어 보고 싶다는 목표를 가지게 되었습니다. 이러한 이유로 오픈소스 프로젝트에 기여하고자 지원하게 되었습니다.

이 후 운 좋게 선발된 후, 7/13 ~ 8/9 동안 Challenges 기간에 참여했습니다.

Challenges 기간

발대식

일단 본격적인 오픈소스 컨트리뷰션 아카데미 활동에 앞서, 발대식을 진행하였습니다.
발대식에서는 '세상을 바꾸는 시간'이라는 특별 강연 뿐만 아니라 오픈소스 컨트리뷰션 아카데미 소개를 해주셨습니다. 또한 초청 스피커 아카데미 경험 공유를 듣고, 각 팀별로 발대식을 진행하였습니다. 저희 팀에서는 총 3가지 주제에 대해 이야기를 나누었습니다.

1) 네트워킹 시간

이번 2024 오픈소스 컨트리뷰션 아카데미에 같이 참여하게된 멘티분들과 멘토님 다 같이 자기소개를 하며 서로에 대해 알아가는 시간을 가졌습니다. 자기소개 할 때 멘티분들 중 현업에 계신 분들도 많았고 4학년 취업 준비하시는 분들도 많았습니다. 저는 아직 2학년 끝나고 대체복무하는 학생인 저는 처음에는 주눅이 들었지만 그만큼 내가 여기 올 수 있는 만큼 성장했구나라는 것을 느꼈고, 이러한 대단한 분들 옆에서 많은 것을 배우면서 더 성장할 수 있겠다라는 생각이 들었습니다.

2) 프로젝트 소개

자기소개 후 멘토분께서 이번에 진행할 Node.js 프로젝트에 대한 전반적인 소개를 해주시는 시간을 가졌습니다. 멘토님께서 Node.js 프로젝트를 진행하게 되신 이유, 앞으로 어떻게 진행되면 좋을지 등에 대한 이야기를 해주셨고, 이후 Node.js와 관련된 궁금한 점들을 멘토님과 이야기해보는 시간을 가졌습니다.

3) 컨트리뷰션 소개

Challenges 기간동안 무엇을 하면 좋을지, 오프라인/온라인 주기 및 날짜, 진행 방법 등에 관한 내용들에 대해 서로 이야기하였습니다.

구체적으로,

  • 챌린저스 목표 - 노드 코어의 한 싸이클을 돌기 (이슈 할당 > 작업 > PR > 머지)
  • 진행 방식 : 멘토님께서 first issue 혹은 난이도가 낮은 이슈 안내 후 담당해서 각자 작업
  • 모임 방식 : 최소 주 1회 온/ 오프라인 섞어서 진행 (멘토님 선호 요일 : 목)
  • 메신저 : 디코 서버 새롭게 만들기 or with 노션
  • 하고 있으면 좋은 숙제 : contribute 문서 읽고 있기

이러한 내용들을 Challenges 기간동안 해보기로 결정했습니다.

Node.js 빌드 및 테스트

제일 먼저 한 활동은 Node.js 기여를 하기 위한 빌드 및 테스트였습니다.

일단 첫 온라인 회의(7/18일)전 각자 Node.js 빌드 및 테스트를 해오기로 하였습니다.

npm, homebrew도 설치도 안 되어있는 상태에서 조금 시간이 걸렸지만, 멘티분들이 공유해주신 내용들을 바탕으로 별 이슈 없이 빌드 및 테스트를 완료하였습니다!

첫 온라인 회의 (7/18)


첫 온라인 회의에서는 온라인 회의 전 해오기로 하였던 Node.js 빌드 및 테스트를 진행하기로 하였습니다.

구체적으로

  • Node.js 런타임
  • 전반적인 구조, 프로젝트 구성
  • 빌드 시스템 동작
  • 개발시 빌드 시간 단축 팁
  • Test Suite 구성

내용에 관해 공유해주셨습니다.

이 온라인 회의에서 먼저 Node.js의 구조가 어떻게 되는지 큰 틀에 대해 배울 수 있었습니다.

아키텍처 구조는 물론 Directory Structure가 어떻게 되는지 구체적으로 학습할 수 있었던 시간이었습니다.
두 번째로 빌드 과정을 배울 수 있었습니다.


특히 build를 할 때 ./configure후 make j-4로 빌드를 하였는데 왜 이렇게 해야 되었는지를 다이어그램으로 설명해주시고, 각 기능별 동작은 물론 시간 줄일 수 있는 팁들도 설명해주셔서 빌드 과정에 대해 공부할 수 있는 시간이었습니다.

마지막으로 테스트 코드를 어떻게 짜야하는지 코드를 통해 설명해주시면서 테스트 관련 내용들을 학습할 수 있는 시간이 되었습니다.

오프라인 첫 회의 (7/27)


7/27날 12시 반부터 5시까지 오픈업에서 오프라인 모임을 하였습니다. 일단 추가적으로 자기 자신에 대한 소개를 하고, 이번주에 멘티분들이 하신 PR를 다같이 보면서 공유하는 시간을 가졌습니다.

멘티분들의 PR을 보면서 어떻게 PR을 하고 계시는지, 어떤 점을 중요하게 생각하고 계시는지 알 수 있었습니다. 구체적으로 멘티분 중 한 분은

1 목표

2 기여할 이슈 선정

3 이슈환경제안

4 원인분석 (발생 시기 찾기, 문제 좁히기)

5 노션으로 문제 해결 과정 작성 6 PR 작성

7 PR 머지 되기

이런식으로 노션에 페이지를 별도의 페이지를 하나 만들어서 해결하시는 모습을 보고 나도 저렇게 시도해봐야겠다는 생각이 들었습니다.

그리고 매우 다양한 이슈들을 해결하신 모습이 흥미로웠습니다. 어떤 분은 todo 처리 및 for문이 쓸데 없이 반복되는 모습을 보고 ObjectAssign으로 해결하시는 모습, 선언 잘 못 된 부분을 옮기고 오타 부분을 찾아서 수정하신 분, SEA 어플리케이션 단일 파일 실행 관련 이슈들을 해결하시는 것을 보면서

저도 이슈 주제 하나에 국한되지 않고 내가 더 공부하여 여러 부분의 이슈들을 해결해 보고 싶다는 생각이 들었습니다.

두 번째로 멘토님께서 Node.js WorkFlowContribution Ideas 관련해서 좋은 내용들을 공유해주셨습니다.

먼저 이 WorkFlow에서 “PR은 먼저 시작하는 사람이 우선. 다른 방식의 PR은 리뷰에 따라 한쪽이 결정”, “cookie licking 하지 않기” 라는 내용이 인상 깊었습니다. 맨 처음에 그나마 해결하기 쉬운 good first issue를 둘러보다가 거의 모든 issue에 대해 “내가 이 문제를 해결해도 돼?”와 같은 댓글이 달린 것을 보았습니다. 그래서 아 이러한 이슈는 이 분이 하시겠구나하고 다른 이슈를 찾았던 기억이 있습니다. 하지만 멘토님의 말씀을 들으면서 뭐든 일단 해야 겠다는 생각이 들었습니다.

그리고 commit squashing, Commit message convention 등 PR을 할 때 기본적으로 해야 하는 방법을 배웠습니다. 아무래도 오픈소스 기여할 때 공통적인 속성을 맞춰서 PR을 제출해야 된다는 점을 깨닫게 되었습니다.

더 나아가 버그 수정하는 방법, commit을 push 하기 전 로컬 테스트 수행하는 법, Target branch 지정, Review 요청, Node.js Versioning, 결과 확인 등 여러 좋은 내용을 공유해주셨습니다. 그리고 이러한 내용을 놓치고 싶지 않아 개인 노션에 따로 정리하였습니다.

그리고 제가 제일 필요했던 “Idea 🔥” 를 주제로 강의해주셨습니다.

총 7개의 아이디어를 제안해주셨습니다. 중복된 코드 제거, 내부 에러 삭제, 성능 향상 등 많은 아이디어를 코드를 통해 직접 확인해보면서 배울 수 있는 시간이었습니다.

이러한 오프라인 회의를 통해 어렵다고 느꼈던 PR에 대한 감을 조금이라도 잡을 수 있었고, 멘토님이 주신 아이디어를 바탕으로 PR을 해봐야겠다는 생각이 들어 PR을 작성하게 되었습니다.

오픈소스 첫 PR을 해보다.

해결한 이슈 #54105 = https://github.com/nodejs/node/pull/54114

문제 정의 : 먼저 doc에 blob.bytes()가 포함되지 않았다는 이슈가 존재하였습니다.

이 문제는 doc 관련 문제여서 일단 차근차근 해보자라는 생각에 시작하게 되었습니다.

먼저 Blob이 대용량 바이너리 데이터를 다룰 때 필요한 객체에서 처음에는 bytes()로 반환하여 올렸습니다.

그리고 PR을 처음 보내봐서 test.txt라는 파일도 잘 못 보내게 되었습니다.

이후, 두 분께서 피드백을 해주셨습니다.

일단 test.txt를 빼고 다시 PR을 보내고, 주석을 다시 달아달라고 첫 번째 분께서 말씀해주셨습니다.

그리고 두 번째 분께서 blob.bytes()의 반환값을 다시 아리켜주셨고, 추가적으로 commit message guide를 맞춰서 commit을 보내달라고 하셨습니다.

그래서 이 분들의 말씀을 듣고 test.txt파일을 삭제하고 Promise으로 반환값을 바꾸어 제출하였습니다.

이후

squashing을 통해 2개의 커밋을 하나로 합쳐달라고 하셔서 해결하였습니다.


이후 버전을 넣어주라고 하셔서 버전을 넣고 처음이라 서투르다고 양해의 말씀을 드리고, 더 필요하신게 있으시면 이야기 해주시라고 말했습니다.

그 다음 커밋 2개 중 마지막 커밋이 문제가 발생하였다고 해서 이 커밋을 삭제한 뒤 한 개의 커밋만 남기도록 하였습니다.

그 이후 멘토님께서 알파벳 순으로 변경해달라고 하셔서 수정하고,

**targos** 분께서 변경할 때 생긴 공백을 삭제하고 버전을 하나 더 넣어달라고 요청하여서 수정하였습니다.


이 후 모든 테스트가 통과된 후 기여가 완료되었습니다.


그리고 node.js에 정상적으로 커밋 되었습니다:)
주소 : https://github.com/nodejs/node/releases/tag/v22.7.0

자세한 내용은 Node.js 오픈소스 기여해보기

참고하시면 되겠습니다!

이번 PR을 해보면서 챌린저스 목표(노드 코어의 한 싸이클을 돌기 (이슈 할당 > 작업 > PR > 머지))는 해본 것 같아서 스스로 자랑스러웠습니다. node.js를 잘 몰랐지만 스스로 찾아가고, 공부하면서 하나의 오픈소스 이슈에 대해서 기여할 수 있다는 것에 기뻤습니다. 또한 모르는 사람이지만 오픈소스 하나로 묶여서 서로를 도와주고 같이 문제를 해결하는 오픈소스 생태계에 매력을 느꼈습니다.

2번째 온라인 회의 (8/1)

이 날은 먼저 저번 오프라인 회의처럼 PR을 하신 부분을 서로 공유하는 시간을 가졌습니다.

각자가 이번주 동안 해온 PR을 발표하면서 어떤 문제를 어떻게 해결하였는지 공유하는 시간을 가졌습니다. 특히 한 분께서 객체 value 할당에서 for문 부분을 primordials에 정의된 함수로 대체하여 성능 향상을 가져온 모습이 인상적이었습니다. 저도 doc에서 더 나아가 열심히 공부하여 테스트 코드 부분과 성능 개선 관련 오픈소스 기여를 해보고 싶다는 욕심이 생겼습니다.

그리고 멘토님께서 “Debugging Node.js Core”에 대해 강의를 해주셨습니다.

이번 강의에서는 Node.js에서 디버깅에 대해 차근차근 배울 수 있는 시간이 되었습니다. 구체적으로 Debugging Procedures을 Step별로 나누어서 Servcer로 실행하는 법, Client를 이용해 상기 Server에 접속하는 법을 아리켜주셨습니다.

더나아가 디버깅할 때 유용한 팁들과 C++로 Debugging은 어떻게 해야하는지 자세히 알 수 있는 시간이었습니다.

Challenges 활동을 하면서 느낀점

이번 Challenges 활동은 저에게 새로운 도전이었습니다. Spring과 JPA만 공부하던 제가 Node.js를 공부할 수 있는 좋은 활동이었고, 훌륭한 멘토님과 멘티분들과 같이 문제를 해결해 나가면서 새로운 안목을 기를 수 있었을 뿐만 아니라 더 열심히 개발 공부를 해야겠다는 욕심이 생기는 활동이었습니다.

또한 Challenges 활동 동안 Node.js와 오픈소스 기여 자체를 아예 몰랐던 제가 사소한 이슈 하나라도 도전하고 해결하려고 한 저의 모습이 자랑스러웠습니다. Node.js는 저에게 낯선 기술이었지만, 도전하고 배우는 과정에서 성취감을 느낄 수 있었습니다. 그리고 오픈소스 커뮤니티의 문화와 협업 방식을 직접 경험하며, 오픈소스 생태계에 매력을 느꼈습니다.

Masters(9주)

Node.js-event-loop

마스터 기간이 되고 맨 처음으로 한 활동은 멘토님의 nodejs-event-loop에 대한 강의를 수강하는 것이었습니다.

nodejs-event-loop 강의에서는

총 3가지를 배울 수 있었습니다.

먼저 Node.js의 싱글 스레드 모델입니다.

자바, 아파치 http 서버처럼 멀티 스레드로 각 클라이언트 요청을 처리하는 것과 달리 node.js는 일반적으로 싱글 스레드를 사용합니다.

싱글 스레드를 사용하여 많은 수의 클라이언트 요청을 다루고 이를 통해 스레드 동기화 이슈를 해결합니다.

더 나아가 싱글 스레드와 관련된 이벤트 주도 아키텍처에서 비동기 요청을 처리하는 방식을 배울 수 있었습니다.

이 후

라이브러리인 libuv에 대해 배울 수 있었고,

논 블로킹 작동방식과 이벤트 루프에 대해 코드로 자세히 배울 수 있었습니다.

이번 세미나를 통해 node.js의 싱글 스레드와 이벤트 루프에 대해 더 자세히 배워갈 수 있었습니다.

Bootstrap and Bindings

두 번째 강의는 Bootstrap and Bindings에 대한 내용이었습니다.


Bootstrap과 bindings는 주로 애플리케이션 초기화 및 외부 모듈과의 연결을 관리하는 과정에서 사용되는 용어입니다.

먼저 Node.js에서 부트스트랩 과정에서 환경을 생성하는 방법을 설명해주셨습니다. 이 과정들을 통해 Node.js 애플리케이션이 실행되기 전에 필요한 환경을 설정하고, 모듈을 로드하며, 애플리케이션의 주실행 흐름을 준비할 수 있습니다.

그리고 V8에서 JS Object를 생성하고 세팅하는 과정을 배울 수 있었습니다.

이 외에도 Node.js에서 JavaScript와 C++간의 데이터 전송 및 상호작용을 원활하게 하는 기술인 Object Wrapping 등을 배울 수 있었습니다.

Spring vs Node.js


그리고 멘토님께서 관심 있는 내용을 작성 후 공유하는 숙제를 주셨습니다.

그래서 저는 무엇을 할까 고민하던 중, 제가 계속 공부중인 Spring과 Node.js가 어떤 차이점이 있는지 자세히 학습하고 싶어서 이 주제로 벨로그를 작성하였습니다.

저는 총 0~5번호로 나누어 정리하였습니다.

제가 이 주제를 선택한 이유와 기술 개요, 특징 및 성능 비교, 느낀 점 등

같은 분야의 언어라 하더라도 매우 많은 점이 다르다는 점을 보고 신기했습니다.

그리고 이를 통해 node.js는 물론 제가 공부하는 Spring에 대해 더 자세히 공부할 수 있었습니다.

링크 : https://velog.io/@jaemm/Node.js-vs-Spring

오픈소스 두 번째 기여

먼저 저는 #53871 이슈에 대해 PR을 올렸습니다 53871 이슈는 Node.js에서의 웹 스토리지와 브라우저에서의 웹 스토리지 동작 차이에 대한 것입니다.

문제는 먼저 세션 스토리지로컬 스토리지로, Node.js에서 이 둘은 각각 현재 프로세스에 국한되므로 서버 측 렌더링과 같은 애플리케이션에서 중요한 역할을 합니다.

두 번째로 로컬 스토리지의 기원--localstorage-file 옵션 값을 사용한다는 점입니다.

추가로 명확히 해야 할 사항은 로컬 스토리지 파일이 여러 프로세스에서 동시에 접근 가능하다는 것과, 로컬 스토리지의 할당 용량이 10MB로 설정되어야 한다는 요청입니다.

이에 대해 저는 PR을 작성하였습니다. https://github.com/nodejs/node/pull/54652



이번 PR에서는 Node.js에서의 Web Storage 동작을 명확히 설명하고, 브라우저 환경과의 차이점을 문서화하는 작업을 진행했습니다. 이 PR은 기존에 제기된 이슈에서 다룬 내용을 기반으로 하며, 특히 Node.js에서의 세션 스토리지와 로컬 스토리지의 동작 방식이 브라우저와 다른 점을 구체적으로 다루었습니다.

Node.js 환경에서는 세션 스토리지와 로컬 스토리지가 현재 실행 중인 프로세스에 국한됩니다. 이는 브라우저에서의 사용자별, 요청별 스코프와는 다르게, 서버 측 렌더링과 같은 애플리케이션에 중요한 의미를 갖습니다. 또한, 로컬 스토리지는 --localstorage-file 플래그를 통해 지정된 파일을 기원으로 사용한다는 점이 문서화하었습니다.

추가로, 로컬 스토리지 파일이 여러 프로세스에서 동시에 접근할 수 있다는 점과, 로컬 스토리지의 할당 용량이 10MB로 제한된다는 내용도 명시하였습니다. 이를 통해 개발자들이 Node.js 환경에서 Web Storage를 사용할 때의 제약 사항과 동작 방식을 명확히 이해할 수 있도록 돕도록 하였습니다..

이 PR을 제출 후 All checks은 되었지만 이미 중복된 PR이 있어서 Merge는 되지 못했습니다.

자세한 내용은 Node.js 오픈 소스 기여해보기 (2)
참고하시면 되겠습니다!

이렇게 저의 두 번째 커밋은 마무리 되었습니다.

이러한 활동 외에도

이러한 많은 활동에 참여하였습니다.

더 많은 멘토님의 세미나와 모각코, 열정적인 디스코드 활동 등 열정적인 멘토 멘티분들에게 많은 걸 배워 갈 수 있는 시간이었던 것 같습니다.

Masters 기간 후기

이 기간 동안 정말 많은 것을 배울 수 있는 소중한 시간이었습니다. 현직자로 일하시는 멘토분들과 다양한 배경을 가진 대학생들과 함께 활동하면서, 각자가 다양한 이슈를 어떻게 찾아내고 해결해 나가는지를 배울 수 있었습니다. 또한, 많은 멘티분들이 열정적으로 참여하는 모습을 보며 저 역시 더욱 노력해야겠다는 동기를 얻었습니다. 무엇보다도, 오픈소스의 매력을 깊이 체감할 수 있던 시간이었습니다.

이슈를 탐색하고, 어떤 이슈를 어떻게 해결해야 할지 스스로 고민하며 접근했던 시간들은 저에게 큰 성장의 기회가 되었습니다. 특히, 다양한 국적과 배경을 가진 사람들이 서로 도우며 협력하는 모습은 매우 인상 깊었고, 오픈소스 커뮤니티의 강점이 무엇인지 몸소 느끼게 해주었습니다. 이러한 경험을 바탕으로 오픈소스 커뮤니티의 지속적인 활동에 참여하고자 다짐하게 되었으며, 시간이 된다면 내년에도 꼭 오픈소스 컨트리뷰션 아카데미에 참여하고 싶습니다.

하지만 아쉬움도 있었습니다. Spring Framework를 주로 사용해 개발해 온 저로서는 Node.js에 대한 경험이 부족했기에, 팀원들처럼 다양한 Node.js 관련 이슈에 적극적으로 기여하지 못한 점이 아쉬움으로 남았습니다. 그러나 이러한 경험이 저에게 동기가 되었고, 앞으로는 기여하려는 오픈소스의 기술과 관련된 내용을 깊이 학습하여 더 다양한 분야에 기여하고 싶다는 목표를 가지게 되었습니다. 이를 통해 보다 넓은 기술 스택을 기반으로 적극적으로 참여하며, 오픈소스 커뮤니티에서 의미 있는 성과를 이루고자 합니다.

추가적으로..

Masters 기간 이후 성과 공유회와 오픈소스 페스티벌 2024에 참여한 이야기는 길어질 것 같아, 여기에서 이어집니다. :)

0개의 댓글