Server/Node.js 16

NodeJS - API Response를 snake case로 변환하기(DTO, Entity 필드는 camel case)

API Request, Response body를 snake_case로 변환 ? 데이터베이스의 테이블 스키마를 작성할 때는 주로 snake_case를 사용합니다. 또한, 최근 들어 API의 Request, Response body 컨벤션으로 snake_case를 사용하면서 통신하는 것이 많이 선호되고 있는 것 같습니다. 스프링은 Jackson 라이브러리를 사용해서 이를 쉽게 처리할 수 있는데, 아쉽게도 nodejs, express에서는 코드 한 줄로 이를 처리할 수 있는 방법이 없습니다. 방법은 2가지가 있습니다. 포스팅에서는 2번째 방법을 다룹니다. 1. DTO 및 엔터티를 전부 snake_case로 작성하는 방법 2. middleware를 사용해서 snake_case로 변환해주는 방법 (DTO 및 엔..

Server/Node.js 2021.12.27

NodsJS - BullMQ 사용 (대기열, 동시성 제어 등)

BullMQ BullMQ는 Redis를 기반으로 하고, kafka나 RabbitMQ보다 훨씬 가볍고 편리한 Message queue입니다. 현재 기준 Github Star 11.8K 정도 되고, 거의 매일같이 커밋이 올라오는 뜨거운 라이브러리입니다. 제가 BullMQ를 도입하게 된 이유는 잔량을 파악해서 순차적으로 작업을 실행해야 하는 일이 있었는데, 테이블 구조가 DB 락(Select... for update)을 걸 수가 없는 상황이었습니다. 그래서, 대기열을 따라서 순차적인 처리를 위해 도입했습니다. BullMQ를 도입하기 전에 kafka 도입을 검토했었는데, 앱 서버만해도 2개가 추가되고 (Producer, Consumer)랑 또 추가로 Zookeeper, kafka 등 띄울게 너무 많고 무거웠어요..

Server/Node.js 2021.12.25

NodeJS - 모델매퍼(ModelMapper) 사용 [Class transformer]

모델 매퍼(ModelMapper) 스프링의 경우 DTO와 엔터티간의 변환을 할 때 ModelMapper나 Mapstruct라는 라이브러리를 많이 사용합니다. 그러면, 객체가 가질 수 있는 프로퍼티는 옮겨지게 되고, 아닌 프로퍼티는 버려지게 되죠. JS는 그러한 역할이 없어서 상당히 불편했습니다. Interface를 고집한다는 점과 Class instance와 Literal object 간 변환이 어렵다는 점이 이유입니다. 그나마 쓸만한 라이브러리가 AutoMapper인데 사용하기가 어렵고 유지보수가 중지되었죠. 그래서 최근에 나와서 핫한 라이브러리 중 하나가 class-transformer입니다. 이 라이브러리는 ModelMapper 역할을 훌륭하게 수행할 수 있고, 상당히 강력하고 간단합니다. 최근 c..

Server/Node.js 2021.12.24

NodeJS - JSON null필드를 Response에서 생략하는 방법!

const app = express(); // JSON null 필드 생략 app.set('json replacer', (k, v) => (v === null ? undefined : v)); 위와 같은 방법으로, 익스프레스에 json replacer를 정의해서 필요한 경우 null필드를 response에서 제외할 수 있습니다. ORM으로 sequelize나 type orm을 사용하는 경우에는 exclude, attributes 등을 사용해서 response를 원하는 범위로 조작할 수도 있습니다!

Server/Node.js 2021.12.21

Sequelize - 자식 테이블까지 한 번에 Insert 치는 방법 (Join Insert) + 상황에 따라 다른 쿼리를 날리는 방법

자식 테이블까지 Insert 하기 const result: Product = await Product.create(createProductDto, { include: includeStatement }); // ProducdtDto.ts export interface CreateProductDto { name: string; description?: string; count?: number; productImages?: ProductImageDto[]; } typescript 예시입니다. Sequelize의 include를 사용하면 관계를 맺고있는 자식 테이블까지 함께 insert를 칠 수 있습니다. hasOne이든 hasMany든 Sequelize가 그에 맞게 insert를 해줍니다 ! 상황에 다른 쿼리..

Server/Node.js 2021.12.19

NodeJS - API에서 Delete 테스트 하는 방법 ! (Jest)

Delete 테스트 케이스 작성하는 법 Delete를 테스트 하기 위해서는 Insert -> 해당 레코드를 Delete 하는 식으로 진행해야 합니다. 문제는 이 때 비동기로 인해서 Delete 테스트가 먼저 실행되서 404_Not_found가 나오는 문제가 발생합니다. 따라서 이 때는 async, await를 이용해서 동기화 즉, 순서를 지정해줘야 합니다. generate async function generateResource() { const resource = { name: "카테고리 이름", description: "설명", }; const result = await Resource.create(resource); return result.id; } 먼저 엔터티한 후, 레코드의 id를 return..

Server/Node.js 2021.12.19