본문 바로가기

웹 백엔드10

NestJS : mongoose virtual field를 사용해서 원하는 값만 반환하기 NestJS에서 Mongoose를 사용해서 백엔드 개발을 진행하고 있습니다. 이때 return으로 모델을 반환하면 response로 반환하고 싶지 않은 정보들도 같이 반환될때가 있습니다. 이럴때 mongoose 에서 제공하는 virtual 속성을 통해 반환을 위한 값들을 제거하고 원하는 필드만 반환하도록 설정할 수 있습니다. Mongoose v8.1.1: Mongoose Tutorials: Mongoose Virtuals Mongoose Virtuals In Mongoose, a virtual is a property that is not stored in MongoDB. Virtuals are typically used for computed properties on documents. Your Fir.. 2024. 2. 9.
PM2 : logrotate 모듈을 이용하여 PM2 로그 용량 줄이기 문제점 AWS의 EC2를 사용하고 있는데 용량이 늘어나는 문제를 발견하게 되었습니다. 용량을 차지하는 파일을 찾던중 NodeJS 프로세스를 관리하는 PM2 에서 적재되고 있는 로그가 용량을 많이 차지한다는것을 알게 되었습니다. 이에 대해서 해결하는 방법에 대해 한번 알아보겠습니다. PM2 로그 파일 기본적으로 pm2는 로그를 `/home/ubuntu/.pm2/logs` 에 적재하고 있는데요 (우분투 기준), pm2로 시작한 애플리케이션의 이름별로 로그파일이 적재되게 됩니다. 현재 platform-api-nodejs 라는 애플리케이션의 로그가 2.8G 이상 차지하는것을 확인할 수가 있습니다. PM2 logrotate 모듈 위에서 알아본 로그들은 서비스가 운용될수록 점점 쌓이면서 커지게 될 텐데요, 계속 쌓.. 2024. 1. 8.
NestJS : Custom Validation 데코레이터로 유효성 검사 수행하기 NestJS를 개발하다 보면 들어오는 요청에 대해 유효성검사를 수행해야 할 때가 있습니다. NestJS에서는 class-validator, class-transformer가 구축된 ValidationPipe를 제공해 주는데 이를 통해 유효성 검사를 수행할 수 있습니다. 저는 개발 중에 기본적으로 제공하는 class-validator의 데코레이터가 아닌 커스텀한 Validation 데코레이터를 작성할 필요가 있었는데요, 기본적으로 class-validator가 많은 데코레이터를 제공해 주지만 원하는 데코레이터가 없을 때 어떻게 적용하는게 좋은지 정리해 보도록 하겠습니다. NestJS의 유효성 검사 먼저 class-validator의 기본 데코레이터를 활용하여 유효성을 검사하는 적용하는 방법을 한번 알아보겠.. 2023. 12. 10.
pm2 : 1개의 cluster에서만 cronjob 수행하기 (instance_var 옵션) 개요 최근에 회사에서 nodeJS 통해 백엔드 개발을 하고 있습니다. 그러던중 특정 시간에 실행되는 CronJob 서비스를 구현해야할 일이 생겼습니다. echosystem.config.js 환경을 만들고 pm2를 통해 서비스를 구동시키고 있는데요, 로직을 다 만들고 나니 문제가 하나 발생하였습니다. pm2를 통해 하나의 EC2 인스턴스의 core갯수에 맞게 cluster 들을 구성한것은 좋았지만, 각각의 cluster들에서 특정시간에 cron작업이 동시에 일어난다는 문제가 발생하였습니다. 사실 cronJob 작업은 모든 cluster에서 동작해야 하는 것이 아니라 특정 시간에 1개의 cluster에서 한번만 일어나면 되기 때문에 이러한 부분을 어떻게 해결해야 될지 고민하였습니다. 이에 대해서 pm2 옵션.. 2023. 7. 23.
PM2 : 무중단 서비스 배포 적용하기 (graceful reload) 개요 NodeJS의 express 프레임워크를 통해 백엔드를 개발하고 배포하던 중에 pm2 통해 무중단 서비스를 운영하게 되었습니다. pm2를 이용하더라도 pm2에 대한 원리를 모르면 우리가 말하는 완벽한 무중단 서비스를 적용하기 힘들다는 것을 알게 되었습니다. pm2를 이용하여 무중단 서비스를 구축하기 위해서 어떤 작업을 express에서 추가적으로 해줘야 하는지 한번 알아보도록 하겠습니다. 중단 배포 vs 무중단 배포 중단 배포란, 앱을 일시적으로 미리 막고 앱을 잠시 중단한뒤에 수정 후 배포하는 것을 말합니다. 보통 사용자들이 많이 사용하지 않는 새벽 시간대를 이용하거나 미리 사용자들에게 공지를 하고 서비스를 잠시 중단하게 됩니다. 반대로 무중단 배포는 서비스를 멈추지 않고 앱을 배포하는 것을 말하.. 2023. 7. 11.
express: 413 payload too large 에러 해결하기 얼마 전 회사에서 express로 백엔드 개발을 하다가 프론트엔드의 요청에 대해서 413 에러가 발생하였습니다. 이에 대한 해결 방법을 간단하게 공유해보도록 하겠습니다. 문제점 먼저 알아볼 내용은 413 에러가 어떤 에러인지 파악하는 것이었습니다. HTTP 상태 코드에서 413 상태 코드는 Payload Too Large 상태를 의미하는 것으로 요청 Entity가 서버에 정의된 제한보다 크다는 것을 의미합니다. (Request Entity Too Large라는 의미이기도 합니다.) 즉 request 크기가 서버에서 제한해놓은 사이즈보다 크다는 것을 나타내는 것입니다. 따라서 해당 제한을 풀어주면 문제는 자연스럽게 해결됩니다. 제가 구축한 Rest API 서비스는 EC2(리눅스)에 express 서버가 띄.. 2022. 6. 2.
Sequelizer : Sequelize-cli의 migration 기능으로 운영중 테이블 스키마 변경하기. sequelize 운영 중 테이블 스키마 변경 문제 개발을 하다 보면 sequelize의 테이블을 추가하거나 스키마를 변경해야 할 때가 있습니다.. 보통 이런 작업을 할 때는 sequlize-cli를 설치하여서 사용합니다. 스키마를 변경하기 위해서는 보통 sequelize.drop을 통해 테이블을 제거한 뒤에 sequelize.sync()를 수행해여야 하는데 drop을 수행하게 되면 테이블에 있던 데이터가 모두 삭제가 됩니다. 만약 운영 중이었다면 소중한 데이터가 백업하지 못하고 날아가게 되기 때문에 무척 치명적일 수 있습니다. 테이블을 안 날리고 데이터베이스의 스키마와 컬럼을 바꿀 수 있을까 찾아보니 sequelize cli의 migration 기능을 이용하면 쉽게 해결되는 것을 알게 되었습니다. 아래.. 2021. 3. 2.
express에서 cookie-parser 사용하기 cookie-parser란? 요청된 쿠키를 쉽게 추출할 수 있도록 도와주는 미들웨어 입니다. express의 request(req) 객체에 cookies 속성이 부여됩니다. node의 npm 패키지에 포함되어 npm install cookie-parser --save를 통해 install하여 사용할 수 있습니다. 예제 코드) var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); app.use(cookieParser()); app.get('/', function(req, res) { console.log('Cookies: ', req.cookies) }) app.listen(8080.. 2019. 5. 7.
express의 middleware란? 개요 미들웨어 함수는 요청 오브젝트(req), 응답 오브젝트 (res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수에 대한 엑세스 권한을 갖는 함수 입니다. 그 다음의 미들웨어 함수는 일반적으로 next라는 이름의 변수로 표시됩니다. 미들웨어 함수는 다음과 같은 테스크를 수행할 수 있습니다. 모든 코드를 실행 요청 및 응답 오브젝트에 대한 변경을 실행 요청 - 응답 주기를 종료 스택 내의 그 다음 미들웨어를 호출 현재의 미들웨어 함수가 요청-응답 주기를 종료하지 않는 경우에는 next()를 호출하여 그 다음 미들웨어 함수에 제어를 전달해야 합니다. 그렇지 않으면 요청은 정지된 채로 방치됩니다. 예시) Hello World 애플리케이션에 대한 2개의 미들웨어 함수를 사용한 예제 개발.. 2019. 3. 12.
nodejs의 모듈 시스템 : export, import 모듈 시스템 자바스크립트는 예전부터 리소스 관리가 어려운 문제가 있었습니다. 리소스는 웹페이지를 구성하는 자원들인데 현재 웹에서는 해당 페이지에 필요한 모든 파일을 불러 와야 하고 그 파일들이 곂치지 않는지 잘 살펴봐야 합니다. 하지만 npm 과 같은 패키지 관리 툴을 사용하여 여러 자바스크립트 라이브러리들을 개발자들이 쉽게 사용할 수 있도록 구현하였고, 자신이 구현한 자바스크립트의 리소스들도 쉽게 다른 파일에서 사용할 수 있게 관리 할 수 있습니다. 기존의 모듈 시스템 require require React from 'react'; require from 'react-dom' 과 같은 형태로 이용이 가능합니다. 모듈 시스템 import import React from ‘react’; Import fro.. 2018. 9. 27.