즐겨 가는 카페가 하나 있었다. 지금까지 먹어본 커피 중 가장 최고의 맛을 내는 아인슈페너를 만드는 곳이다. 디저트는 그저 그렇지만 커피 하나만큼은 끝내준다. 하지만 문제가 하나 있었다. 가게 인스타그램부터 먼저 확인하고 방문해야 한다는 점이다. 어떤 날은 단축 운영을 하기도 하고, 또 다른 날은 아예 매장 문을 열지 않기도 한다. 이 집 커피를 마시려고 갔다가 수없이 발걸음을 되돌리며 얻은 나름의 지혜였다. 이런 일이 꽤 잦았다. ‘가고 싶어도 가지 못하는 곳'이라고 생각이 되자, 이제는 거의 가지 않는다.

비단 오프라인에서만 경험할 수 있는 이야기가 아니다. 온라인에서도 흔히 마주할 수 있는 문제다. ‘트래픽'이 이 문제를 유발할 가능성이 가장 높다. 커피 맛이 좋아 같은 매장을 여러 차례 방문하듯이, 사용자 또한 본인 니즈에 부합하는 서비스를 자주 이용하게 된다. 그러면서 입소문이 퍼지면서 점차 더 많은 사람이 이용하는 인기 서비스로 부상한다. 그러다가 갑자기 트래픽(방문자 수)이 폭증하면서 서비스 지연 또는 오류가 생긴다. 한 번도 아니고 여러 차례 비슷한 일이 반복되자 그사이 고객은 다른 대체재로 눈을 돌리게 된다.

트래픽이 급증하는 와중에도 서비스는 항상 안정적으로 제공해야 하는 이유다. 그렇지 않으면 고객 신뢰와 매출을 모두 잃게 될 수도 있다. 특히 ‘결제'와 관련된 서비스는 더욱 민감하다. 만반의 대비가 필요하다. 이 모든 건 개발팀의 ‘손'에 달린 문제라고 해도 지나침이 없다.

빠르게 시장성을 검증하고 정식 출시를 해낸 이후, 단시간에 무서운 속도로 늘어난 이용자를 감당해야 하는 삼쩜삼에서도 안정화를 고려한 개발이 중요했다. 신고가 몰리는 특정 기간에 갑자기 급증하는 트래픽을 유연하게 대처하기 위해 비용효율성을 고려한 인프라 구축도 필요했다. 자비스앤빌런즈 개발팀은 어떻게 이 문제를 해결했을까? 김병석 최고개발책임자(CTO)를 만나서 그 해답을 들어봤다.

[ 이미지 1 ] 김병석 CTO

※이 글에서는 개발 분야에서 쓰이는 언어나 제품 이름을 좀 더 명확하게 표현하기 위해 한글이 아닌 알파벳으로 표기했습니다. 예) 라라벨→Laravel



"빠르고 간결하게" 웹사이트 구축

'돈받자'는 기업의 미수금 관리의 편의성을 높여주고자 선보인 서비스다. 하지만 실제 가입 고객의 80%는 기업이 아닌 개인이었다. 예상과는 다른 결과를 본 자비스앤빌런즈는 재빠른 시장 조사를 통해 개인이 돌려받고 싶은 니즈가 가장 큰 '세금' 관련 서비스로의 피봇팅(pivoting)[1]을 시도했다. 종합소득세 신고를 도와주는 버전으로 시장 검증을 빠르게 해보자는 논의마저 나왔다.

이를 위해서는 고객과의 접점 창구가 되는 웹 애플리케이션(사이트)부터 빠르게 구축할 필요가 있었다. 자비스앤빌런즈 개발팀은 자비스를 만들 때 이미 사용해봐서 잘 아는 Vue.js[2]로 웹 프론트[3]를 빠르게 구축했다. Vue.js는 웹의 내용(html), 디자인(CSS), 함수(Javascript)를 나눠서 개발하는 기존의 웹 개발 방식과 유사하다. 그래서 웹 애플리케이션 개발 경험이 있는 디자이너과 백엔드 개발자와도 협업이 한결 수월한 편이다.  

