본문 바로가기
기록/회고

Golang 기반 툴 개발부터 오픈소스에 기여하기까지

by slowcloud_ 2025. 6. 13.

CLI에서 AI를 쓰고 싶다!

평소처럼 AI에게 무언가를 물어보기 위해 브라우저를 키던 중, 문득 이 과정이 상당히 귀찮고 번거롭다는 생각이 들었습니다. 북마크를 여는 것도 귀찮고, 로딩 페이지를 기다리는 것도 꽤 길다고 느껴졌습니다. 물어보려는 내용이 간단한 질의라면 더더욱 그랬습니다.

 

간단한 질의는 빠르고 간편하게 물어보고 싶었고, 그래서 빠르게 키고 활용할 수 있는 CLI 환경에서 AI에게 질의할 수 있는 도구를 만들어보기로 결심했습니다.

 

왜 Golang을 선택했는가?

우선 생산성이 높다는 말에 혹했습니다. go cli 도구를 활용해서 패키지를 관리하는 것이 꼭 npm, pip과 같았고, 퍼포먼스 또한 나쁘지 않다고 해서 끌렸습니다. 또한 고루틴을 통한 비동기 프로그래밍을 잘 지원한다고 하여서, 이번 기회에 배우고 활용해보면서 궁금증을 해소해보기로 했습니다.

 

rust 언어도 고려사항에 있었지만 선택하지 않았던 이유는, 당시 Gemini AI를 활용한 CLI 도구를 계획하고 있었는데, 아직 rust 기반 라이브러리를 공식적으로 지원하지 않아 선택하지 않았습니다.

 

생각보다 높은 진입장벽

처음엔 go.dev 사이트에서 제공하는 `A Tour Of Go`를 통해서 문법을 공부했습니다.

 

기본적인 문법 자체는 타 언어들과 비슷한 점이 많아 빠르게 익혔지만, Context, Iterator 등의 기능으로 넘어가는 시점에서부터 공부해야 할 것들이 많다고 느꼈습니다.

 

사용하는 것은 편리했지만, 무언가를 제대로 만들어보기 위해선 더 공부할 필요가 있다고 느껴졌습니다.

 

일단 만들어보자!

Golang을 다 공부하기에는 시간이 오래 걸릴 것이라고 판단했고, 자세한 부분들은 만들어보면서 익혀나가기로 결정했습니다.

 

우선 CLI 앱이므로, 간단한 명령어를 구현할 필요가 있다고 느꼈습니다. Golang 기반 CLI 라이브러리인 `cobra`를 활용하여 명령어를 구현해보기로 결정했고, hello-cobra 리포지토리를 만들어 간단하게 기능구현을 시도해본 뒤 뼈대를 구성했습니다.

 

이후 Gemini API Library를 사용하기 위해 구글 공식 문서를 읽어보았고, 구버전 라이브러리인 `generative-ai`와 새로 개발 중인 `genai`가 있다는 것을 알게 되었습니다.

 

자료 자체는 `generative-ai`가 많았지만, 이번 기회에 `genai`를 활용하여 개발해보기로 했습니다. `genai` 라이브러리에서 제공하는 예시 코드를 참고하면서 코드를 작성했고, 간단한 대화를 진행하는 데 성공했습니다.

 

CLI 환경에서 간단한 질의

 

이로써 CLI 환경에서 간단한 질의를 구현할 수 있었습니다.

 

좀 더 예쁘게 만들어보고 싶은데

기존의 의도였던 짤막한 질의응답 기능은 성공적으로 구현됐지만, 많은 내용을 함께 물어보기에 애로사항이 있었고, 대화를 이어서 진행하는 것 또한 불가능했습니다. 그래서 해당 문제를 해결하기 위해서 아예 채팅창 UI를 만들어보기로 결정했습니다.

 

CLI 환경의 UI를 구성하는 라이브러리를 찾아보던 중, bubbletea라는 golang 기반 TUI 프레임워크를 발견하게 되었습니다. charm.sh에서 제공하고 있으며, 내부적으로 bubbles와 같은 UI 컴포넌트를 활용해서 개발을 진행할 수 있었습니다. 예시 코드도 풍부하게 제공하고 있었고, 설명도 대체로 잘 되어 있어 잘 활용할 수 있었습니다.

 

