노드 7

Sequelize - bigint를 사용하는 방법? (+ underscored)

DB에 bigint로 저장된 컬럼을 API에서 꺼내서 그대로 사용하면 바이트 부족으로 인해서 데이터가 손실됩니다..!! Sequelize에서는 아래와 같이 dialectOptions의 supportBigNumbers를 정의해서, 손실을 방지할 수 있고, bigNumberStrings를 정의해서 string으로 받을 수도 있습니다. import { Sequelize } from "sequelize"; const shopDB = new Sequelize( "shopDB", "root", "root", { host: "localhost", dialect: "mysql", pool: { max: 10, min: 0, acquire: 5000, idle: 10000, }, timezone: "+09:00", di..

Server/Node.js 2022.01.11

Sequelize - 일괄 등록, 일괄 수정 하기 (bulk create, bulk update)

일괄 등록 (bulkCreate) const result = await User.bulkCreate(usersDTO) 일괄 등록의 경우 Sequelize는 bulkCreate 메서드를 지원하고 있습니다. bulkCreate()를 이용해서 배열을 한 번에 insert 칠 수 있습니다. 일괄 수정 (bulkUpdate) Sequelize에서 일괄 수정을 하는 방법은 3가지가 있습니다. 한 가지씩 소개해드리겠습니다 ! 1. update const result = await User.update({ name: updateUsersDto.name }, { where: { id: { [Op.in]: updateUsersDto.users } } }); // UserDTO.ts export interface Updat..

Server/Node.js 2022.01.05

NodeJS - 전역 예외 핸들러 구현 (Custom global exception handler)

전역 예외 핸들러 저의 경우 Sequelize + express + nodejs의 프로젝트를 하고 있었는데, Sequelize가 500번대 예외를 뱉는 경우가 많았습니다. 해당 부분은 App단에서 최대한 검증을 해서 요청을 보내면 좋겠지만, 동시성 문제로 어쩔 수 없이 예외가 발생하기도 합니다. 요즘은 500번대 에러는 핸들링을 하는 것을 원칙으로 하는 기업이 많은 걸로 알고 있습니다. 특히 네이버 특정 계열사 Open API Reference에 보면 500번대 에러가 나오면 제보해달라는 내용이 있기도 하기도 합니다. 따라서, 해당 예외를 핸들링하고 싶었는데, 각 메서드에 여러개의 예외처리를 전부 공통적으로 붙이면 유지보수성이 떨어지니까, 전역 범위로 적용해야 했습니다. 스프링은 @ControllerAd..

Server/Node.js 2021.12.29

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

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