Search
🦊

이노

뮤팟에서 백엔드 개발을 맡고 있는 이노입니다~! 정중하게 인사드립니다.
Bing AI로 생성된 이미지 입니다.

적응하는 햇병아리 이노

작년 2023년 1월 초에 입사하여 다시 1월이 돌아왔다. 처음 입사했을때도 지금처럼 추웠는지 기억이 잘 안난다. 아마도 새로운 곳이니 긴장을 하느라 추운줄도 모른 것 같다. 나는 백엔드 파트를 맡은 개발자로 뮤팟에서 일을 시작하게 되었다. 사실 백엔드만 전문적으로 맡아서 개발을 해본 적이 없다. 그렇지만 스스로 개발 분야를 가리지 않기에 어떤 파트를 맡아도 열심히 할 자세가 있었다. 기존에는 SPA(Single Page Application) 기반 프론트엔드 개발에 익숙했고, 뮤팟은 Ruby on Rails(이하 RoR)라는 익숙하지 않은 언어와 프레임워크를 사용하여 내가 경험한 개발 환경과 차이가 있었다. 그리고 프론트엔드 파트는 .erb 라는 확장자 파일로 Rails 에 의해 HTML 파일이 동적으로 생성되는 환경이었다. 물론 RoR이 전통적이고 정석적인 웹 서비스 개발 방식이다. 또한, JavaScript로 DOM을 제어할때는 JQuery를 사용하고 있어서 이 부분 역시 적응해야했다. 제일 처음에 수행한 일은 서비스 되고 있는 기능이 아닌 관리자가 사용하는 페이지에서 특정 기능이나 통계를 구현하는 일이었다. 잘 모르는 Ruby on Rails의 ActiveAdmin, ActiveRecord를 이용해 특정 기능을 구현하고 UI를 표시했고 SQL과 ORM으로 통계를 가져와서 처리했다. 그리고 Chart.js 라이브러리를 V2.9.4에서 V4.1.1으로 업데이트를 진행하면서 바뀐 부분을 수정하기도 하였다. 처음에 부담이 적은 관리자 기능부터 구현하니 뮤팟이 사용하는 기술에 대한 이해도가 생겼고 개발에 대한 즐거움도 가득했다. (그러나 이 즐거움은 추후 변하기 시작한다.  )

음악을 정리하는 이노

이제 뮤팟 서비스에서 wav 파일을 제공해야하는 일이 다수 발생하여 기존 곡과 신규 곡에 wav 파일을 추가해야했다. 기존에는 mp3 파일만 AWS S3에 업로드 되어있었고, 이제 기존곡의 mp3 파일과 동일한 음악을 가진 wav 파일을 찾아야 했다. 다행히 3000+여곡은 엑셀 시트로 잘 정리가 되어 있어서 백업 하드에서 잘 찾아 업로드 배치 코드를 작성해서 S3에 올렸다. 그러나 고통은 나머지 곡에서 시작한다. 엑셀 시트에 정리되어 있지 않은 파일들이 간혹 이름이 다르거나, 버전 표기가 다르거나, 또 파일이 없는 경우 등으로 처음에는 백업 하드에서 폴더를 이리저리 찾아가며 음악이랑 숨박꼭질을 했다.

“ 음악아 어디있니 ? ”

넷플릭스에서 가져왔습니다.
백업 하드에서 파일을 이리저리 찾다가 일종의 패턴을 발견하고는 바로 코드를 짜서 곡을 찾아 업로드를 진행했다. 그리고 평균적으로 3GB 정도되는 ZIP 파일을 압축해제하고 파일을 찾는건 너무 느려서 압축을 해제하지 않고 파일이름을 검색할 수 있는 방법을 찾아서 코드를 작성해보기도 했다. 이러한 wav 업로드 작업을 3주 동안 했는데 스크립팅을 정말 많이 했다. 이때 루비라는 언어가 스크립팅에 매우 유리한 언어로 느껴져서 이 언어를 좋아하게 되는 계기가 되기도 했다. 결국 300+여곡 정도는 손으로 찾아서 업로드를 했고 또 뮤팟 초창기에 업로드된 곡들은 wav 파일이 존재하지도 않아서 결국 mp3 파일을 wav 파일로 변환하여 구색만 맞추기도 했다. 그래도 결과적으로 기존 모든 곡에 대한 wav 파일을 업로드하는 긴 작업을 마무리했다.

