오픈소스 멘토링 3기 참여 후기

728x90

계기

회사에서 인증 서버로 Keycloak을 사용하고 있었다. 하지만, Keycloak이 회사의 인증 관련 요구사항을 감당하지 못해서 Keycloak의 Extension 중 하나인 PhaseTwo의 Keycloak-orgs를 사용하고 있었다. 그런데 그 Keycloak-orgs에서 조차도 원하던 모든 기능이 있었던 것이 아니다. 우리는 SSO를 지원해야하고, 고객이 로그인하는 순간 본인이 속한 조직 중에서 어떤 계정으로 로그인할 지 결정할 수 있어야했다. Keycloak이나 Keycloak-orgs에는 이런 기능이 존재하지 않았다.

 

그래서 그냥 내가 그 기능을 구현해버렸다. 바야흐로 Active Organization SPI

 

SPI를 Keycloak에 붙여서 해당 기능이 잘 동작하는 것을 확인했고, 이 기능이 분명 필요한 사람들이 더 존재할 거라는 생각에 Issue를 열어서 손수 만든 SPI를 널리 공유했다.

 

https://github.com/p2-inc/keycloak-orgs/issues/149

 

Active Organization SPI · Issue #149 · p2-inc/keycloak-orgs

active-organization-spi.zip Hello. I am a backend engineer from Logblack inc. I am using the PhaseTwo organization of keycloak extension with happiness because it is possible to manage multi-tenanc...

github.com

이게 웬 걸? 반응이 꽤 좋았다. 그래서 나중에 구현한 기능을 PR까지 열어서 머지해볼 생각이 있었다.근데, 일도 바쁘고 해서 차일피일 미루다가 잊어버렸다. -_-;

 

그런데!! 나중에 확인해보니, 다른 사람이 기능을 제대로 구현하여 PR을 올렸고, 머지까지 완료해버렸다. 해당 기능이 정말로 필요하셨던 것 같다. 내가 올린 SPI를 정말 좋아하셨는데, 거기서 그치치 않고 아이디어를 캐치하여 기능을 고도화하여 코드로 구현해버리셨더라

 

https://github.com/p2-inc/keycloak-orgs/pull/150

 

Implement active organization. by MGLL · Pull Request #150 · p2-inc/keycloak-orgs

Hello there, if you are still interested into "active organization" feature, here is a contribution. Summary Implemented "Active organization" based on user's attributes. Created mappers for activ...

github.com

오.. 잘 만들었다.

 

그런데 사뭇 아쉬운 생각이 들었다.

 

내가 할 수도 있었던 건데….

(그리고 사실 user attribute를 사용한 모양새도 그렇게 마음에 들지 않았다.)

(게다가 내가 사용한 이미지 소스를 그대로 사용했더라.)

뭐 어쩌겠나? 내가 미뤄두다가 못한 건데

 

곰곰히 생각해보면, 해당 기능을 프로젝트 내에서 구현하는 것은 그렇게 어렵진 않았을 것이다. 다만, 오픈소스에서 기여해본 경험이 없다 보니 어떻게 해야 할 지 몰라서 어영부영하다가 그냥 포기했던 듯하다. 그렇게 이 일은 아쉬움을 남기고 다시 금새 잊혀졌다.

 

그런데 이번에 Medium에서 오픈소스 멘토링을 모집한다는 글을 보았다. (GDG 송도, 김인제)

https://medium.com/opensource-contributors/오픈소스-멘토링-3기-참여자-모집-오픈소스-멘토링-3기-참여자를-모집합니다-6d8c334bbbb8

 

⭐[마감되었습니다] 오픈소스 멘토링(온라인) 3기 참여자를 모집합니다!

함께 오픈소스 기여를 경험하고 배운점을 공유하실 멋진 분들을 기다립니다!

medium.com

솔직히 어떻게 해당 글을 찾았는지도 기억이 안 난다. 아마 무의식적으로 계속 해당 사건을 아쉽게 생각하고 있었는지도 모른다. 마법에 이끌리듯이 글을 클릭했었다.

고민할 것 없이 바로 지원을 했고, 내 사연을 구구절절 적었다. 나의 진심이 통했는지 바로 합격했고, 그렇게 3기 오픈소스 멘토링에 함께할 수 있었다.

 

진행 과정

 

이슈 찾기

사실 오픈소스 기여는 이슈 찾기가 9할이라고 해도 과언이 아닐듯 하다. 모든 이슈가 해결하기 어려운 주제가 아니라 해결하기 쉬운 주제도 꽤 많다. (사실 본인이 이번에 기여한 이슈도 매우 쉬운 편에 속한다.)

 

링크는 인제님이 직접 Medium에서 작성한 글인데

https://medium.com/opensource-contributors/오픈소스-멘토링-기여-가이드-오픈소스-멘토링에서-10명-넘는-오픈소스-컨트리뷰터가-첫-기여를-성공할-수-있었던-방법-3ff09c9b6f83

 

[오픈소스 첫 기여 가이드] 오픈소스 멘토링에서 10명 넘는 오픈소스 컨트리뷰터가 첫 기여를 성

적절한 이슈 선정이 가장 중요합니다!

medium.com

