뮤팟에서 CTO 및 다수의 팀을 관리하는 케빈입니다
2023년을 돌아보며
굿바이 2023!
2023년은 나의 인생에 있어서 정말 큰 일들이 많았던 한 해였다.
•
작년에는 상상도 못했던 결혼을 했다! (2022년에는 연애도 안했었는데..)
•
혼자 살던 집을 정리하고 송파구의 새로운 집으로 이사를 했다
•
해외여행을 2번이나 다녀왔다.
개인적인 일들이 많았던 만큼 뮤팟에서의 이벤트도 많았는데, 한번 천천히 살펴보자
2023년 목표 되돌아보기
1.
뮤팟 서비스 신규 투자 유치하기!
2.
요즘 흥하는 언어인 Rust를 익혀보기
3.
해외 여행 가기
2023년 목표로 설정했던 3가지중 무려 2가지를 달성했다. 첫번째는 해외 여행을 가는 것이고 두번째는 뮤팟의 두번째 투자를 받은 일이다.
2018년에 창업하고 이제 거의 6년이 다 되는 시점에 블루포인트 파트너스로부터 두번째 투자를 받았다.
개발자의 입장에서 2023년은 확장성에 대해 고민하는 한 해였던것 같다.
창업 5~6년차가 넘어가면 점점 직원들의 실력과 시너지, 메뉴얼 그리고 확장 가능한 코드베이스에 대한 고민이 점점 커져갔다.
대규모 코드 이사 Rails에서 NextJS 로 코드베이스 마이그레이션
뮤팟의 코드베이스는 프론트는 바닐라 JS + HTML (embedded ruby)로 되어있고, 백엔드는 Ruby On Rails로 되어 있었다. 하지만 이런 체제로 5년이 넘는 시간동안 코드를 작성하면서 다양한 문제가 발생하기 시작했다.
1.
관련 언어 및 프레임워크를 쓰는 개발자를 찾을 수 없다!
2022년부터 사업이 확장 국면으로 접어들고, 나의 업무가 개발보다는 팀원의 관리 및 매니징의 역할이 커지면서 백엔드 코드를 작성할 수 있는 시간이 줄어들었고, 신규 채용한 개발팀원에게 ROR을 가르치면서 다양한 문제가 발생했다.
프로덕션 레벨의 웹 백엔드 코드는 생각보다 복잡했고, 주니어의 입장에서 미래가 밝지 않은 ROR을 학습하도록 하는건 쉽지 않았다.
Ruby라는 언어를 쓰는 대한민국의 개발자는 과연 몇명이나 될까? 페이스북에 관련 커뮤니티도 살펴봤었지만 국내에 ROR 관련 모임이나 움직임은 사실상 죽어있는 상태였다.
2.
최대 생산성보다는 확장 가능한 유지보수가 더 필요해졌다
ROR(Ruby On Rails)는 스타트업의 입장에서는 정말 최적화된 프레임워크라고 생각한다.
만약 내가 다시 창업을 한다고 하더라도 나는 ROR을 이용해서 웹 백엔드를 구축할 것이다. 그만큼 ROR은 한번 학습하면 개발 생산성을 극대화시킬수 있는 프레임워크이고, 뮤팟은 지금까지 그 덕을 톡톡히 봐왔다.
하지만 ROR은 사이즈가 커질수록 작동 속도의 특면에서 굉장히 불리하다. 속도가 느리다는건 더 많은 서버 자원이 필요하다는 것이고, 서버 자원을 더 동원하기 위해서 수직적 확장을 지속하다가 언젠가는 수평적 확장을 고민해야 한다.
ROR은 Monolitic한 프레임워크라서 새로운 프러젝트를 따로 파기보다는 한 프로젝트의 몸집을 키우기 좋은 구조로 되어있다. 특히 Gem을 이용한 기능확장을 하게되면 내가 쓴 코드가 아니기 때문에 확장의 측면에서 상당한 개발 능력을 요하게 된다.
3.
최신 프론트엔드 트랜드와 너무 동떨어지게 된다
Rails를 활용해서 react, vue와 같은 라이브러리를 쓰지 못하는 것은 아니지만 이들을 활용하면 레일즈 특유의 생산성을 살리지 못하게 된다.
또한 생태계가 작기 때문에 이런 프론트엔드 트렌드에 맞춰 커뮤니티가 발전하지 못하고 있는 상황이었다.
서비스가 커질수록 재사용성과 data binding 방식의 프론트엔드 개발이 점점 필요해지고 있었고, Rails와 바닐라 프론트는 이런 요구를 충족시켜주지 못했다.
Bye, bye Rails…
결국 레일즈를 떠나보내고 장기적 관점에서 새로운 언어와 프레임워크로 마이그레이션을 하게 되었다
1.
후보 언어 및 프레임워크 선정:
a.
뮤팟 서비스는 자연어 검색이 굉장이 많은 서비스이기 때문에 응답속도가 빠른 SPA방식의 언어 라이브러리를 쓰더라도 SSR의 지원 여부가 매우 중요했다.
b.
이에 SSR 지원이 가장 좋은 NextJS를 프론트 프레임워크로 가져가고 백엔드 프레임워크는 ExpressJS로 선정하였다.
2.
Rails, NextJS 마이그레이션을 위한 실질적인 방안 모색:
a.
마이그레이션을 진행하기 위해서는 두개의 프레임워크가 공존하는 방식과 하나의 프레임워크로 완전히 바꾸는 방식이 존재했다
b.
뮤팟 서비스는 5년간의 코드 작성으로 이미 레거시 코드의 양이 너무 방대하여 결국 분할하여 마이그레이션을 진행하기로 결정하였다.
c.
다음의 도식과 같이 개발환경도 Nginx를 도입하여 일부 페이지만 NextJS로 도입하고 나머지는 Rails 페이지를 유지하기로 결정했다
graph TD Nginx --바꾸지 못한 URL--> Rails Nginx --마이그레이션 완료한 URL--> NextJS
Mermaid
복사
Nginx를 앞에 두고 마이그레이션 이전의 URL은 Rails로 보내주고, 마이그레이션 된 부분은 NextJS로 연결해주게 만들어서 부분적인 마이그레이션을 프로덕션 환경에 도입할 수 있었다.
특히 뮤팟은 검색엔진에 예민한 서비스라 URL 변경이 없이 마이그레이션 되는 것이 중요해서 이런 방식을 사용하였다.
3.
마이그레이션을 위한 개발환경 및 배포환경 세팅 및 이에 따른 문제 상황 해결
a.
주로 이 부분부터 이노&타카가 전담하여 진행하였고, 나는 기술적인 난이도가 높은 문제 위주로 조언을 주면서 프로젝트를 진행하였다.
b.
가장 문제가 되었던 부분은 세션을 Rails와 NextJS가 이어서 유지하는 부분이었고, 이를 위해서 Rails측의 인증 방식을 쿠키 방식에서 JWT 방식으로 변경 진행. JWT토큰을 NextJS와 Rails가 똑같이 encrypt & decrypt 하도록 하여 세션 정보를 공유하는 방식으로 개발했다
c.
그 외에도 다양한 의사결정이 필요했다. Express 내의 ORM 선정, 이벤트 트래킹 관련 패키지 마이그레이션, 무중단 배포를 위한 Docker 및 명령어 세팅 등 안정적인 개발환경 세팅 및 컨벤션 세팅에 상당한 시간을 투자해야 했다
4.
지금까지의 기술적 노하우와 팀원들의 노력으로 마이그레이션 작업은 24년에 무사히 마무리 될 것으로 예상하고 있다
누가누가 다운받았나 알아낼 수 있는 워터마크 기술 도입
CID 기술로 음원을 유튜브 내에서 식별할 수 있게 되자, 누가 이 곡을 불법으로 유통하였는지? 혹은 합법적인 경로로 사용하였더라도 이를 입증할 수 있는 기술적 기반이 없어 불법 사용에 대해서 식별할 필요성이 생겼다.
이런 문제를 해결하기 위해 오디오 워터마크 기술을 도입하여 음원을 다운받거나 녹음을 했을 때 최초 유포자를 찾아낼 수 있게 되었다.
관련 기술을 도입할 때 오픈소스 라이브러리를 활용했는데, 예상치도 못한 부분에서 식별이 어려워서 라이브러리 코드를 전반적으로 읽고 조정을 일부 하느라 시간이 꽤 걸렸다.
음원 중심의 서비스에서 영상 편집자를 위한 서비스로..
기존의 뮤팟의 주력 상품인 음원 중심 상품 구성에서 영상 템플릿을 2022년에 추가했었다. 문제는 영상 템플릿의 종류와 수가 부족했고 무엇보다 이용률이 좀 적은 편이었다. 그래서 이용률을 끌어올리고, 타 서비스 대비 차별화를 위해서 영상템플릿은 지난 1년간 지속적으로 노력을 기울인 분야였다.
1.
매주 직접 영상 템플릿과 관련한 레퍼런스를 조사하여 쉐인과 함께 제작할 템플릿을 선정
2.
영상 템플릿의 경쟁력만으로 뮤팟에 유입되도록 하기 위하여 구글 검색 최적화를 진행했다. 특히 중복된 페이지, 혹은 필요없는 페이지가 구글 검색 결과에 인덱싱 되지 않도록 조치를 취해서 보다 의미있는 페이지가 검색에 노출되도록 설정했다.
3.
이러한 일련의 조치로 구글에 영상 템플릿 관련 노출되는 페이지 수를 늘렸고, 내부 콘텐츠를 보강하여 검색 순위도 높일 수 있었다.
2024년 목표
1.
뮤팟 티켓을 더 소비할만한 컨텐츠 카테고리 추가하기
2.
뮤팟 서비스 운영하는 언어가 총 5가지가 되도록 만들기
3.
일본어 서비스 활성화하





