오픈소스 첫 기여 과정 - Spring AI

Jake·2024년 8월 22일
16
post-thumbnail

안녕하세요 이번시간에는 오픈소스 첫 기여에 대한 경험을 공유하고자 합니다.


목차

  1. 시도는 하였지만 실패한 Line 의 abc-user-feedback 오픈소스

    • 1개의 Issue
  2. 우연한 글을 통해 시도한 Spring AI 오픈소스 기여

    • 2개의 Issue 와 PR

Line abc-user-feedback

처음 시도한 오픈소스는 Line의 abc-user-feedback 이었습니다.


시도한 이유

올해 3월 당시 인턴으로 다니던 스타트업 회사를 다니고 있었습니다. 그런데 매번 고객사와의 대응이 모두 전화로 진행이 되고 있는 상황이었으며 다른 팀원들에 비해 비교적 여유로웠던 저는 이 이슈에 대해 제가 어떻게 도움을 줄 수 있을까를 고민하고 있었습니다.

저는 이전에 Goorm 에서 진행하는 시야가 넓은 개발자는 무엇이 다를까 - 세미나 에 참석하여 세미나를 들은 적이 있었습니다. 이야기 내용 중 LINE의 김영재님께서 유저의 피드백을 빠르게 반영하기 위해 오픈소스를 만들었으며 많은 분들이 사용하였으면 좋겠다 라고도 하셨습니다.


저는 고민을 하던 찰나 이전 세미나 내용이 떠올라 저희 회사에 필요하다고 생각하여 반영을 해보자라는 생각을 하였습니다.

이를 저희 회사에 반영한다면

  • 전화로 오는 요청들을 이후에, 그리고 한 번에 효율적으로 처리할 수 있다고 생각
  • 당시에는 전화 요청이 오면 즉각적으로 처리되어야 했기 때문에(팀원들의 집중력 저하 vs 크리티컬한 이슈 해결 사이의 trade off) 이를 개선시키고 싶었음
  • 동시에 오픈소스를 사용하며 이 소스코드에 기여를 하고 싶었기 때문

입니다.


실제 사용하며 부족한 부분을 기여한다는 점이 제게 의미있는 기여라고 생각했었습니다.


Line의 abc-user-feedback 은 유저의 피드백을 적극 반영하기 위해 아래와 같이 Feedback Tag 와 Issue Tracker, Dash Board 등 다양한 기능이 있었습니다.

그래서 사용하기 위해 세팅을 완료하였고 Jira 를 연결하는 과정에서 Sample Feedback 기능이 있으면 좋을 것 같아 Sample feedback and Sequence diagram Issue 를 남겼습니다.


설득 과정

어느정도 회사에 반영하기 위한 세팅이 되었다는 판단을 하였고, 실제 도입 이전 부서 책임님께 이 기능을 회사에 도입하기 위해 설득을 시도하였습니다.


설득의 과정은 아래와 같이 진행하였습니다.

  1. 현재 회사의 문제 상황 설명 (전화가 오면 즉각 처리되어야 한다)
  2. 해결책 제시 (전화가 오면 즉각 처리되어야 한다 -> 이를 피드백 형태로 개선시킨다)
  3. 해결책 반영을 위한 리소스(인력, 소프트웨어, 서버 등), 준비

책임님은 제 얘기를 진지하게 들어주시고 고민 후 말씀해주신다고 하셨습니다.


하지만 다음날 아래의 이유로 거절하셨습니다.

  1. 지금 정도의 문의는 전화로 충분하다. (하루 10건 이내)
  2. 상황에 따라 즉각적으로 처리 되어야 한다.
  3. 도입 이후 지속적인 관리, 리소스가 필요하다.

즉, 제가 제시한 내용은 오버 엔지니어링이었습니다.


물론 아이디어를 제시해준 부분에 대해서는 고맙다고 해주셨고 스스로 고민한 점은 좋게 봐주셨지만 실제 회사 사정과는 조금 거리가 있었던 내용이었습니다.


느낀점

그래서 이 내용을 듣고 "잘못 접근하였구나. 먼저 여쭤보고 찾아볼걸 .." 이라는 생각을 하게 되었습니다.

회사는 회사에 꼭 필요한 일들을 진행하며 우선순위가 괜히 있는것이 아니라고 생각이 들었습니다.


그래서 이후에 어떠한 고민을 할때에는 반드시 저의 생각을 혼자두지 않고 지속적으로 나누는것이 좋다고 생각이 들었습니다.

왜냐하면 저 이슈를 두고 고민하고 세팅하는데에 걸린시간이 대략 2-3일(하루 3시간) 정도가 소요 되었지만 만약 제가 적절히 고민 후 바로 여쭤보았다면 이 이슈는 대화로 짧게 2-30분 내에 해결 될 문제였기 때문입니다.


