본문 바로가기

Web

[Express] request.body 빈 필드 validate하는 코드 스타일 고민

스택

1. node.js / express.js

2. mongoDB / mongoose

 

상황

1. 프론트에서 request body로 update할 input 값을 넘겨줌

2. 스키마에 넣기 전, 입력된 input 값이 없는 필드를 지우고 update 객체에 담고자 함

    mongoose의 경우 input 값이 없는 필드가 입력되었을 때 기존의 값 대신 빈 값을 넣어버리기 때문.

 

방식

1. 나머지 변수 + 단축 평가

const { field1, field2, ..., fieldLast } = req.body

const toUpdate = {
    ...( field1 && { field1 }),
    ...( field2 && { field2 }),
    ...,
    ...( fieldLast && { fieldLast }),
}

2. Object.keys() + delete object[key]

const toUpdate = req.body;

for (let key of Object.keys(toUpdate)) {
    if (!toUpdate[key]) {
      delete toUpdate[key];
    }
}

 

비교

1. 실무 활용 측면

 1번의 경우

   a. 필드 명을 확인할 수 있음.

   b. 개별 필드 값을 수정하는 등 별도의 작업을 거칠 경우에 적합함

 2 번의 경우

   a. 간단한 코드

   b. 프론트에서 넘어온 값을 그대로 넘길 때 적합함.

 

2. 코드 관리 및 개선 측면

 1번의 경우

    a. 백엔드에서 특정 값을 수정해야하는 작업이 추가되면 코드 수정에 용이함.

 2번의 경우 

   a. 필드가 사라지거나 이름이 바뀌어도 코드를 수정할 필요가 없음.

 

3. 메모리 측면

 2번의 경우 Object.keys라는 새 배열을 만든다는 점에서 1번보다 많은 메모리를 잡아먹음. 

 

정리

 1번

  - 프로젝트가 계속 바뀌고 개선되는 경우

  - 백엔드에서 값을 바꾸고 스키마로 넘기는 경우

 2번

  - 프로젝트가 완성되고 더 이상 바뀔 여지가 없는 경우

  - 백엔드에서 값을 다루지 않고 그대로 넘기는 경우

'Web' 카테고리의 다른 글

[Express] body parser? urlencoded?  (0) 2022.08.24
[CORS] CSR에서 google oauth2.0 적용기  (0) 2022.07.29
[Express] request 객체에 object 담기  (0) 2022.07.01
MVC 패턴 Service의 존재 가치  (0) 2022.06.23
[Express] mySQL ?와 SET query  (0) 2022.05.17