Node.js 31

[NestJS] winston을 이용한 커스텀로거

nest에서 제공하는 내장 로거를 사용하면 이러한 형식 로그가 출력이 된다. 내장 로거를 커스텀할 수도 있긴 한데, 위 포맷이 마음에 들었고, 맨 앞의 [Nest]만 내 프로젝트 이름을 넣고 싶었다. 하지만 내장 로거로는 할 수 없고 winston 패키지를 이용해야 한다. 설치 npm i nest-winston winston 적용 커스텀 로거를 만들어서 내장 로거를 대체할 생각이다. 내장로거로 대체하지 않고 따로 사용한다고 하면 이런 식으로 사용해야하는데...가져오는 것도 많고 손이 가지 않는 방식이라 내장로거를 바꾸는걸 택했다. src 안에 logger 디렉터리 생성 후 그 안에 winston.logger.ts 파일 생성 후 아래와 같이 작성 import { WinstonModule, utilities..

Node.js/NestJS 2024.03.19

[NestJS] 환경변수 설정(env)

NestJS 공식홈페이지를 보면 환경변수 설정에 대해서 다양한 방법들을 확인할 수 있다. 그중 난 Joi를 이용한 방법이 가장 좋은 방법 같아서 이 방법을 사용하고 있다. 패키지 설치 npm i @nestjs/config joi 적용 공식 문서에선 app.module.ts의 imports 안에 선언에서 작성하는 예시를 보여준다. 난 app.module.ts에는 만들어진 모듈이나 프로바이더를 가져와서 딱 넣기만 하는 방식으로 만들고 싶어서 좀 수정했다. 먼저 src 밑에 config 디렉터리를 생성 후 config.module.ts 생성 후 아래와 같이 작성한다. import { Module } from '@nestjs/common'; import { ConfigModule as NestConfigModu..

Node.js/NestJS 2024.03.18

[NestJS] 설치 및 Prisma, GraphQL 적용하기(+MySQL)

예전부터 NestJS가 자바스크립트로 스프링을 경험해 볼 수 있다고 해서 사용해보고 싶은 프레임워크 중 하나였다. 하지만 나중에 공부해봐야지....하면서 계속 미루고 미루고 있었다. 그러던 중에 최근 NestJS를 사용해서 백엔드 개발 일을 할 수 있는 좋은 기회가 생겨 하게되었다. 일로 접한다면 미룰 수 없다는 생각이 들었고 이때 아니면 또 계속 미룰 것 같다는 생각에 바로 한다고 했다. 프로젝트는 NestJS에 ORM으로 Prisma를 사용하고 있었고, 클라이언트와 서버 간의 데이터 요청과 전달을 해주는 쿼리 언어 및 런타임으로 GraphQL을 사용하고 있었다. 3개다 들어보기만 하고 처음 만져보는 거라 집에 와서 설치부터 세팅을 직접 해봤다. NestJS설치 및 프로젝트 생성 # NestJS cli..

Node.js/NestJS 2023.12.02

[NodeJS] nodemailer로 이메일 보내기

옛날에 개발을 시작한지 얼마 안 됐을 때, 회사 내부에 자바로 만들어진 이메일 관련된 기능을 수정을 해본 적이 있었는데 참 어려웠었다. 최근 npm 이것저것을 둘러보다가 문득 그때 생각이 나서 노드로 이메일을 보낼 수 있는 npm이 있지 않을까 하고 찾아봤는데 역시나 있었다. 사용법도 매우 간단하다. 작업할 프로젝트 생성(생략해도 됨) npm init CommonJS 모듈 방식이 아니라 ECMAScript 모듈 방식으로 작업하고 싶어서 프로젝트를 생성 후 작업했습니다. 꼭 이렇게 할 필요는 없습니다. package.json에 "type": "module" 추가 패키지 설치 npm install nodemailer dotenv dotenv는 코드 작성 내용 중에 커밋하면 안 되는 항목이 있어서 설치 .en..

Node.js 2023.04.19

[NodeJS] 빌더 패턴(Builder Pattern)

빌더 패턴이란? 복잡한 객체의 생성을 단순화하는 생성 디자인 패턴으로, 단계별로 객체를 만들 수 있다. 복잡한 객체를 만들 때 가독성과 일반적인 개발자 사용성이 크게 향상된다. 어떨 때 사용하면 좋은가? 빌더 패턴의 장점을 살릴 수 있는 가장 명확한 상황은 인자의 목록이 길거나, 많은 복잡한 매개변수를 입력으로 사용하는 생성자가 있는 클래스이다. 일반적으로 이러한 종류의 클래스들은 모두 완전하고 일관된 상태의 인스턴스를 만들기 위해, 너무 많은 매개변수들을 필요로 하기 때문에 고려해볼 필요가 있다. 문제의 클래스 예시 class Boat { constructor( hasMotor, motorCount, motorBrand, motorModel, hasSails, sailsCount, sailsMateri..

Node.js 2022.11.01

[NodeJS] process.nextTick()과 setImmediate(), setTimeout()

process.nextTick() 현재 진행 중인 작업의 완료 시점 뒤로 함수의 실행을 지연시킨다. 콜백을 인수로 취하여 대기 중인 I/O 이벤트 대기열의 앞으로 밀어 넣고 즉시 반환한다. 현재 진행중인 작업이 제어를 이벤트 루프로 넘기는 즉시 콜백이 실행된다. process.nextTick()으로 지연된 콜백은 마이크로태스크라 불리며, 현재의 작업이 완료된 후에 바로 실행되며 다른 I/O 이벤트가 발생하기 전에 실행된다. 이미 예정된 I/O 보다 먼저 실행되기 때문에 재귀 호출과 같은 특정 상황에서 I/O 기아(starvation)을 발생시킬 수 있다. setImmediate()와 setTimeout() process.nextTick()과 목적은 유사하지만 그 의미는 다르다. 이미 큐에 있는 I/O 이..

Node.js 2022.09.02

[NodeJS] 이벤트 디멀티플렉싱과 리액터패턴

이벤트 디멀티플렉싱 대부분의 운영체제는 논 블로킹 리소스를 효율적인 방법으로 처리하기 위한 기본적인 메커니즘인 동기 이벤트 디멀티플렉서, 이벤트 통지 인터페이스를 제공한다. 멀티플렉싱은 전기통신 용어로 여러 신호들을 하나로 합성하여 제한된 수용범위 내에서 매개체를 통하여 쉽게 전달하는 방법을 나타낸다. 디멀티플렉싱은 신호가 원래의 구성요소로 다시 분할되는 작업이다. 동기 이벤트 디멀티플렉서는 여러 리소스를 관찰하고 이 리소스들 중에 읽기 또는 쓰기 연산의 실행이 완료되었을 때 새로운 이벤트를 반환한다. 그리고 이점은 동기 이벤트 디멀티플렉서가 처리하기 위한 새로운 이벤트가 있을 때까지 블로킹된다는 점이다. watchedList.add(docketA, FOR_READ); // (1) watchedList...

Node.js 2022.08.15

[NodeJS] Error : Cannot overwrite users model once compiled

이미 정의된 모델이 있는 상태에서 다시 또 모델을 정의하려는 경우 발생하는 에러다. 처음 이 에러 문구를 보고 내 로직상에서 이 상황 자체가 좀 이해가 안 됐었는 데 먼저 해결 방법부터 말하면 import mongoose from "mongoose"; const { Schema } = mongoose; const userSchema = new Schema({ email: { type: String, required: true, unique: true, }, password: { type: String, required: true, }, name: { type: String, required: true, }, nickName: { type: String, required: true, }, image: St..

Node.js 2022.06.24

[NodeJS] express+mysql2+transaction 데이터 처리

맥북에 mysql 5.7 설치 후 진행했습니다. connection pool 생성 후 트랜잭션을 이용해 정상 처리시 commit을 에러시 rollback을.. 커넥션풀 생성 const mysql = require('mysql2/promise'); const { MYSQL_HOST, MYSQL_USER, MYSQL_PW, MYSQL_DB, } = process.env; module.exports = mysql.createPool({ host: MYSQL_HOST, user: MYSQL_USER, password: MYSQL_PW, database: MYSQL_DB, connectTimeout: 5000, connectionLimit: 30 //default 10 }) 먼저 데이터 insert router...

Node.js 2022.03.15

[NodeJS] express에서 mysql2 사용하기

이전 글(https://minu0807.tistory.com/125)에서 mysql npm을 사용해봤고, async/await을 사용하기 위해선 mysql2를 설치해야 한다고 해서 설치해봤다. 콜백 방식은 보기도 싫고, 작성하는 나도 싫기 때문에... 기존꺼에 작성한 건 바로 수정해봤다. 우선은 mysql2 설치 npm install mysql2 이후 지난번에 작성했던 mysql.js을 수정 const mysql = require('mysql2/promise'); const { MYSQL_HOST, MYSQL_USER, MYSQL_PW, MYSQL_DB, } = process.env; module.exports = mysql.createPool({ host: MYSQL_HOST, user: MYSQL_U..

Node.js 2022.03.10