Skip to content

innovationacademy-kr/24hane-backend

Repository files navigation

image

GitHub Stars GitHub Issues Current Version

24 HANE(24 hours are not enough)

목차


💬 프로젝트 소개

공식 웹사이트 (42 계정 필요)

HTTP API 명세

프로젝트 개요 및 목표

  • 체류시간을 기준으로 지원금을 지급하는 것으로 운영정책이 변경됨에 따라 약 1,500여명의 학생에게 지원금을 지급하기 위해 체류시간에 대한 데이터가 필요한 상황입니다.
  • 학생에겐 본인의 체류시간을 제공해야 합니다.
  • 운영진에겐 1,500여명 이상의 학생에게 지원금을 지급하기 위한 월별 체류시간을 산정해주어야 합니다.

프로젝트 내용

  • 학생이 패용하는 출입카드의 고유 ID를 이용해 입/퇴실 데이터를 이용하여 체류시간 산정
  • 24HANE 프론트앤드 개발자 팀원에게 요구사항에 맞는 API 제공
  • 운영진에게 요구사항에 맞는 형태로 약 1,500명의 학생에 대한 월별 체류시간 제공
    • 운영진의 요구사항에 따라 현재 Google Sheet를 이용하기 때문에 API만 제공합니다.

서비스 동작 예제

image image image

기술적 도전

해당 백앤드 서비스를 1,500여명 이상의 카뎃들과 관리자에게 더 양질의 서비스를 제공하기 위해 아래와 같은 주제에 대해 고민을 하였습니다.

  • 지원금이 걸린 만큼 출입기록 산정에 에러가 없어야 합니다.
  • 1,500여명 이상의 카뎃들이 출입 누적 시간(오늘, 이번 달) 현황을 조회하기 위해 수시로 조회할 때 견고하게 동작되어야 합니다.
    • 몇십만 건의 레코드가 저장된 출입기록 테이블에 대해 수시로 Full Scan을 수행합니다.
  • 관리자는 1,500여명 이상의 카뎃들에 대한 월별 출입기록을 산정하기 위해 월마다 조회합니다.
    • 별도의 최적화를 하지 않으면 Full Scan을 최소 1,500회 수행해야 합니다.
  • 교육시설 출입시 출입 카드를 태깅하는데 출입 카드가 교육기간 내 최소 3번이 변경됩니다.

🛠 기술 스택

분야 기술스택 선정이유
Back-End TypeScript 컴파일 타임에 에러를 검출하여 서비스 과정에서 발생할 수 있는 오류를 최소화
ESLint 코딩 컨벤션에 위배되거나 안티 패턴을 미리 검출하여 에러 발생 요소를 최소화
Prettier 기본적인 코딩룰 적용으로 가독성 향상
NestJS 백엔드에 필요한 기술들인 IoC, DI, AOP 등이 적용되어 있고, Express.js 프레임워크 대비 구조화됨
MySQL 많이 사용되는 만큼 래퍼런스를 찾기 쉽고, 개발 과정에서 생기는 문제에 대한 해결책을 찾기 용이
TypeORM SQL raw query로 작성하는 것보다 유지 보수 측면에서 유리하고, 추후 다른 DBMS로 쉽게 전환 가능
Swagger 프론트엔드 팀원들 또는 운영진에게 HTTP API 사양 명세를 하기 위해 사용
Passport OAuth2 적용을 위해 사용
Infra PM2 프로젝트 배포 시 node 데몬을 관리할 때 사용
AWS RDS EC2에 DB를 넣지 않고 별도의 서비스로 분리하여 유지보수 및 관리, 확장 용이
Github Actions CI/CD를 적용하여 검증 및 반복 작업의 자동화로 개발의 편의성을 위함

💻 구동 및 실행

해당 앱은 환경변수가 설정되어 있어야 정상적으로 실행됨을 보증합니다. 또한 MySQL Database와의 연결이 필요합니다.

자세한 방법은 가이드를 참조해 주세요.

앱 실행

# 개발 모드로 앱 실행
$> npm run start

# 개발 모드로 앱 실행 (코드 변경 시 자동으로 앱 재시작)
$> npm run start:dev

# 배포 모드로 앱 실행
$> npm run start:prod

테스트 (jest)

# 단위 테스트
$> npm run test

# e2e 테스트
$> npm run test:e2e

# 단위 테스트 커버리지 측정
$> npm run test:cov

pm2 배포를 위한 shell command

pm2 명령어가 실행 가능할 때에만 동작하는 쉘입니다.

앱이 실행중이 아니라면 실행하고, 기존에 앱이 실행 중이면 reload 하는 쉘 스크립트입니다.

현재 무중단 배포가 엄밀하게 설정되어 있는 상황이 아니라 추후 수정이 필요할 수도 있습니다.

$> bash pm2-run.sh