TUI 기반 AI 채팅 도구

UI를 개발하면서 코드가 꽤 길어지게 되었고, 코드 가독성을 위해 Gemini API 코드를 분리하기로 했습니다. Gemini API 코드를 새로운 디렉터리로 옮기고 개발하던 중, Golang에서 자체적으로 테스트 코드를 만들고 실행하는 기능이 있다는 것을 알게 되었고, 이를 적극적으로 활용하여 개발을 진행했습니다.

테스트 코드 일부.

 

그리하여 마침내...

TUI 기반 채팅 도구 화면.

 

Gemini AI와 대화가 가능한 TUI 프로그램을 완성하게 되었습니다.

 

원래 의도했던 도구가 존재하지 않을까?

처음에 의도했던 CLI 명령어 기반 질의 도구와는 멀어졌지만, TUI 기반 AI 채팅 도구를 만들게 되었습니다.

 

기존에 의도했던 AI 명렁어 도구와 가까운 기능이 존재하지 않을까? 하고 찾아보던 중, `bubbletea`를 개발했던 곳에서 만든 mods라는 AI 명령어 도구가 있다는 것을 알게 되었습니다. 해당 도구는 CLI 플로우에 최대한 맞추어져 만들어진 도구였고, 기능들이 잘 구현되어 있었습니다.

 

소스코드 뜯어보기

해당 도구가 어떻게 만들어졌는지 궁금한 마음으로 소스코드를 둘러보던 중, Gemini 모델을 사용하는 코드가 있다는 것을 발견하게 되었습니다.

 

이슈와 풀 리퀘스트 등을 확인하면서 해당 모델을 사용하는 코드가 추가되었음을 확인하였고, 코드를 따라가면서 `GOOGLE_API_KEY` 환경변수에 Gemini API Key를 등록하면 사용이 가능하다는 것까지 확인하였습니다.

Gemini API를 사용하기 위해 GOOGLE_API_KEY로부터 키를 가져오는 코드

 

그러나 해당 프로젝트의 README에는 이와 관련한 내용이 없었고, 해당 모델을 사용할 수 있도록 기여하기로 하였습니다.

 

풀 리퀘스트 등의 양식은 어떤지, `CONTRIBUTE.md`에는 어떻게 쓰여있는지 등을 확인하고, 이에 알맞게 풀 리퀘스트를 등록하였습니다.

그리하여 오픈소스에 기여하게 되었습니다

그렇게 풀 리퀘스트를 넣고 이틀 뒤, 머지가 되었음을 알리는 메일이 날아오게 되었습니다.

머지된 풀 리퀘스트

 

이렇게 오픈소스에 첫 기여를 하게 되었습니다.

 

무엇을 얻었는가

처음엔 CLI 환경에서 간단하게 질의 가능한 도구를 만들려고 했지만, Golang을 익히고, 다양한 라이브러리를 익히고, 오픈소스에도 기여하는 새로운 경험을 쌓게 되었습니다.

 

Gemini API 코드를 분리하는 작업을 수행하였을 때, 분리한 코드를 편하게 사용하기 위해 클래스를 작성했지만, 단순히 래핑만 하고 있는 클래스인 데다가 메소드는 기존의 Gemini 객체의 코드를 그대로 사용하고 있어서, 관리해야 할 코드만 늘어나고 사용이 불편해졌습니다. 덕분에 유지보수하기 좋은 코드가 무엇인지 고민하고 돌아보게 하는 기회가 되었습니다.

 

작성했던 코드도 아쉬운 부분이 많아서, 앞으로도 조금씩 손보는 작업을 수행할 것 같습니다.

 

참고

https://github.com/SlowCloud/gemini-golang

 

https://techblog.woowahan.com/2526/

해당 블로그 글을 많이 참고하여 글을 작성하였습니다.

'기록 > 회고' 카테고리의 다른 글

Copypaste 토이 프로젝트 중간 회고 (1)  (6) 2025.06.19