프론트 API[4]는 자비스를 만들 때 썼던 CodeIgniter[5]가 요즘 트렌드인 '빠르고 효율적인 개발'과 결이 맞지 않다고 판단, 같은 PHP로 작성된 Laravel로 구현했다. Laravel을 설정값[6]으로 운영하면 애플리케이션 응답 속도가 느리다고 느껴질 수도 있지만, 성능 튜닝을 하면 CodeIgniter에 준하는 속도를 낼 수가 있게 된다.

“개발 숙련도에 따라서는 CodeIgniter와 Laravel 그 어떤 걸 이용해도 빠르게 베타 서비스를 만들 수 있겠죠. 하지만 두 프레임워크를 써본 결과, 실제로는 ORM(Object Relational Mapping) 지원 여부가 중요했습니다. ORM은 개발에서 사용하는 객체(object)와 데이터베이스(database)의 데이터를 자동 연결(mapping)해주는 기술입니다. 개발자가 직접 SQL 질의문을 작성하지 않고도 데이터베이스를 조회할 수 있게 해주죠. 이 덕분에 개발자는 객체 모델링만 신경 쓰면 되니, 자연스럽게 업무 효율은 높아지게 됩니다.”

[ 이미지 2 ] ORM은 객체와 관련 데이터베이스를 자동으로 연결해준다.

이렇게 만들어진 돈받자 종합소득세 신고 버전으로 4월 한 달간 베타 테스트를 진행했다. ▲사용자 홈택스 정보를 연동해와서 예상 환급액을 보여준다, ▲종합소득세 신고 이후 실제로 환급금이 통장에 실제로 입금이 된다, 이렇게 2가지 가설을 베타 테스트 단계에서 빠르게 검증하고자 했다. 그 결과, 두 가설이 제대로 동작함을 확인함과 동시에, 처리 과정에서 발생할 이슈를 미리 파악할 수 있었다. 서비스명을 돈받자에서 삼쩜삼으로 바꾸며 회사의 명운을 건 최후의 도전장을 내밀었다.


"안정적이고 확장성이 높은" 웹사이트로의 전환

2020년 5월에 삼쩜삼을 출시한 후부터는 가입자가 꾸준히 늘었다. 서두에서 밝혔던 대로 언제나 한결같은 서비스를 제공해야 할 필요가 생겼다. 예기치 않은 시스템 오류 발생 확률을 줄이려면, 많은 개발자로부터 이미 충분한 검증을 받은 ‘국민 기술'로 갈아탈 필요가 있었다.

이에 웹 백엔드 프레임워크를 Laravel에서 Spring으로 전환했다. 대한민국에서는 Java의 입지가 확고해 범용성 측면에서 최고 우위를 갖는다. 특히 정부에서 채택한 전자정부 표준 웹프레임워크가 Spring일 정도로 굉장히 오래전부터 사용돼 왔다. 컴파일언어(예:Java)가 스크립트 언어(예:PHP)보다 보안 측면에서 대체로 더 우위에 있다는 인식도 이런 선택에 영향을 미쳤다[7].

“Spring는 오랜 세월을 걸쳐서 만들어진 '틀'로 인해 개발 자유도가 다소 떨어질 수는 있습니다. 지켜야 할 규칙이 많아지니까요. 하지만 반대로 모두가 통일된 규약을 반드시 지켜야 하는 만큼 협업이 편해지는 이점이 생깁니다. 누구 한 사람이 다른 팀으로 오가도, 기존 아키텍처와 코드를 빠르게 이해할 수 있죠."

