body-parser가 필요한 이유
작년에 토이 프로젝트로 express를 활용한 웹 앱을 만들면서,
"프로그래밍을 배운지도 반 년은 되었으니 예전보다 역시 작업 속도가 빨라졌네" 하며 조금 기분 좋아했었는데,
body-parser 때문에 거하게 삽질을 하고 나서 반성하는 시간을 가진 적이 있다.
분명히 클라이언트 쪽에서 서버 쪽으로 json을 잘 보내주는데, 정작 서버 쪽에서는 undefined가 들어오는 상황이었다.
app.get('/something', (req, res) => { console.log(req.body) // undefined })
어느 부분의 로직이 잘못된 건지 몇 번을 코드를 뒤적거렸다.
뭔가 이상해서 예전에 만들었던 토이 프로젝트의 코드를 열어서 어떤 차이점이 있는지 살펴보았다.
그리고 옛날 코드에는 body-parser를 사용했다는 사실을 알게 되었다.
body-parser를 사용해놓고도 이런 실수를 저지른 것은 어떤 모듈 등이 왜 필요한지 명확하게 이해한 상태에서 사용하지 않았기 때문이다. 흔하게/필수적으로 사용하는 모듈이라 아무 생각 없이 썼을 것이다.
"내가 무슨 일을 하고 있는지 나 자신이 제대로 알아야겠다"라는 생각이 들었고, body-parser에 대해 검색했다.
정확히 내가 겪은 일과 내가 궁금했던 점을 이미 다른 사람이 잘 정리해 둔 글을 발견했다.
그리고 Node.js 공식 문서에도 설명이 되어 있었다.
Request Body When receiving a POST or PUT request, the request body might be important to your application. Getting at the body data is a little more involved than accessing request headers. The request object that's passed in to a handler implements the ReadableStream interface. This stream can be listened to or piped elsewhere just like any other stream. We can grab the data right out of the stream by listening to the stream's 'data' and 'end' events. The chunk emitted in each 'data' event is a Buffer. If you know it's going to be string data, the best thing to do is collect the data in an array, then at the 'end', concatenate and stringify it.
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// at this point, `body` has the entire request body stored in it as a string
});
request객체는 ReadableStream 인터페이스를 갖고 있다.
따라서 이 스트림을 들을 수도 있고, 다른 곳에 파이프를 통해 전달할 수도 있다.
스트림의 'data', 'end'이벤트를 이용해서 스트림에 들어있는 데이터를 얻을 수 있다.
만약 지금 받고자 하는 데이터가 스트링이라는 것을 알고 있다면,
'data' 이벤트마다 있는 chunk를 차곡차곡 모아놨다가 'end'이벤트가 일어나면 모은 chunk들을 합치고 stringify 해서 가질 수 있다.
우리가 원하는 데이터는 stream으로 들어온다.
bdoy-parser는 이 stream을 이용해 직접 chunk를 모아서 가공하는 일을 대신해주고,
req.body 프로퍼티로 접근해서 원하는 데이터를 손쉽게 활용할 수 있도록 해주는 것이다.
내가 처음 짰던 서버에서 계속 undefined를 받았던 이유는 express 공식 문서의 req.body부분을 보면 알 수 있다.
Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as express.json() or express.urlencoded().
아무런 함수 또는 바디파서를 사용하지 않아서 undefined를 받았던 것이다.
교훈: 코드 한 줄을 짤 때도 내가 정확히 무슨 일을 하고 있는지 잘 아는 사람이 되어야겠다.
'프로그래밍' 카테고리의 다른 글
[토막팁] 깃헙 빨간색 하이라이팅의 정체 (0) | 2020.04.16 |
---|---|
HTTP란 무엇인가 (0) | 2020.03.24 |
Big-O 표기법 (0) | 2020.03.19 |
sequelize 마이그레이션 버그를 고쳐 보자. (0) | 2020.03.18 |
primary key, natural key, surrogate key (0) | 2020.03.18 |