-
[포케덱스] - 오픈소스 기여 관련 회고프로젝트/포케덱스 2025. 7. 14. 17:54728x90반응형
오늘은 오픈 소스기여 관련해서 겪었던 내용에 대해서 포스팅을 해보겠다.
사실 결론부터 말하자면 실질적인 기여가 되지는 않았다. 하지만 이런 경험은 나에게는 소중한 기회였기 때문에 계기 부터 결과까지 전반적인 회고를 남겨보려고 한다.
PokéAPI 사용계기
포케덱스 프로젝트는 PokéAPI에서 제공하는 API를 사용해 포켓몬 데이터를 앱에서 사용할 수 있도록 만들어진 서비스다.
PokéAPI는 포켓몬 게임과 관련된 모든 데이터를 가지고 있는 API이기 때문에 도감을 만들기 안성 맞춤인 API였다.
그 중에서 kinkofer/PokemonAPI는 PokéAPI를 Swift에서 간편하게 사용할 수 있도록 만든 wrapper 라이브러리다. 원본 데이터를 URLSession으로 직접 요청하는 작업은 이미 경험해봤기 때문에, 이번에는 외부 라이브러리 문서를 읽는 연습도 할 겸 사용해보기로 했다.
기존에는 네트워킹 코드를 직접 구현해야 했지만, 이 라이브러리를 사용하면 Swift Concurrency를 통해 간편하게 요청할 수 있다. 이번 프로젝트의 목적은 네트워크 코드 구현이 아니라 아키텍처 준수와 직접적인 백엔드 서버 구축이었기 때문에, 네트워킹 부분은 간편하게 활용하는 데 중점을 두었다.
// 메타몽에 대한 정보를 비동기적으로 가져오는 예시 let ditto = try await PokemonAPI().pokemonService.fetchPokemon("ditto") // or let ditto = try await PokemonAPI().pokemonService.fetchPokemon(132)기본적인 사용 방법은 이와 같았다.
https://pokeapi.co/#google_vignette
PokéAPI
Try it now! Need a hint? Try pokemon/ditto, pokemon-species/aegislash, type/3, ability/battle-armor, or pokemon?limit=100000&offset=0. Direct link to results: https://pokeapi.co/api/v2/pokemon/ditto Resource for ditto { "abilities": [ { "ability": { "name"
pokeapi.co
https://github.com/kinkofer/PokemonAPI
GitHub - kinkofer/PokemonAPI: Pokeapi wrapper, written in Swift
Pokeapi wrapper, written in Swift. Contribute to kinkofer/PokemonAPI development by creating an account on GitHub.
github.com
문제 발생
PokeAPI Swift를 사용하는 과정에서 지속적으로 디코딩 에러가 발생했다.
해당 라이브러리에는 JSON 데이터를 처리할 수 있는 DTO가 내부적으로 정의되어 있으며, 원래는 요청된 데이터를 올바르게 디코딩해 활용할 수 있도록 설계되어 있다.
그래서 해당 라이브러리를 뜯어보기로 했다. 다른 사람들이 작성한 코드도 분석하기 아주 좋은 상황이였다.


엥...? 타입이 다른데..?
이건 치명적인 에러다. 해당 DTO는 기본적으로 포켓몬 정보를 불러올 때 사용되며, swift문법 상 정확하게 타입이 맞지 않으면 포켓몬 정보 자체를 불러올 수 없다.
이 때 당시에 두가지 문제가 있었다.
- SPM으로 다운로드 받은 라이브러리고, 사용자가 직접 커스텀할 수 없다.
- 이 부분만 따로 네트워크 코드를 짜기엔 생산적인 부분이나, 유지보수 측면에서 너무 비효율적이라 생각했다.
이런 비슷한 문제가 생기면 또 DTO를 새로 만들어야하는 문제도 있고, 만약 예외처리를 하면 이 라이브러리를 사용하는 이유가 줄어들 것 같아 방법을 고민하던 중 해당 라이브러리를 fork해서 로컬에서 수정하기로 결정했다.
문제 해결
일단 정의했던 문제대로 DTO를 수정했다.

뭐 다른 것이 문제가 있나 더 보던 중에 역시나.. 또 있었다..

(개발자님..! 이건 이름이 달라서 에러가 납니다..!)
또한 디코딩을 위해 필요한 DTO가 아예 없는 경우도 있어서 추가했다.
자세한 수정 사항은 아래 링크에 있다.
https://github.com/kinkofer/PokemonAPI/pull/25/files
#24 - PKMItemHolderPokemonVersionDetail class Change DTO data type by QuaRang1225 · Pull Request #25 · kinkofer/PokemonAPI
Of the data in the class PKMitemHolderPokemonVersionDetail, the "rarity" data actually gives a value of Int form, but the "jsonParsingError" error appears when trying to decode ...
github.com
이렇게 수정한 내용으로 기존에 배포용 브랜치인 main에 PR을 했다.
거진 2년 동안 답변이 없었지만,, 드디어 2년만에 답변을 받았다..!

답변은 다음과 같았다.
- 7.0.0 버전에서 문제가 수정됨
- 일부 스프라이트 속성을 지원하기 시작함
- 새로 추가된 타입들 중 사용처를 확인하지 못한 건 반영 안 함
아마 개발자분은 other라는 DTO의 사용처를 찾지 못한 듯 보였다.
내가 잘못했나..? 생각하고 찾아보니 Other라는 DTO는 API 내부에 존재는 하지만 아직 사용되지 않는 타입이기 때문에 멋대로 추가할 수 없다는 말로 해석했다.
사실 이 부분 말고는 내가 찾아낸 부분은 버전 7.0.0에서 개발자분이 모두 추가해 주셨다!



느낀 점
비록 내 PR이 merge되지는 않았지만, 적용 시켜주셨다는 긍정적인 답변을 받았다.
아마 개발자님의 커밋 컨벤션과 코드 컨벤션이 달라서일 수도 있고, 외부인의 PR은 merge하지 않는 분이실 수도 있고, 내 코드가 마음에 안들어서 일수도 있을 것 같다..
이번에는 DTO 구조관련된 내용이지만, 다음 부터는 성능적인 개선이나 아키텍쳐적인 부분도 꼭 발견해서 기여해보고 싶다..!
'프로젝트 > 포케덱스' 카테고리의 다른 글
[포케덱스] - LazyVGrid 무한스크롤 구현하기(feat. SwiftUI + TCA) (2) 2025.08.19 [포케덱스] - TCA의 Action을 관리해보자(feat. @CasePathable) (4) 2025.08.18 [포케덱스] - iOS앱 Google AdMobs 광고 추가하는 방법 (1) 2024.06.04 [포케덱스] - Configuration 관리 (0) 2024.05.01 [포케덱스] - Error: sessionTaskFailed (1) 2024.05.01