[챌린챌린]제5회 정부혁신제안 끝장개발대회 후기 - 2

📌 5. 아키텍처 설계

챌린챌린 아키텍처는 다음 그림과 같이 설계했다.
최대한 많은 사람을 챌린챌린으로 유입시키는 것이 1차 목표였기 때문에 진입장벽이 낮은 서비스로 만들기로 했다. 프론트는 React 프레임워크를 사용하기로 했고, 백엔드는 생산성이 높은 NodeJS를 사용하기로 했다.
DB는 NodeJS와 호환이 좋은 MongoDB를 선택했다.

📌 6. 대회 당일 - 1차 발표

개발 시작

5월 22일 오전 10시에 대회가 드디어 시작됐다! 코로나 때문에 비록 온라인 줌으로 참석하긴 했지만 팀원들과는 대면으로 만나서 개발했다. 대회 사회자 분이 엄청나게 유쾌하셔서 금새 어색함도 풀렸고 개발을 본격적으로 시작했다.
난 백엔드 파트의 챌린지 CRUD 기능 api와 랭킹 기능 api 구현을 맡았다.
MongoDB는 많이 사용해봤지만 NodeJS는 처음 개발해본 터라 같은 백엔드 팀원 분이 기본적인 세팅을 많이 도와주셨다!

솔직히 밤을 아예 꼴딱 샐줄은 몰랐다. 저녁 10시에는 집에 갈 수 있을 거라고 우리끼리 낄낄 웃으며 자만했다...ㅎ 하지만 결말은 이랬다.

대회 마무리 직전 새벽 4시의 풍경이다.
파일 업로드 속도 지연 등 생각치 못한 문제들이 많이 발생했기 때문이다. 이래야 제맛이지,,,

왜 우리는 잠들 수 없었는가

백엔드 쪽은 데이터 정합성 관리 이슈가 많았다. NoSQL을 DB로 선택했던 게 화근이었는데 스키마가 없는 자유를 얻은 대신 데이터 정합성 관리에 많은 시간을 투자할 수 밖에 없었다.
예를 들어, 게시물에 좋아요를 누른 사용자가 회원 탈퇴를 했을 때 해당 게시물의 좋아요 수도 -1 처리를 하고 랭킹에 반영되어야 한다. 또한 일간 랭킹 점수는 매일 자정에 초기화 돼야 한다. 만약 RDMS였다면 간단히 해결했을텐데NoSQL이었기 때문에 직접 처리해야 할 것이 많았다.
DB 자체의 Trigger 기능을 이용하고 싶었지만 MongoDB Atlas의 scheduled trigger 기능을 써보려다 실패했다. 결국 임시방편으로 webserver가 실행될 때 아래와 같은 cron 프로세스들이 같이 실행되게 세팅했다.

// initialize daily 
cron.schedule('0 0 0 * * *', () => {
  User.updateMany(
    {},
    {
      // 점수
      "allScore.dailyScore": 0,
      "categoryScore.electricity.dailyScore": 0,
      "categoryScore.airCondition.dailyScore": 0,
      "categoryScore.resource.dailyScore": 0,

      // 탄소저감량
      "reducedCarbon.dailyAmount": 0,
   },
  ).then( r => {
    console.log("Daily initialize Success");
  }).catch( err => {
    console.log("Daily initialize Error");
  });
});

사실 맘에 들지 않는 처리 방식이었다. 왜냐하면 만약 자정 시간에 웹서버가 중단됐을 경우 데이터에 모순이 발생하기 때문이다. 시간에 쫓겨 선택한 방법이었지만 아주 아쉬웠다😥

📌 7. 배포 - 최종 발표

대회 당일 1차 발표를 무사히 마치고 6월 5일에 있을 최종 발표 준비에 들입했다.
최종 발표에는 심사위원 및 다른 참가자들에게 제대로 된 사용 환경을 제공하고 싶었다. 최종 발표 전까지 1차 발표 때의 피드백 반영, 배포도메인 적용까지 완료하는 것을 목표로 다시 개발하기 시작했다.

서버 세팅

챌린챌린은 웹서버(프론트)와 어플리케이션 서버(백엔드), DB 서버로 나뉘어져 있다. DB는 MongoDB Atlas를 사용했고 프론트, 백엔드 서버는 AWS ec2의 ubuntu 인스턴스 2개를 세팅하여 사용했다. (도커 등 인스턴스를 하나만 사용할 수 있는 방법은 많다.)
사진 출처 : https://blog.dalso.org/language/web/6523

  • 웹서버
    웹서버는 다음과 같은 명령어를 통해 무중단 배포를 구현했다.
$ sudo apt-get install npm
$ git clone https://github.com/challen-challen/Frontend.git
$ cd Frontend
$ sudo npm install
$ sudo npx pm2 start npm -- start
  • 어플리케이션 서버
    어플리케이션 서버는 다음과 같은 명령어를 통해 무중단 배포를 구현했다.
$ sudo apt-get update
$ sudo apt-get install nodejs
$ sudo apt-get install npm
$ git clone https://github.com/challen-challen/Backend.git
$ cd Backend
$ sudo npm install
$ pm2 start --interpreter babel-node src/server.js

nginx 적용

도메인 적용

좋은 웹페이지 즐겨찾기