하지만 Spring은 개발에 필요한 많은 기본 설정 파일을 직접 작성해야 한다는 점에서 사용하기가 까다롭다. 이런 복잡한 환경설정을 자동화해 Spring을 쉽게 사용할 수 있도록 돕는 툴이 바로 Spring Boot다. 개발에 필요한 기본 설정값뿐만 아니라, 라이브러리 의존성 관리, 버전 자동 관리 등의 기능을 제공한다. 이 덕분에 초기 개발이 빠르고 쉬우며, 서비스 유지보수에 들이는 시간과 노력도 줄일 수 있다.

[ 이미지 3 ] 삼쩜삼 웹 프론트와 애플리케이션 프레임워크 변천사

사용자가 급증하는 속도만큼 요구사항도 늘어난다. 이 요구사항을 빠르게 반영하려면 개발 편의성을 높이는 요소도 고려하지 않을 수 없다. 이에 웹 프론트도 JavaScript와 Vue.js에서 Typescript와 React.js로 변경했다.

동적 타입 언어인 JavaScript에서는 개발자가 자료형(타입)을 직접 정의할 필요가 없어 개발 자유도가 높다. 하지만 이는 대규모 애플리케이션 유지보수 시 복잡도를 높이는 요인이 된다. 실행 도중 예상치 못하게 발생하는 자료형 오류를 예방하기가 어려워서다. 반면, TypeScript는 이런 컴파일 단계에서 자료형 오류의 조기 발견이 가능해 개발 안정성을 높일 수 있다.

기존 Vue.js로는 웹 프론트의 유연성과 확장성을 높이는 재구조화가 어려웠다. 반면, React.js는 새롭게 공부해야 하는 범위가 넓어서 초기 진입 장벽이 낮지 않은 편이기는 해도, 다양한 라이브러리를 활용한 재구조화가 상대적으로 쉽다. 코드 구현이 자유롭다는 점과 컴포넌트화를 통한 재사용성을 높이는 설계 역시 장점이다.


트래픽 폭증에 대비한 서비스 인프라 개선

5월'은 누구나 쉽게 예상할 수 있는 '대규모' 트래픽이 몰리는 '시점'이다. 종합소득세 정기신고 기간이라서다. 이에 개발팀은 기능 개발에 우선 집중하고, 새로운 5월을 맞이하기 직전에 인프라 개선 작업을 진행할 계획을 세웠다.

2021년 1월, 갑자기 사흘간 대형 포털 사이트 1위에 오르며 트래픽이 폭발적으로 증가했다. 그동안 아르바이트, 플랫폼 노동자, 프리랜서 등 (인적용역) 사업소득 또는 기타소득을 내는 긱 워커나 N잡러만 타깃으로 했던 삼쩜삼이 직장인 연말정산 기간에도 큰 관심을 받을 줄은 몰랐다고 김 CTO는 회상했다.

2020년 5월 한 달은 2019년 귀속연도 한해의 종합소득세 신고만 지원했다. 그 이후 더 많은 사용자의 요청을 동시 처리할 수 있는 기반을 다진 이후에는 대상 기간을 5년(2016년-2020년)으로 확대했다. 단순 계산하자면 이전 같은 규모의 이용자가 들어온다면 데이터 처리량은 5배가 더 늘어난 셈이다. 이런 와중에 방문자 수가 지난 달 보다 14.3배나 늘면서 부하가 과중되었던 거다.

[이미지 4 ] 2021년 1월 13일 오후 9시 50분 당시 포털 실시간 검색어 1위에 오른 삼쩜삼

다행히 한꺼번에 몰리는 트래픽을 처리할 구체적인 방안을 미리 세워둔 김 CTO는 예정보다 더 빠르게 인프라 개선 작업을 진행했다. 모바일 웹 프론트에 정적 파일[8]을 띄우는 속도부터 개선해야 했다. 자비스앤빌런즈 개발팀은 이를 위해 정적 파일 제공 공간을 가상서버(EC2)에서 서버리스 아키텍처(cloudfront-S3)로 변경했다. 삼쩜삼 웹 프론트 API 서버는 20대로 증설하고 삼쩜삼 DB 서버 사양은 8배가 높은 급으로 변경했다. 그 결과, 이른 시일 내로 서비스 안정화를 도모할 수 있었다.