Spring AI


두번째 시도는 Spring AI 오픈소스입니다.

저는 이전 GDSC Seoultech 2기로 활동하며 GDG 의 Slack 채널에 가입되어있었습니다.

우연히 커뮤니티에서 오픈소스 멘토링을 진행 을 한다는 소식을 접하고 평소 관심이 있던 저는 오픈 채팅방에 가입해 꾸준히 어떤내용들로 대화가 오가는지 지켜보고 있었습니다.


오픈소스 멘토링 커뮤니티는 "오픈소스 기여는 함께 하면 더 빨리, 멀리 나아갈 수 있습니다!" 라는 모토 아래, 커뮤니티 리드인 인제님을 중심으로 기여에 필요한 도움을 드리고 있습니다.

오픈소스 멘토링이 궁금하신 분들은 오픈소스 멘토링 소개 글을 한 번 읽어보시는 걸 추천드립니다.


우연한 계기, 인제님의 피드백

그러던 중 LinkdIn 알고리즘에 의해 현준님의 피드에 있는 Spring AI에 기여 글을 읽은 것이 Spring AI를 알게되는 계기가 되었습니다. (LinkdIn 알고리즘에게도 감사합니다..) 그래서 오픈소스에 관심이 있던 저는 fork 를 하여 소스코드를 살펴보았습니다. 하지만 모든 소스코드를 살펴보기에는 양이 너무 방대하였고 이해하기도 어려웠습니다.


저는 "어떻게 하면 빠르게 명확하게 기여할 수 있는 부분을 찾을 수 있을까 ?" 를 고민하였습니다.
그래서 Spring Docs를 통해 개념적인 부분을 짚고 넘어가였고

"의도를 쉽게 알 수 있는 테스트코드를 활용해볼까?" 라는 생각과 함께 통합 Test를 진행하여 실패하는 Test의 소스코드를 살펴보았습니다.


동시에 오픈소스 멘토링 오픈 채팅방을 통해 피드백을 요청했습니다. 저는 오픈소스에 기여한 경험이 없어서, Issue를 작성할 때 주제가 적절한지, 코드가 올바른지, 다른 실수는 없는지 등 여러 가지 걱정이 들었습니다. 하지만 약 15분 정도의 피드백을 받고 나서는 그런 걱정은 모두 사라졌고, 오픈소스에 대한 이해와 동기부여가 더욱 커졌습니다. (개인적으로 인제님께 커리어 관련 질문도 궁금하여 가볍게 여쭤보았고 답변도 해주셔서 감사했습니다.)

제가 받은 피드백은 아래와 같습니다.


  • JsonReader에서 다른 오픈소스는 어떻게 구현이 되어있는지 찾아보고 메인테이너들을 설득해보자
    • 이렇게 하는 것이 더욱 설득력이 있다
  • Test 객체를 수정하자
    • 지금은 모든 요소들의 depth가 1이다. 이 depth를 늘려가며 테스트를 진행해보자
  • 지금은 ObjectMapper를 하드코딩하여 넣어놨다.
    • 이것을 조금 더 유연하게 사용자가 원하는 객체로 만들 수 있도록 생성자를 수정해보도록 하자.
  • Todo 없애기

개인적으로 피드백을 받는 것도 감사하였고 누군가가 뒤에서 서포트를 해준다는 사실이 매우 큰 힘이 되었습니다.


이 피드백을 바탕으로, 앞으로도 꾸준히 오픈소스에 기여하겠다는 결심을 하게 되었습니다.


Issue

저는 아래 2개의 Issue를 생성하였습니다.


PDFReader

실패한 PDF Reader 테스트에서 PDF Reader란 PDF 파일을 읽어 Header 와 footer 를 제외한 메인 내용들이 잘 읽혀지는지에 대한 테스트였습니다. 그래서 assertThat(allText).doesNotContains() 메서드로 테스트를 진행하였을때 성공이 되어야 하지만 제 로컬 환경에서는 실패가 되었습니다. 이 결과를 본 메인컨테이너는 "왜 테스트가 실패하였는지 모르겠다. CI의 green은 test결과를 보장한다" 라는 말을 하였습니다.


관련 PR: Replace doesNotContains and Collectors.joining()

그래서 의문을 가지고 다시 살펴보니 Window 와 Mac 차이에서 오는 개행문자 이슈 관련하여 System.lineSeparator() 문제를 의심해보았지만 명확한 이유를 파악하지 못한채 이슈 및 PR을 Close 하였습니다.


JSON Type Detection

위의 PDFReader 에서 테스트가 실패하여 해당 클래스와 관련있는 Reader 클래스를 살펴보기 시작하였습니다.


관련 PR: Add JSON type detection to handle both arrays and objects