뮤팟을 갈아엎는 이노

Bing AI로 생성된 이미지 입니다.
뮤팟에 익숙해질때 쯔음인 3월 Ruby on Rails에서 Node.js 기반으로 마이그레이션을 진행한다는 말을 케빈으로부터 들었다. 굉장히 갑작스러웠던 이유는 이제 Rails에 적응하고 RoR을 더 심층적으로 공부 해볼 참이었기 때문이다. 아쉬움을 뒤로 한채 케빈이 먼저 Next.js를 기존 Rails 프로젝트에 모노레포 방식으로 구성을 하였고, 나는 Next.js만으로 서버를 구성하기에는 자유도와 Node.js의 서버측 라이브러리와의 통합이 쉽지 않을 것 같다고 느꼈다. 미디엄에서 좀 찾아보니 Next.js에 커스텀 서버로 Express.js를 붙여서 사용하는 사례가 있었고 케빈과 상의해서 Express.js를 연동하기로 했다. 몇 번의 삽질 끝에 매끄럽게 Next.js와 Express.js를 연동시켰다.
하지만 단순히 Express.js만 연동했다고 끝이 아니었다. 제일 먼저 로그인과 회원가입을 구현 해야했는데 Ruby on Rails에는 존재하지만 Express.js에는 존재하지 않는게 많았다. 그냥 거의 없었다. Express.js는 단순히 HTTP 요청과 응답, 미들웨어를 손쉽게 다룰 수 있는 인터페이스만 제공하는 작고 가벼운 라이브러리이기 때문이다. 그래서 데이터베이스와의 쿼리를 쉽게 다룰 수 있는 ORM 선정, 기본적인 웹 보안에 필요한 라이브러리, Bigint를 JSON 으로 바꾸어주는 라이브러리 등 Rails에서는 그냥 하면 되던 기능들이 Node.js와 Express.js에서는 전부 라이브라리들을 찾아서 구현해야하니 힘든 점이 많았다. 그리고 타입 안정성이 프로젝트에 미치는 영향을 그간 경험에서 크게 느꼈기에 TypeScript 도입을 팀에게 완고하게 말했고 이를 적용하는 과정에서 Next.js와 Express.js에서 서로 동일하게 tsconfig를 맞추는 과정도 고통스러웠다.
이 혼돈 Node.js 세상에서는 설정 하나를 바꾸면 Next.js를 빌드하니 CSS가 로드되지 않는 문제나 또 어떤 경우는 이미지가 나타나지 않는다. 또 서버가 nodemon을 통해 재시작될때 타입체크로 너무 느려서 SWC를 적용해서 2배 빠르게 개선해보기도 했다. 엔지니어링을 하는 기분이 들어서 좋은 경험으로 생각되지만 꽤나 고통스러운 작업이었다. 이외에도 i18n 국제화를 위한 yml parser도 직접 만들거나 Rails 구조에 맞춰서 Express.js 서버 패턴도 폴더 구성을 해보았다.
많은 우여곡절과 심층적인 세팅이 필요했지만 잘 돌아가는 로그인, 회원가입 등을 보면 뿌듯하다. Rails, 쏭피디, 소셜로그인 등 유저 토큰을 통합하는 과정도 쉽지는 않았는데.. 너무 암울했던 이야기만 써내려가는 것 같아서 그만 써야겠다. 그래도 다 해보고 나니 서버 애플리케이션을 개발할 때 필요한 기능이 어떤 것이 있어야 하는지 알게 되었고 어떤 장단점을 갖는지 판단할 수 있게 되었다.

데이터 뽑아주다 지친 이노

