- 체류시간을 기준으로 지원금을 지급하는 것으로 운영정책이 변경됨에 따라 약 1,500여명의 학생에게 지원금을 지급하기 위해 체류시간에 대한 데이터가 필요한 상황입니다.
- 학생에겐 본인의 체류시간을 제공해야 합니다.
- 운영진에겐 1,500여명 이상의 학생에게 지원금을 지급하기 위한 월별 체류시간을 산정해주어야 합니다.
- 학생이 패용하는 출입카드의 고유 ID를 이용해 입/퇴실 데이터를 이용하여 체류시간 산정
- 24HANE 프론트앤드 개발자 팀원에게 요구사항에 맞는 API 제공
- 운영진에게 요구사항에 맞는 형태로 약 1,500명의 학생에 대한 월별 체류시간 제공
- 운영진의 요구사항에 따라 현재 Google Sheet를 이용하기 때문에 API만 제공합니다.
해당 백앤드 서비스를 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
# 단위 테스트
$> npm run test
# e2e 테스트
$> npm run test:e2e
# 단위 테스트 커버리지 측정
$> npm run test:cov
pm2 명령어가 실행 가능할 때에만 동작하는 쉘입니다.
앱이 실행중이 아니라면 실행하고, 기존에 앱이 실행 중이면 reload 하는 쉘 스크립트입니다.
현재 무중단 배포가 엄밀하게 설정되어 있는 상황이 아니라 추후 수정이 필요할 수도 있습니다.
$> bash pm2-run.sh