계기
회사에서 인증 서버로 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
이게 웬 걸? 반응이 꽤 좋았다. 그래서 나중에 구현한 기능을 PR까지 열어서 머지해볼 생각이 있었다.근데, 일도 바쁘고 해서 차일피일 미루다가 잊어버렸다. -_-;
그런데!! 나중에 확인해보니, 다른 사람이 기능을 제대로 구현하여 PR을 올렸고, 머지까지 완료해버렸다. 해당 기능이 정말로 필요하셨던 것 같다. 내가 올린 SPI를 정말 좋아하셨는데, 거기서 그치치 않고 아이디어를 캐치하여 기능을 고도화하여 코드로 구현해버리셨더라
https://github.com/p2-inc/keycloak-orgs/pull/150
오.. 잘 만들었다.
그런데 사뭇 아쉬운 생각이 들었다.
내가 할 수도 있었던 건데….
(그리고 사실 user attribute를 사용한 모양새도 그렇게 마음에 들지 않았다.)
(게다가 내가 사용한 이미지 소스를 그대로 사용했더라.)
뭐 어쩌겠나? 내가 미뤄두다가 못한 건데
곰곰히 생각해보면, 해당 기능을 프로젝트 내에서 구현하는 것은 그렇게 어렵진 않았을 것이다. 다만, 오픈소스에서 기여해본 경험이 없다 보니 어떻게 해야 할 지 몰라서 어영부영하다가 그냥 포기했던 듯하다. 그렇게 이 일은 아쉬움을 남기고 다시 금새 잊혀졌다.
그런데 이번에 Medium에서 오픈소스 멘토링을 모집한다는 글을 보았다. (GDG 송도, 김인제)
https://medium.com/opensource-contributors/오픈소스-멘토링-3기-참여자-모집-오픈소스-멘토링-3기-참여자를-모집합니다-6d8c334bbbb8
솔직히 어떻게 해당 글을 찾았는지도 기억이 안 난다. 아마 무의식적으로 계속 해당 사건을 아쉽게 생각하고 있었는지도 모른다. 마법에 이끌리듯이 글을 클릭했었다.
고민할 것 없이 바로 지원을 했고, 내 사연을 구구절절 적었다. 나의 진심이 통했는지 바로 합격했고, 그렇게 3기 오픈소스 멘토링에 함께할 수 있었다.
진행 과정
이슈 찾기
사실 오픈소스 기여는 이슈 찾기가 9할이라고 해도 과언이 아닐듯 하다. 모든 이슈가 해결하기 어려운 주제가 아니라 해결하기 쉬운 주제도 꽤 많다. (사실 본인이 이번에 기여한 이슈도 매우 쉬운 편에 속한다.)
링크는 인제님이 직접 Medium에서 작성한 글인데
솔직히 해당 글만 잘 이해해도 금방 오픈소스에 기여해볼 수 있으리라 생각한다.
이렇게 이슈 찾는 방법을 이해한 상태에서 모든 멘티들이 집중하여 본인이 해결해볼 이슈들을 고르는 시간을 가졌다. 글쓴이 본인도 주제를 서너 개 골랐는데, 이미 다른 참여자가 진행중인 이슈 또는 완료된 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
사실 메인테이너는 해당 기능이 꼭 필요한건지 의문스러워하는 것이 보여서 머지가 안 될 수도 있겠다고 생각하고 있었는데, 머지가 되었다는 소식이 들리니 상당히 기분이 좋았다.
멘토링 이후 소감
솔직히 Active Organization에 비해서는 매우 간단하고 지엽적인 기능이라 보잘 것 없지만, 그래도 첫 오픈소스 기여에 성공했다는게 뿌듯했다. 만약, 해당 오픈소스 멘토링을 진작에 들었으면 Active Organization 의 PR을 뺏기진 않았을 것이다.
흠흠… 본인이 자꾸 Active Organization에 집착하는 것 같아서 설명 좀 하고 넘어가겠다.
Keycloak은 보통 realm을 단위로 고객 정보를 관리한다. 근데 이 realm이 바뀌면 모든 Auth 과정을 재설정해야하는 불편함이 있다. 그래서 realm이 아니라 조직 단위로 고객을 관리하고 싶으면 Keycloak-Orgs을 도입해야한다. 근데 Keycloak-Orgs를 도입해도 한 유저가 복수 개의 조직에 속해있다면, 어떤 조직의 계정으로 접속하는지 구분할 방법이 이전에는 없었다. 근데 본인이 그 기능을 구현한 것이다.
암튼 Active Organization은 꼭 필요한 개쩌는 중요한 기능이었다. (집착할 만 하죠?)
어쨌든, 한 번 PR 올리고 머지까지 성공하니 이런 생각이 들었다.
'생각보다 별로 안 어렵네?'
오픈소스라고 해서 모든 Issue가 복잡한 것이 아니었고, 충분히 도전해볼만한 과제가 꽤 많아보였다.
(아 근데, 스프링은 꽤 어려울 것 같다. 이미 풀타임 오픈소스 컨트리뷰터가 많아서...)
이렇게 방법을 알게 되고, 재미를 붙이게 되니 앞으로도 오픈소스에 계속 기여해볼 것 같다.
자… 그럼,
바로 다음 이슈 해결하려 가봐야 해서
급하게 글을 줄여본다.
끝