<aside>
<img src="/icons/branch_gray.svg" alt="/icons/branch_gray.svg" width="40px" /> 시스템
Server: NCloud server (vCPU 2개, 8GB RAM, 50GB storage)
OS: Ubuntu Server 18.04
프레임워크와 개발도구
언어: Typescript
API 서버: NestJS
DBMS: PostgreSQL
Message queue: Redis
채점서버: NestJS
컨테이너: Docker
연결 프로토콜: HTTP
테스트와 운영도구
CI/CD: Github Action
부하 테스트: Artillery
모니터링: 추후 선택
</aside>
API 서버: nestJs
- 후보군은 express와 NestJs이 있는데, 최종적으로는 NestJs를 선택하였다. 이유는 다음과 같다.
- 많은 기능을 이미 만들어 포함하고 있어 생산성이 훨씬 좋다. express는 필요한 것이 있을 경우 하나하나 찾아서 설치해야되는데 이런 시간들을 무시할 수 없다. ex) pipe validation, 기본 환경 설정, orm
- 스프링과 비슷한 면이 있다(DI, IoC). 스프링은 국내에서 가장 많이 쓰기 때문에 취업에도 유리하다.
- 객체지향 프로그래밍에 유리하다.
- express는 꾸준한 업데이트가 이루어지지 않고 있다.
- ts를 적극적으로 사용한다. nest js는 TS만으로 작성되었다.
- swagger 같은 api 명세서 사용이 편하다.
- 아키텍처가 정해져 있기 때문에 여러명이 코드를 작성하더라도 어느정도 일관성을 유지할 수 있다.
- 원한다면 nest에서 express를 직접 사용하는 것도 가능하다.
- crud, 서비스 유닛 테스트, dto, 엔티티까지 모두 CLI를 통해 자동으로 만들 수 있다.
- 6주만에 만들려면 시간이 오래걸리는 부분(아키텍처, 환경설정, 라이브러리 설치, 의존성 관리 등)에 신경을 최대한 덜 써야 한다. 이런점에서 좋다.
DB: PostgreSQL
- 후보군: mySQL, MariaDB, PostgreSQL, MSSQL(유료), Oracle(부분 유료)
- mySQL, MariaDB, PostgreSQL의 장단점 (chatGPT)
- 장단점 정리
- DB에 저장해야 할 것들?
- User
- 대회 정보
- 문제 정보
- 대회 기록 (제출 기록, 대쉬보드 포함)
- 테스트케이스 입/출력
- 관계형 DB를 사용해야 하는 이유?
- 사용하는 데이터들의 관계를 지어 저장하고 사용할 필요가 있다.
- NoSQL에 비해 더 잘 알고 있다.
mySQL을 선택한 이유
테스트 케이스가 많아 읽기를 하는 경우가 많다고 예상된다. 이때에는 mysql의 성능이 더 좋다.
postgreSQL은 복잡한 조인연산이 많은 쿼리에 유리하고, mysql은 단순 조회에 높은 성능상 이점이 있다.
커뮤니티가 크다. 정보를 얻기 쉽다.
사용해본 경험이 있어서 배우는데 시간이 더 적게 걸린다.
- PostgreSQL을 선택한 이유 (mySQL에서 변경)
- 코드 제출 등의 이유로 쓰기 연산이 더 많을것이라고 생각한다.
- 테스트 케이스는 file로, dashboard는 in memory에 저장하고 최종 결과만 db에 저장하기 때문에 읽기 연산이 많지 않을 것이라고 예상한다.
- 도메인이 조금 복잡해서 Join 연산이 비교적 많을것이라고 예상한다.
메시지 큐: Redis