뮤팟 서비스 마이그레이션을 진행하다보면 타 부서에서 필요한 데이터를 요청주시곤 한다. 입사 초기에는 단순히 SQL 만으로 뽑을 수 있는 데이터를 그대로 드렸는데 이제 좀 센스있게 이것저것 디테일한 부분을 정리해서 드린다. 즉 후처리를 Node.js로 한다. 그 이유는 한때 적발 프로그램을 만들때 구성해놓은 나의 스크립트 프로젝트 뼈대를 이용하면 데이터를 가공하는데 매우 편했다. 쿼리를 해오고 JSON으로 저장하고 XLSL로 뽑고 이 과정이 코드 몇 줄이면 끝나도록 유틸 코드를 만들어두어서 빠른 처리가 가능하도록 했다.
그런데 가끔 일정 기간을 두고 동일 데이터를 요청해주시거나 특정 데이터는 뽑는데 별로 어렵지 않은 경우가 존재한다. 그래서 데이터베이스 읽기 권한만으로 데이터를 쉽게 뽑을 수 있는 도구가 있는지 알아보다가 Redash, Metabase 등을 찾았는데 Metabase가 비개발자도 다루기 쉽고 유지보수 하기 쉬워보였다. 권한 관리나 설정도 매우 쉽게 추가하거나 뺄 수 있어서 만족하듯 골라 케빈에게 설득하고 바로 도입했다. 우리의 우주최강 마케터 블루가 매우 유용하게 사용하고 계셔서 뿌듯함이 하늘을 찢었다.
Metabase 동작 화면 (출처: 메타베이스 공식사이트)
Metabase 도입으로 데이터 대시보드 구성 SQL문 없이 데이터 쿼리 등으로 비개발자도 손쉽게 뮤팟 데이터베이스에서 원하는 데이터를 가져올 수 있도록 했다. 데이터 쿼리에 어려움을 갖고 계시면 대신 만들어 드리거나 가서 가르쳐 드리기도 했다. 슬슬 다양한 데이터를 메타베이스에서 꺼내 올 수 있어서 타 부서로부터 데이터 요청이 확연히 줄었다.

쥐 잡아온 이노

뮤팟은 앞으로 글로벌 서비스를 더 확대하기 위해서 다양한 언어를 지원해야하는데, 마이그레이션을 완전히 끝내지 못한 시점에서 언어를 계속 추가할 때마다 개발자의 부담은 계속 늘었다. 케빈이 들고 온 해답은 쥐 한마리였는데, 살펴보니 꽤 만족스러운 오픈소스였다.
Tolgee API Key 정보만 있다면 비개발자가 웹사이트에서 버튼 하나를 누르고 마우스로 클릭하면 직접 텍스트를 수정할 수 있었고 기계번역도 자체적으로 지원하는 매우 편리한 번역 소프트웨어였다. 현재 우리 프로젝트에 통합을 시키려면 기존 텍스트를 모두 Tolgee로 바꾸어야했는데 그 작업이 괴로웠으나 끝내고 나니 정말 만족스러웠고 앞으로 언어를 추가하는 것에 대한 부담이 확 줄었다. 언어 추가에 대한 전쟁.. 이젠 끝이 보였다.

1년 동안 이노가 하고싶었던 것, 신뢰를 주는 동료 되기

회사에서 일을 한다는 건 누군가와 함께 일해야하는 상황이 반드시 있다는 겁니다. 그래서 사내 동료에게 신뢰를 준다는 건 제가 중요하게 느끼는 요인 중 하나입니다. 그래서 다른 동료로부터 부탁받은 일에 대해서는 믿음직하게 잘 끝내려고 많은 노력을 기울였습니다. 그 결과가 다른 동료들에게 얼마나 좋았을지는 비밀일기니 적지 않겠습니다. 그간 제 노력이 충분한 신뢰를 드렸길 소망합니다. 호호..
뮤팟에서 처음으로 1년을 보내면서 비밀 일기라는 것도 처음 작성해보는데 괜히 어렵게 느꼈다 싶을만큼 재미있게 쓰게 되었습니다. 새로운 것도 많이 도전해보고 결과도 살펴볼 수 있어서 보람찬 일도 많았고, 특히 제게 무한한 신뢰를 주시는 타카, 케빈과 함께 일할 수 있어서 개발 경험이 정말 좋았습니다. 아직 뮤팟에서 해결해나가야할 과제가 산더미처럼 있습니다. 잘 해결할 수 있도록 오는 2024년도 화이팅입니다.