프로젝트 초기화

dev_qorh·2022년 7월 14일
1

CatchCatch

목록 보기
3/18

그저께에 이어서

결론적으로 무난하게 사용할 수 있다고 판단되어 구축을 시작하려고 한다. 그전에 확인해야 하는 것은, 기존 nodejs에서 사용하던 것과 다르게 DI, IOC 를 적용하기 위해서 어떤 작업이 필요한지 알아봐야 했다.

이전 지표 상의 이유로 express를 사용하지 않으려고 하였으나… 여러모로 검색해보니 nodejs 만으로 구성하는 것은 결과를 인코딩하는 데에서 부하가 상당히 걸릴 수 있다고 한다. 또한, interceptor와 같은 기능 및 http, http2 규약 등 설정해주어야 하는 부분이 너무나 많아서,, express를 쓰되 최대한 부하를 줄일 수 있도록 documentation을 참고하면서 만들고자 한다.

프로덕션 환경에서의 Express 사용을 위한 성능 우수 사례

사실 어제, 프로젝트를 구축하기 위해서 typescript + express 환경을 세팅하고서 굉장한 고민에 빠졌었다. 처음 프로젝트를 구성할 때 항상 생기는 딜레마… 이지만, 고려해야 하는 기능을 수행하는 패키지가 무엇이 있는지 찾아보는 것과 어떤 기능을 고려해야 하는 지를 찾아보고 있노라면, 스스로가 정말 많은 것을 모르고 있다는 생각이 들기 마련이다.

그러나 어쩔 수 없다. 뒤늦게 깨닫는 것은 뒤늦게 깨달은 시점에서 추가되면 될 일이다. 차근차근 진행한 것들을 기록하며… 빠르게 진행해보자.

우선 lint 및 config 설정은 구글의 스타일 가이드를 따라서 적용하는 것으로 해결했다.

npx gts init

npx는 로컬에 설치된 명령어 도구를 실행할 수 있도록 해준다. 위 명령어는 gts (google typescript style) 이지만 tsc와 같은 타입스크립트 컴파일 프로그램도 npx를 사용하여 수행이 가능하다.

설정 파일들을 구글이 사용하는 스타일로 설정해둘 수 있는 기능이라고 보면 된다. 별 다르게 추가된 것은 마땅히 없는 듯 보였다.

그리고, TypeDI 와 TypeORM 을 설치해주었다. 당연한 이야기지만, ORM을 사용하기 위해 DB를 선정해야 했다. DB는 mysql을 쓰기로 한다. 조금의 검색으로 샤딩, 레플리카, 분산 등의 처리가 가능하다는 것을 알았고 무엇보다 잘 짜여진 스키마에 성능이 의존 되는 것은 확실하니까 굳이 모르는 DB를 도입한다고 좋을 게 없다고 판단했다.

위와 같이 예제 entity를 만들고.. (빨간 에러줄은 일단 무시해본다)

index.ts를 만들어 같이 초기화 해준다.

실행하기 위해서는 tsc를 사용하여 js 파일로 만든 후 node로 실행하는 것이 원래 방법이다. 하지만 nodemon 을 사용하여 개발 시의 변경점들을 바로 반영하고 싶었기에 관련 방법을 찾아보았고, ts-node 와 함께 사용하여 실행할 수 있다는 것을 알게 되었다.

nodemon.json 설정해주기

이후로, nodemon을 실행시켜주면..

데코레이터를 인식하지 못하는 문제 및 생성자를 사용하지 않은 문제가 발생한 듯 하다.

해결을 위해 "strictPropertyInitialization": false 옵션을 tsconfig에 추가해주었다…. 확인해보니 tsconfig에 compilerOptions.experimentalDecorators 의 옵션으로 들어가지 않고 그냥 experimentalDecorators 로만 들어가서 생긴 문제였다. 제대로 하니 관련 오류는 없었다.

검색 결과 위 에러는 yarn으로 등록한 mysql 패키지가 mysql8 의 새로운 암호 알고리즘을 지원하지 않기 때문에 발생하는 것이라고 한다.

이를 해결하기 위해 mysql 에 접속하여 이전의 암호 알고리즘을 사용하여 내 암호를 재 입력을 해주었다.

제대로 초기화 되었다!

자… 이제 그럼 express를 이용하여 api 포인트를 라우팅 하고, 서비스 로직을 짜기만 하면 될 듯하다. 즉, 프로젝트를 위한 기초적인 세팅이 완료된 시점이라는 의미이다. 이쯤에서 순서도를 다시 생각해볼 필요가 있었다.

  1. Node + TypeScript + Nginx 적용 백엔드 만들기
  2. 데이터베이스 선정
  3. Docker 환경 세팅하기
  4. CI / CD 설정을 위한 Jenkins 도입
  5. CDN 설정 확인하기
  6. ……

1, 2가 완료되었고 도커 환경을 한번 세팅해보고자 한다. 도커는 Nginx와 함께 사용하여 로드밸런싱이 가능하도록 구현할 예정이다.

클라우드 서비스는 신이다

도커를 비롯하여 여러가지 서버 관리 측면에서의 작업을 하기 전, 어떻게 구상해야 하는 지 알아봐야 했다. nginx 는 WAS 이고, 도커는 내가 구축한 백엔드를 여러 컨테이너로 운영할 수 있도록 하는 역할을 한다. 이는 도커가 관리하는 컨테이너의 포트번호를 달리한 후, nginx 가 해당 컨테이너들의 포트번호를 등록 후 LB 하여 관리하는 방식으로 진행되었다.

이 시점에서 막연한 의문이 들었다. 그렇다면 DB는 또 어떻게 나누어서 연결을 시키며, 이미지 서버 처리는 어떻게 하여야 할까. 그리고 가장 중요한 것은, 시스템을 내 컴퓨터에서 분산시켜 나눈다고 한들 6코어 16GB의 램이 얼마나 위 시스템들을 버틸 수 있겠는가.

아무튼, 클라우드 서비스를 활용하여 프로젝트를 구상하려고 한다. 하나의 서비스를 구축하기 위해 최대한 많은 구글링을 통해 정보를 얻고 계속 검토할 것이다.

profile
기술로써 가치를 만들고 싶은 사람입니다.

0개의 댓글