“개발사가 직접 서버를 관리할 때의 상황을 설명하자면 이렇습니다. 일시에 트래픽이 몰리면 서버 증설과 분산 처리 작업을 따로 진행해야 합니다. 물론 이 작업은 EC2로도 가능은 합니다만, 비용 효율이 떨어진다는 단점이 있습니다. EC2의 컨텐츠 저장 비용이 상대적으로 비쌀 뿐만 아니라, 트래픽이 갑자기 늘어났을 때는 서버 증설 후 모든 서버 간 정적 파일을 동기화해야 하는 번거로움이 있죠.”

“이에 자비스앤빌런즈는 인터넷 스토리지 서비스(S3)에 저장된 파일을 cloudfront(CDN) 통해서 전달하는 방식을 채택했습니다. 매우 저렴한 비용으로 대용량 데이터를 저장할 수 있을 뿐만 아니라, 빌드[9]할 때 사용하는 컴퓨팅 파워에 대해서만 비용을 지불하면 됩니다. 급격한 트래픽 변화에도 유연하게 대응하는 일도 가능하죠. 지역별로 콘텐츠를 캐싱해서 전달할 수 있어서, 서버와 거리가 먼 곳에 사는 사용자도 정보를 빠르게 받을 수 있습니다.”


ECS로의 전환이 갖는 의미

서비스 규모가 커짐에 따라 백엔드(서버) 역시 확장성과 보안성도 고민해야 했다. 이에 자비스앤빌런즈 개발팀은 백엔드 서버를 컨테이너 오케스트레이션 서비스(ECS)[10]로 이전을 진행했다.

[ 이미지 5 ] 삼쩜삼 인프라 변천사

컨테이너는 격리된 환경에서 각 애플리케이션 실행을 도와주는 기술을 의미한다. 컨테이너의 장점은 크게 3가지다. 첫번째, 효율적인 개발 환경 구축이 가능하다. 모두가 동일한 개발 환경에서 애플리케이션을 개발할 수 있다. 환경 설정 파일을 실행만 하면 되기에, 개발 환경 구성하는 시간도 줄일 수 있다. 두번째, 개발-테스트-스테이징[11]-운영 환경의 일관성을 보장해준다. 그 덕분에 특정 환경에서 발생할 수 있는 배포 장애를 미리 제거할 수 있고, 장애가 나더라도 원인 파악에 드는 시간을 줄일 수 있다. 세번째, 이미지[12]를 통한 빌드-배포 자동화가 가능해 특정 버전의 장애를 빠르게 파악하고 서비스를 복원할 수 있다.

“컨테이너로 배포하는 방법에는 EC2 기반 컨테이너 배포, EKS(Kubernetes), ECS(docker)가 있습니다. EC2 기반 컨테이너 배포는 빠른 배포 환경과는 다소 거리가 멉니다. EC2의 설치와 환경 설정이라는 과정이 따로 추가되기 때문입니다. EKS는 컨테이너 오케스트레이션 오픈소스인 쿠버네티스를 이용합니다. 사실상 표준 플랫폼으로 자리 잡힌 상황이지만, 초반 학습 곡선이 높아서 진입 장벽이 높습니다. 반면 ECS는 기존 컨테이너 개발방식과 크게 다르지 않아 학습에 대한 부담이 적습니다. 이미 삼쩜삼 인프라를 AWS로 구축한 덕에 AWS가 제공하는 다양한 기능과의 통합도 쉽고, 다른 컨테이너 배포 방법과 비교해 적용이 쉽다는 점에서 ECS를 선택하게 되었습니다.”

