Hibernate 개발자 분과 소통하며 Jira에 관련 이슈를 등록한 기점으로 오픈소스에 관심이 생겼고,
오픈 소스를 보는 것 자체가 너무 즐거워서 자바로 작성된 오픈소스들을 찾아봤다.
그 중, 우연히도 JabRef라는 논문 관리 오픈소스를 알게 됐다.
(사실, Hibernate, Spring, elasticSearch 심지어 Kafka까지 모두 찾아봤었지만, 워낙 대중이고 많은 사람들이 사용하는 만큼 내가 직접 버그를 발견하거나 올라온 이슈를 해결하기에 버거움을 느꼈다.)
JabRef e.V.
JabRef e.V. has 46 repositories available. Follow their code on GitHub.
github.com
그럼 내가 어떻게 오픈소스를 기여할 수 있었는 지, 어떤 내용으로 기여했는 지 정리해보자.
이슈 찾기
가장 먼저 해야할 일은 '이슈찾기'다.
하지만, 직접 사용해본 적 없는 오픈소스에 이슈를 스스로 찾는 건 매우 어렵다. 버그를 발견하거나 새로운 기능을 제안해야하는데, 실제로 사용해보지 않으면 이를 찾기 어렵기 때문이다.
이를 위해 대부분의 오픈소스들은 issue나 Jira를 활용하여 이슈들을 관리한다. 새로운 기능 추가 요구부터 각종 버그들까지 전세계 사람들의 다양한 의견이 오고간다.
JabRef 오픈소스는 정말 감사하게도 good first issue라는 태그를 달아 심리적 장벽을 낮추는 장치를 활용한다. (이건 오픈소스마다 다름.)
나는 아래와 같은 이슈를 골랐다.
모든 논문에는 발행된 저널이 기재되어 있다. 그리고 이 저널들은 축약된 이름들을 가지고 있으며, 논문의 저널을 쉽게 파악하기 위해 축약 기능을 활용한다. 하지만 문제는 전체 저널 이름에 대한 축약 기능이 작은 오타나 특수문자가 있을 때는 동작하지 않는 것이다. 이를 fuzzy matching(근접 문자열 매칭)을 활용해서 사소한 차이에 대해서도 저널 축약 기능을 넣어달라는 의견이었다.
코드 분석과 해결
이슈를 정했으니 이후엔 break point를 찍어가며 기존 저널의 축약 기능이 어떻게 동작하는지 파악했다. 축약 기능은
FP 형태로 코드가 작성되어 이해가 어렵지 않았다. taskExecutor를 활용해 스레드 풀에서 비동기로 abbrreviate(축약)을 수행하는 것이다.
핵심 비즈니스 로직
List<BibEntry> entries(축약할 저널 데이터들)에 대해 Set을 통해 작업이 중복으로 실행되지 않도록 하고 Callable을 사용하여 비동기적으로 결과값을 반환한다는 tasks를 정의한다.
이후, executeAll(tasks)를 통해 스레드 풀을 활용해 tasks를 병렬적으로 실행시키고 Future 형태로 결과값이 반환되도록 비동기 작업으로 설계된 것을 확인할 수 있다. (참고: future.get()을 하기 전까진 비동기 작업의 결과가 반환된지 알 수 없다, get() 요청에서 아직 결과처리가 되지 않았다면 결과를 기다린다.)
그럼 이제 정말 abbreviate()를 통해 축약 기능의 내부를 보자.
축약할 논문 데이터(entry)의 저널명을 text로 가져오고, 축약 정보가 들어있는 journalAbbreviationRepository에서 text와 일치하는 축약 객체가 있는지 확인하는 작업이다. 기존에는 isKnownName에서 text와 완전히 일치하는 저널 이름이 있는지의 여부 판단을 통해 축약 기능이 동작했다.
그리고, 여기에 fuzzy matching을 적용하는 것이 내 역할이었다.
축약 데이터에 완벽히 일치하는 데이터는 fuzzy matching을 적용하지 않아도 됐기에, 일치 여부를 먼저 판단하고 이를 고려하기는 것을 생각했다.
추가한 핵심 메서드
중간은 생략하고, 결국 내가 추가한 핵심 로직은 아래와 같다.
JournalRepository에 저장된 축약 데이터들에 대해 levenshtein distance를 적용하여 편집거리가 일정 수준 이하인 데이터에 대해서만 유사하다고 판단되는 축약 candidates들을 가져오는 것이다.
만약, 비슷한 저널들이 여러개 있다고 판단될 경우를 고려해 편집거리가 가장 낮은 순으로 정렬한 뒤 SIMILARITY_THRESHOLD 비교를 통해 제외하는 로직도 추가했다.
이후 검증을 위한 테스트 코드까지 작성하고 실제로 동작하는 것까지 확인한 뒤, PR을 올렸다.
결과는..
오픈소스 컨트리뷰터 성공..!
(https://github.com/JabRef/jabref/pull/12652)
마무리하며
Conversation이 30개인 것을 통해 알 수 있듯, 코드리뷰를 정말 꼼꼼히 해주셨고, 무엇보다 개발자분들이 너무나 친절하셨다. 그리고 이 과정이 너무나 즐거웠다. 무언가 사회에 진짜 내가 어떤 일을 한다는 느낌..? 앞으로도 자주 내가 할 수 있는 일이 없을지 둘러보는 미어캣이 될 거 같다. (사실 이미 다른 이슈를 찾고 풀려고 머리를 싸매고 있다.)
보면 볼수록 코드의 세계는 간단하면서도 복잡하다. 오픈소스를 보다보면 느끼는 것들은 코드가 글쓰는 것과 정말 유사하다고 느꼈다. 마치 하나의 책을 완성하기 위해 여러 사람들이 맡은 위치에서 원고를 쓰는..그리고 하나의 규칙과 흐름으로 그 책의 일관성이 유지되도록.. 정리하면 그냥 재밌다. 그게 전부다. 아마 오픈소스 관련 일은 계속 하게 될 거 같다.
저는 그럼 얼른 다음 이슈를 해결해보러 가보겠습니다.
'OpenSource' 카테고리의 다른 글
오픈소스 Hibernate 버그 PR 의견 제시에서 Jira 이슈 등록까지 (0) | 2025.03.01 |
---|