Server/Node.js

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

JaeHoney 2021. 12. 27. 22:21

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를 유지할 수 있습니다.