Seize the day

POST : Backend study

자바스크립트 런타임 Bun을 써볼까나..

구글 GCP에 서버 하나를 3년째 돌리고 있다. 한 달에 5000원씩 내고 있다. 앱을 하나 개발하는게 있는데 와이프랑 데이타를 주고 받아야 해서 어쩔 수 없이 서버가 필요하다. 집에 PC를 하나 돌릴 수도 있을텐데 전기료랑 GCP 돌리는 비용이랑 비슷할 것 같아서 그냥 그렇게 하고 있다. 이 앱은 사용자가 단 2명 뿐인데도 꾸준히 거의 매일 쓰고 있다. 마지막 개발은 거의 1년 전이라 개선을 하고 싶기는 한데 한 마디로 너무 귀찮다. 독푸딩단계에서는 2명의 요구수준을 거의 만족을 하고 있는데, 출시하기 위해서는 암호화나 권한 관리, 탈퇴처리, 어뷰징 방지 등의 개선과 복잡한 구현이 여러 남아 있는 상태다.  

백엔드 서비스를 구현하면서 여러 실수를 많이 했다. 현재의 백엔드 상태를 보면..

User App ---> Nginx(https, gzip) ---> Deno sever --> Mongo db 

Nginx부터는 하나의 물리적 서버에서 돌아간다. Deno라는 js 런타임을 채택하면서 Nginx를 추가해야만 했다. 왜냐하면 Deno 런타임에서 사용하는 oak 라이브러리가 https와 gzip을 지원하지 않기 때문이다. 따라서 Nginx가 https와 gzip을 핸들링하고 Gateway역할을 하고 있다. 운영하면서 미묘한 문제를 몇 번 겪었는데 서버가 가끔 다운되는 현상이 있었다. 백엔드 서비스가 응답하지 않아서 VM에 SSH 접속을 시도했을 때 연결이 되지 않는 경우가 4번 정도 있었다. GCP에서 가상머신은 ACTIVE 상태인데 ssh 접속이 안 되는 경우라서 VM을 재시작하는 수 밖에는 없었다.  (원인파악도 되지 않는다 서비스에 로그를 남기는 기능까지는 구현되어 있지 않아서다. 서비스 문제 같지는 않지만..) 따라서 일단 GCP에서 AWS로 이동하려고 한다. 경험치를 늘리기위한 것도 있다. 장기 계약하면 비용이 싸지는 것도 있기 때문에 AWS의 EC2를 사용할 계획이다. (1년전에 OCP를 한 달 정도 운영서버로 사용했었는데 이상하게도 OCP에서 아무런 통지도 없이 계정을 자르는 바람에 서버 데이타도 백업하지 못했다. 그때 app내 데이타가지고 db복구한다고 생고생했다. )

그리고 Deno를 포기해야 겠다. Nest.js 같은 좋은 프레임 워크가 없어서 피처 진행을 어떻게 해야할 지 엄두가 안 난다. 따라서 원활히 개발 진도를 뺄려면 Node.js 런타임에 Nest.js 프레임웍을 사용하는 것이 최신이라고 생각했다. nest.js에서는 기본으로 제공해주는 기능을 일일이 구현하고 있을 수는 없기때문이다. 

이런 와중에 우연히 Bun을 알게됬다. 개발 트렌드를 확인할 겸 가는 사이트가 있는데 거기서 Nodejs 와 하위호환이 되는 차세대 js 런타임으로 Bun이 소개되었다.  처음에 Deno를 선택한 이유가 좀더 빠른 속도와 원활한 TypeScript 사용이었는데 Bun은 이 두 개를 충족하면서 nodejs를 그대로 돌릴 수 있다니 관심이 갔다. nestjs와의 궁합도 확인해보니 Bun 자체에서 지원이 되는 것 같았다. 라이브러리 설치 속도, 실행 속도, 초당 요청수도 nodejs에 비해서 압도적으로 우수한 것으로 보인다.

bun create nest test_bun_nest
cd test_bun_nest
bun --watch ./src/main.ts

시작이 좋다. nest.js를 돌릴 수 있고, 소스 파일 저장시 서버를 자동으로 재시작해주는 --watch 옵션도 자체 지원하고 있다. 그래서 최종적인 백엔드 구성을 이렇게 해 볼려고 한다. 

User app1 --> Bun server(Nest.js (support https, gzip, file logging, ...) with fastify) --> Mongo db

nestjs는 express보다 더 빠르다는 fastify로 돌리고 https와 gzip을 자체적으로 지원한다. 모든 요청과 응답 로깅을 아파치 처럼 log 파일로 저장하면서 warning이나 error 로그는 별도 log파일로 저장하고, 서버 internal error도 날짜별로 파일을 만들어서 저장한다.  그리고 Bun과 mongodb는 docker를 이용하여 실행한다. 비정상적인 요청의 차단이나, 서버 다운과 같은 것은 운영자에게 노티할 필요가 있는데 이런건 어떻게 만들어야 할지 고민이다. 예전에 nodejs기반의 한 프로젝트에서는 중요 이벤트 예를들면 서버가 죽는 경우 등일 때 트위터로 메시지를 남기는 기능을 만들었는데 잘 동작했었다. 해당 트위터 계정을 구독하면 노티를 받을 수 있지 않을까 싶다. 

 

top

posted at

2024. 4. 27. 03:06


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크