서비스 불안정에 미칠 영향을 최소화하고자 매우 간단한 서버부터 ECS로 이전하며 숙련도를 높여나갔다. 규모가 작은 서버로의 마이그레이션이라는 작은 성공을 토대로 얻은 자신감과 학습 기술 고도화로, 점차 규모가 크면서도 사용 빈도가 높은 서버로 이전 대상을 확대해나갔다. 그 결과, 전체 90%의 서버를 ECS로 옮기는 작업을 4월 중순에 마무리했다.


향후 계획

자비스앤빌런즈 개발팀은 앞으로도 고객이 편리하게 이용할 수 있도록 삼쩜삼 인프라를 개선해나갈 예정이다. 아울러 개인사업자를 위한 신규 서비스뿐만 아니라 긱 워커 생활 밀착형 슈퍼앱 개발에도 참여한다. 이를 위해서는 ‘제2의 삼쩜삼'이 될 MVP 프로젝트 개발을 함께 해나갈 엔지니어의 참여가 필수다. 기록을 연이어 갱신해나가는 자비스앤빌런즈에서 함께 일하고 싶은 이들을 적극적으로 채용해나갈 계획이다.

“이렇게 단기간 내에 가파르게 성장한 서비스를 함께 만드는 일은 매우 진귀한 축에 속합니다. 특히 이미 완성된 서비스의 운영을 위해 각자 맡은 업무만 보는 게 아니라, 자비스앤빌런즈에서는 제품 기획부터 설계, 개발에 이르는 전 과정에 참여할 수 있습니다. 즉, 누군가가 일방적으로 결정하는 방향을 따르지 않고, 함께 미래를 그리는 원팀으로 일할 수 있다는 거죠. 제품을 만드는 데 직접적으로 기여를 하면서 여러 도전적인 과제를 해내고 싶은 분이 있다면 지원해주세요. 기다리겠습니다.”

[ 이미지 6 ] 자비스앤빌런즈 개발자가 일하는 모습



글 | 이수경
감수 | 김병석(인터뷰이), 김춘추, 김희중, 조영운, 황재홍
디자인 | 박서영



본 콘텐츠의 저작권은 (주)자비스앤빌런즈에게 있으며, 본 컨텐츠에 대한 무단 전재 및 재배포를 금지합니다


각주

  1. 사업 아이템이나 비즈니스 모델의 방향을 전환하는 전략 또는 그 기법

  2. JavaScript로 작성된 웹프레임워크

  3. 서버에 API를 호출해서 동적인 데이터를 받아와 브라우저 등 클라이언트에 정보를 출력하는 영역

  4. 동적인 데이터를 생성하는 서버

  5. PHP로 작성된 웹프레임워크

  6. 사용자가 정의하지 않아서 시스템이 자동으로 적용하는 값

  7. 누군가 서버를 해킹했다고 가정해보자. PHP와 같은 스크립트 언어는 서버에서 수정한 코드를 바로 실행할 수 있어서 2차 피해로 이어질 수 있다. 반면, Java와 같은 컴파일 언어는 컴파일 과정을 거쳐 나온 파일만 서버에서 인식할 수 있어 2차 피해로 이어지기 쉽지 않다.

  8. html, js, css 등 웹 서비스에 사용하기 위해 미리 서버에 저장해 놓은 파일을 의미한다. 서버에 저장된 데이터가 변경되지 않는 한 매번 같은 정보를 제공한다는 점에서 정적 파일이라고 부른다.

  9. 컴파일(사용자가 작성한 코드를 컴퓨터가 이해할 수 있는 언어로의 번역)된 코드를 실제 실행 상태로 만드는 작업

  10. 컨테이너의 적절한 배치 및 관리를 도와준다.

  11. 운영으로 전환하기 전, 운영과 똑같은 환경에서 제품을 테스트하는 단계를 의미한다. 스테이징에서 문제가 발견되지 않으면 그대로 배포를 진행한다.

  12. 서버의 모든 내용을 저장하는 형태