배경
노드 백엔드를 공부하기로 결심하고 Node.js 교과서 를 일독했다. 노드 웹서버 작성의 기본적인 내용들을 경험해 봄으로서 기본적인 지식을 습득하고, 실습해 보았다. 이제 배운 지식을 활용해 볼 차례다.
실시간 경매
13장에 있는 실전 프로젝트다. 저자의 말대로 이전에 배운 모든 내용을 응용하는 프로젝트이므로 복습 및 캡스톤 프로젝트의 대상으로 적절하다고 생각한다.
클라이언트 사이드
클라이언트 사이드는 이 책이 목표와 나의 주요 관심사가 아니다. 따라서 위와 같은 절차를 거치지 않고, 이미 구현된 nunjucks 템플릿을 거의 그대로 활용한다. 추후 여력이 있으면 react로 리팩터링 해본다.
패키지와 실행환경
노드 패키지
아래와 같은 노드 패키지를 활용해서 프로젝트를 진행한다.
node.js, javascript, nunjucks, express, passport, oauth, sequelize, sequelize-cli, multer, pm2, socket.io, bcrypt, sse, node-schedule, eslint
외부 실행환경
ubuntu, redis, mysql, ubuntu, aws-lightsail, pm2, aws s3, aws lambda
개선점
프로젝트의 완성도를 높이기 위해 다음 기능들을 추가할 계획이다.
특히, 앞으로의 업데이트는 gh action을 통한 ci/cd 파이프라인을 통해 자동으로 수행해보고 싶다.
1. dockerization
2. github-action을 익혀서 CI-CD 파이프라인을 구축한다.
3. https 적용
4. react bootstrap이나 mui를 활용해 모던한 프론트엔드 구축.
aws lightsail에서 제공하는 인스턴스에 배포했다. 첫 3개월간 꽤 괜찮은 인스턴스를 무료로 사용할 수 있다.
개발 및 개선 일지
11.23
- 어제 배포한 뒤에 로그를 보니 이상한 요청들이 많이 들어와있었다.
.env
파일이나, 취약점을 자동적으로 훑는 요청들이었다. 내 서버에도 해킹봇이 접근했다니... 실제 서비스를 배포할때는 보안에 많은 시간과 노력을 투자해야겠다고 다시한번 느꼈다.
- lightsail의 인스턴스는 퍼블릭 도메인을 제공해주지 않아서 현재 구글 소셜로그인이 불능이다.
- 소셜로그인과 로컬 로그인에서 이메일 저장소가 충돌하는 문제가 발생해서 수정했다. 만약 해당 이메일이 점유중이라면 어떤 로그인 서비스에서 점유중인지 알려주는 로직을 추가했다. passport의 authenticate 과정중 에 발생하는 로그인 프로바이더 정보를 다음 라우터로 전달하는 방법을 고민하는데 시간이 많이 들었다. 결국에는 에러객체를 던지고, 최상위 에러 핸들러에서 처리하는 방식으로 구현했다.😎
- lightsail의 컨테이너 배포에 실패했다. 원인을 찾는 중이다.
- 로컬 로그인에서 버그를 발견했다. provider 체크 로직 변경으로 버그픽스😎
- 소켓연결부분이 제대로 작동하지 않는다. 배포와 개발시의 소켓 주소지정이 틀려서 발생하는 문제인듯
- 주소지정을 바로 했는데, 버그가 안고쳐진다아아아아앙ㅇ. 서버에서 지정된 소켓라우터로 이벤트를 emit하고, emit한 이벤트를 브라우저 네트워크탭에서 확인할 수 있는데, 클라이언트 스크립트가 왜 제대로 동작안하는지 모르겠다....😡😡😡
펑퍼러펑펑펑... 생각나는 점들
- 배포과정 해보니 생각지도 못했던 버그들이 펑펑 나온다. 일일이 손으로 테스트해볼수도 없다.
- 테스트코드 작성하자. 익숙하지 않아도 억지로라도 가장 작은 코드부터 작성하려고 노력하고 익숙해지자
- production db와 development db를 나누자
- 환경변수로 development env와 production env 지정시 각각에 대응되는 코드가 실행되도록 수정하자.
11.24
- 자려고 누워서 코드를 들여다 봤는데, 문득 생각이 떠올라서 적용해 보았더니 소켓버그가 해결되었다. 클라이언트단에서 소켓의 연결주소를
window.location
으로 지정했는데, 이 주소는 동적으로 바뀌는 값이었다. 따라서 new URL(window.location).original
로 지정해줘서 소켓통신이 정상적으로 작동한다.
- lightsail 인스턴스가 자꾸 죽어서 stop후 재시작했더니 ip주소가 변경됐다... 소셜로그인 재작동 시키려면 카카오, 구글, 깃헙, 네이버 일일이 들어가서 매칭해줘야 되는데... 이 문제도 해결해야함..
11.25
- 컨테이너가 죽는 문제를 다시 들여다봤다. 두가지 문제점이 있었다.
- node_modules 폴더를 .dockerignore에 포함시켜주지 않아서 운영체제가 달라 모듈이 충돌 아마 npm install시 운영체제에 따라서 빌드하는 방식이 다른가보다.
.env
를 포함시켜주지 않아서 passsport 연결 부분에서 오류
- 컨테이너 실행시 환경변수를 커맨드라인에서 넣어서 실행시켜 보자.
- 여러개의 환경변수를 도커에 전달하려면 요렇게 한다.
docker run --env-file ./.env -p 3000:80 snowdelver/nodeauction
- 그렇다면 linux amd64로 빌드해서 lightsail에도 이렇게 배포가능할까? 해보자....
- 야후 성공~ 여기에 배포완료했고 퍼블릭 도메인이므로 google OAuth도 설정해보자~ https://nodeauction.42msnsnsfoav6.ap-northeast-2.cs.amazonlightsail.com/
- 소셜로그인도 다터졌네 => aws에서 제공해주는 https 프로토콜 말고 http주소로 앱 주소를 입력하니 잘 동작한다. google 소셜로그인도 제대로 작동한다.
- 소켓과 서버센트 이벤트는 db에 배포한 이후의 url이 잘 전달되지 않아서 생기는 버그로 생각된다. 새로운 상품을 등록하니 잘 작동한다.
와, 배포 부분도.... 실제로 배포는 코드 작성과는 또 다른 영역이라는 것을 실감합니다