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 및 엔터티 필드는 전부 camelCase)
라이브러리 설치
npm install --save snakecase-keys
snakecase-keys는 객체의 key값 들만 snake_case로 바꿔주는 라이브러리입니다. 배열이든, 객체 안에 객체가 있든 안까지 들어가서 변환을 해줍니다..!
npm i express-unless
express-unless를 사용해서 미들웨어를 정의해서 조건을 컨트롤 할 수 있습니다.
Handler 구현
import { Request, Response, NextFunction } from 'express'
import unless from 'express-unless'
import snakesKeys from "snakecase-keys";
export const snakeCaseHandler = () => {
const snakeCaseResHandler = (_req: Request, res: Response, next: NextFunction) => {
const send = res.send;
res.send = function(body?: Buffer | String | Boolean | Array<any>){
if (body != null){
body = snakesKeys(JSON.parse(body.toString()));
}
send.call(this, Buffer.from(JSON.stringify(body)));
return res;
}
next();
}
const snakeCaseReqHandler = (req: Request, _res: Response, next: NextFunction) => {
req.body = snakesKeys(req.body);
next();
}
snakeCaseResHandler.unless = unless;
snakeCaseReqHandler.unless = unless;
return [snakeCaseResHandler, snakeCaseReqHandler];
}
typescript 예제 입니다. middleware라는 폴더를 하나 만들어서 SnakeCaseHandler.ts에 저장합니다.
적용
const app = express();
app.use(snakeCaseHandler());
app.ts에서 express를 세팅할 때 snakeCaseHandler를 사용하도록 코드를 작성합니다 !!
이를 사용하면, 요청이 오거나 갈 때 snake_case로 변환을 해주기 때문에, 모든 엔터티와 DTO의 필드는 camelCase를 사용해서 DB 및 통신 Layer와 구현 Layer를 확실하게 분리할 수 있고, 구현 Layer에서는 camelCase를 유지할 수 있습니다.
'Server > Node.js' 카테고리의 다른 글
Sequelize - 일괄 등록, 일괄 수정 하기 (bulk create, bulk update) (0) | 2022.01.05 |
---|---|
NodeJS - 전역 예외 핸들러 구현 (Custom global exception handler) (0) | 2021.12.29 |
NodsJS - BullMQ 사용 (대기열, 동시성 제어 등) (0) | 2021.12.25 |
NodeJS - 모델매퍼(ModelMapper) 사용 [Class transformer] (0) | 2021.12.24 |
NodeJS - JSON null필드를 Response에서 생략하는 방법! (0) | 2021.12.21 |