솔직히 해당 글만 잘 이해해도 금방 오픈소스에 기여해볼 수 있으리라 생각한다.

 

이렇게 이슈 찾는 방법을 이해한 상태에서 모든 멘티들이 집중하여 본인이 해결해볼 이슈들을 고르는 시간을 가졌다. 글쓴이 본인도 주제를 서너 개 골랐는데, 이미 다른 참여자가 진행중인 이슈 또는 완료된 PR들이 있어서 또 몇 개는 날라갔다.

 

문제점 분석하기

이렇게 각자 집어둔 이슈들을 상대로 멘토님과 함께 분석하는 시간을 가졌다. 코드 내부를 살펴보니 생각보다 로직이 어렵지 않았다. 그동안 코드를 한 번도 까보지 않아서 몰랐던 것이다. 그저 사용법만 익혀서 사용만 하다보니 코드를 까볼 생각을 못 했었고 그래서 막연하게 오픈소스 기여는 어렵다고만 생각해서 직접 기여를 할 생각을 못했던 것이다. 하지만, 작정하고 차분히 앉아서 코드를 들여다보니... 다 이해가 가능한 것들이었다.

 

본인이 선택한 이슈는 members를 가져오는 API에서 Bulk한 query parameter를 지원하는 문제였는데, 그저 받은 query를 String[]으로 쪼개서 받으면 끝인 문제였다. :)

 

코드 작성 후 PR 올리기

본인이 선택한 이슈는 구현하기 정말 간단했기 때문에 코드 몇 줄 추가하니 해결되었다. 다만, Edge case를 모두 고려하기 위해서 테스트 코드는 좀 빡빡하게 작성했다. 그렇게 구현 기능과 Test Code 모두 작성하여 PR을 올렸다.

 

이슈에 코멘트 달기

멘토님이 알려준 꿀팁인데 PR을 올리고 나서 이슈에도 PR링크와 함께 Comment를 작성하는 것이다. 이렇게 하면 메인테이너가 좀 더 빨리 PR을 확인할 가능성이 높아진다.

 

메인테이너가 리뷰

메인테이너가 PR에 코멘트를 달았다. query가 비어있는 경우 String[]에 null을 넣는 것이 마음에 안 들었나보다.

 

코드 수정 후 재도전

Query parameter가 비어있을 경우 Empty Array를 집어넣도록 코드를 수정하고 해당 edge case에 대해서 테스트 코드까지 추가하여 다시 리뷰 또는 머지를 기다렸다.

 

Merge

그렇게 코드를 수정 후 push를 하고 나서 하루 쯤 지났나

멘토님이 오픈소스 멘토링 카톡방에 알려주셨다.

"바로 머지되었네요!!!"

 

와우!

빠르게 머지가 되어서 너무 좋았다.

https://github.com/p2-inc/keycloak-orgs/pull/208

 

Searching organization members with multiple name as query parameter by millwheel · Pull Request #208 · p2-inc/keycloak-orgs

I changed some codes of searchForMembersStream() so that it can search the members of organization with multiple user's name as query parameter. This is related to this issue 132 With this function...

github.com

사실 메인테이너는 해당 기능이 꼭 필요한건지 의문스러워하는 것이 보여서 머지가 안 될 수도 있겠다고 생각하고 있었는데, 머지가 되었다는 소식이 들리니 상당히 기분이 좋았다.

 

멘토링 이후 소감

솔직히 Active Organization에 비해서는 매우 간단하고 지엽적인 기능이라 보잘 것 없지만, 그래도 첫 오픈소스 기여에 성공했다는게 뿌듯했다. 만약, 해당 오픈소스 멘토링을 진작에 들었으면 Active Organization 의 PR을 뺏기진 않았을 것이다.

 

흠흠… 본인이 자꾸 Active Organization에 집착하는 것 같아서 설명 좀 하고 넘어가겠다.

 

Keycloak은 보통 realm을 단위로 고객 정보를 관리한다. 근데 이 realm이 바뀌면 모든 Auth 과정을 재설정해야하는 불편함이 있다. 그래서 realm이 아니라 조직 단위로 고객을 관리하고 싶으면 Keycloak-Orgs을 도입해야한다. 근데 Keycloak-Orgs를 도입해도 한 유저가 복수 개의 조직에 속해있다면, 어떤 조직의 계정으로 접속하는지 구분할 방법이 이전에는 없었다. 근데 본인이 그 기능을 구현한 것이다.

 

암튼 Active Organization은 꼭 필요한 개쩌는 중요한 기능이었다. (집착할 만 하죠?)

어쨌든, 한 번 PR 올리고 머지까지 성공하니 이런 생각이 들었다.

'생각보다 별로 안 어렵네?'

 

오픈소스라고 해서 모든 Issue가 복잡한 것이 아니었고, 충분히 도전해볼만한 과제가 꽤 많아보였다.

(아 근데, 스프링은 꽤 어려울 것 같다. 이미 풀타임 오픈소스 컨트리뷰터가 많아서...)

이렇게 방법을 알게 되고, 재미를 붙이게 되니 앞으로도 오픈소스에 계속 기여해볼 것 같다.

 

자… 그럼,

바로 다음 이슈 해결하려 가봐야 해서

급하게 글을 줄여본다.