여기서 JsonReader 클래스를 발견하였고 주석으로 // TODO, not all json will be an array 라고 적힌 것 을 확인하였습니다.


오픈소스에서 만약 주석 //TODO 를 발견하게 된다면 이는 기여할 기회라고 생각합니다. 왜냐하면 오픈소스의 경우 어떤 주제로 기여할지를 고민하는것이 기여 과정의 많은부분을 차지할 수 있지만 // TODO 와 같은 경우는 어떤 주제인지 명확하기 때문입니다.


이후 이 메서드에 대해서 개선점을 아래와 같이 고민해보았고 PR을 요청하였습니다.


Json 처리 방식 개선

기존에는 Json에 대한 정보를 읽어올때 아래와 같은 배열 객체를 objectMapper.readValue() 를 통해 List<Map<String, Object>> 로 변환하고 있었으며 이 방법은 Json 이 배열 형태로만 온다고 가정하고 있었습니다.

Json의 형태는 다양하기 때문에 Json 정보를 읽어오는 부분을 objectMapper.readTree() 를 사용하여 Json을 JsonNode로 파싱한 뒤, Json이 배열인지 여부를 isArray() 메서드로 확인하고 각각 처리하는 내용으로 수정하였습니다.

이를 통해 Json이 배열이 아닌 경우에 대해서도 대응할 수 있도록 하였습니다.


메서드 분리

기존에는 get() 메서드 내에서 모든 작업을 처리하고 있었습니다.

Json 데이터를 처리하는 로직을 parseJsonNode() 라는 JsonNode를 파싱하는 메서드로 나누어 책임을 분리하고 가독성을 높였습니다.



Json 객체 depth

기존에 있던 bikes 의 객체 리스트의 depth 는 tags에 있는 1이 최대였습니다. 다양한 객체의 형태에 대응하기 위해 depth를 최대 4로 가지는 person 객체를 만들어주었습니다.

테스트 코드 작성

수정한 부분에 대해 테스트코드를 작성하여 의도한 대로 동작하는지에 대해 검증을 하였습니다. 이 부분에 대해서도 인제님에게 긍정적인 피드백을 받았습니다.


개선점

아직 부족한 부분이 많습니다. 제가 생각한 개선점은 아래와 같습니다.

  • 병렬처리는 신중하게 사용하자.
    • StringBuilder는 동기화를 보장하지 않으므로 StringBuffer를 사용하거나, 제거하자.
  • 코드 작성시 다른 오픈소스에서 작성된 방식을 참고하자
    • SpringBoot: readJson() -> ((bytesRead = reader.read(buffer)) != -1)
    • HashMap: putVal() -> ((p = tab[i = (n - 1) & hash]) == null)
      • 이전에 HashMap 소스 코드를 볼 때도 이와 유사한 방식으로 작성된 것을 보고 개인적으로 흥미로웠습니다. 다음 기여에서는 가능하다면 이러한 코드 스타일을 적용해보고 싶습니다.
  • 이전에 작성한 주석을 다시 읽고 메인테이너의 고민을 이해하면서, item의 크기를 어떻게 설정하는 것이 적절할지 고민해보았습니다. 크기에 따라 처리될 수 있도록 코드를 분리하는 것도 고려해봐야 할 것 같습니다.

Merge 성공

위와 같이 PR 을 요청하고 약 3개월지 지난 후 어제 성공적으로 Merge가 되었습니다.

오픈소스는 메인테이너들이 개인 시간을 내어 진행하는 것으로 알고 있습니다. 그래서 비교적 응답이 느릴 수 있고 PR 요청부터 Merge가 되는 시간이 길어질 수 있습니다.

이러 점들을 감안하여 여러 PR들을 다양하게 적극적으로 생성해보시는 것도 추천드립니다.


오픈소스 커뮤니티 소개

저는 이전부터 오픈소스에 대해서 관심이 많았습니다. 무엇보다도 Public 하게 공유하고 도움을 주고 받으며 공통된 목표를 향해 개선시켜나가는 문화가 좋았습니다.

처음에는 어떻게 기여할지를 몰랐지만 이번 Spring AI 기여를 통해 의지와 관심이 있다면 충분히 기여할 수 있다는 것을 알게되었습니다. 그리고 오픈소스 커뮤니티에서 도움을 요청하면 도움주실 많은 분들이 기다리고 있는 것도 알게되었습니다.

아래는 오픈소스 멘토링 소개 링크 입니다. 오픈소스에 관심있으신 분들은 한 번 읽어보시기를 추천드립니다.


오픈소스 멘토링 소개

2개의 댓글

comment-user-thumbnail
2024년 8월 23일

소중한 오픈소스 기여 후기글 작성해서 공유주셔서 감사합니다!!ㅎㅎ

1개의 답글

관련 채용 정보