본문 바로가기

노드

[node.js] express.urlencoded 에 대한 이해

반응형

express.urlencoded

이 미들웨어 함수는 HTTP POST 요청의 본문(body)에 인코딩된 데이터를 해석하고, req.body 객체에 채워넣어주는 역할을 합니다.

 

간략하게  사용되는 예시를 보여 드리면 다음과 같습니다.

const express = require('express');
const app = express();

app.use(express.urlencoded({ extended: false })); //false : querystring 모듈 사용
 
app.post('/login', (req, res) => {
  console.log(req.body.username); // POST 요청의 body에 포함된 username 값을 출력
  console.log(req.body.password); // POST 요청의 body에 포함된 password 값을 출력
  res.send('로그인이 완료되었습니다.');
});

app.listen(3000);


이러한 express.urlencoded() 함수는 Content-Type 헤더가 application/x-www-form-urlencoded로 설정된 요청에 대해 사용되는대. 이 헤더는 대개 HTML 폼(form)에서 데이터를 전송할 때 사용됩니다.

그리고 express.urlencoded() 함수는 내부적으로 Node.js의 querystring 모듈 이나 외부의 qs  모듈을 사용하여 본문 데이터를 해석합니다. 

 

참고로) 익스프레스 4.16.0 버전부터 body-parser 미들웨어의 일부 기능이 익스프레스에 내장되면서 과거 'body-parser' 라이브러리를 설치해야만 사용 가능했던 urleccoded 메서드를 express 의 내장 메서드로서 사용할 수 있게 되었습니다.

 

또한,   express.urlencoded 는 기본적으로 다음과 같은 형태를 지닙니다.

app.use(express.urlencoded({ extended: false }));
// or
app.use(express.urlencoded({ extended: true }));

 

이제부터, 이 글을 작성한 목적인  두가지 속성값이 무엇을 의미하는지, 같은 기능을 하는 것은 분명한데, 무엇을 사용하는게 좋은지 등을 알아보고자 합니다.


.

express.urlencoded({ extended : true  })

extended 속성의 값으로 true를 입력하게 되면 qs 모듈을 사용하여 쿼리스트링을 해석합니다.   qs 모듈은 node.js 내장 모듈이 아니므로 외부에서 다운 받아야 하는데 npm 을 통해 설치합니다.

qs 모듈은 URL 쿼리 문자열을 자바스크립트 객체 형태로 변환하거나, 객체를 URL 쿼리 문자열로 변환하는 기능을 하며, querystring 모듈과는 다르게 배열이나 객체를 다루는 데 있어서 보다 복잡한 구조를 지닌 객체나 배열의 경우에도 변환이 가능합니다.

 

다음 코드에서 알 수 있듯이, qs 모듈은 자바스크립트 객체나 배열과 같은 복잡한 형태의 타입을  URL 쿼리 문자열로 변환하기에 적합함을 알 수 있습니다.

const qs = require('qs');

// JavaScript 객체를 URL 쿼리 문자열로 변환
const obj = {
  name: 'John',
  age: 25,
  hobbies: ['reading', 'swimming'],
  address: {
    city: 'Seoul',
    street: 'Gangnam'
  }
};
const params = qs.stringify(obj);
console.log(params); // name=John&age=25&hobbies%5B0%5D=reading&hobbies%5B1%5D=swimming&address%5Bcity%5D=Seoul&address%5Bstreet%5D=Gangnam

express.urlencoded({ extended : false  })

false 를 입력하면 querystring 모듈을 사용하여 쿼리스트링을 해석합니다. querystring 은 node.js 의 내장 모듈입니다. 이 모듈 URL-querystring 으로 표현 가능한  객체 형태의  단순한 문자열을 다루는 데 적합합니다. 

 

이해를 돕기 위해 다음 코드를 준비해 보았습니다. 객체를 URL 쿼리 문자열로 바꾸는 것과 URL 쿼리 문자열을 객체로 변환하는 예시를 표현했습니다.

//querystring 모듈을 불러옵니다.
const querystring = require('querystring');
//URL-querystring 형식으로 데이터를 저장합니다.
const params = 'name=John&age=25';
//querystring 모듈의 parse 메서드를 사용하여 문자열을 객체로 변환합니다.
const obj = querystring.parse(params);
// 변환된 객체를 출력합니다.
console.log(obj); // { name: 'John', age: '25' }
const querystring = require('querystring');
// 단순한 객체 리터럴을 저장합니다.
const obj = { name: 'John', age: '25' };
// querystring 모듈의 stringify 메서드를 사용하여 객체를 url-쿼리문자열로 변환합니다.
const params = querystring.stringify(obj);
// 변환된 결과를 출력합니다.
console.log(params); // name=John&age=25

위 코드에서 알 수 있듯이 querystring 모듈은 URL 쿼리 문자열과 단순한 자바스크립트 객체 형태의 문자열 간의 변환을 수행하는 데 적합한 모듈입니다.

 

따라서 그 외 배열 자료형이나 URL 쿼리문자열로 사용하기 어려운 문자나 기호를 사용하는 경우에는 아에 변환이 불가능하거나 부정확하게 변환이 될 수 있습니다.


즉, 복잡한 배열이나 객체의 형태를 가지는 경우에는 qs 모듈을 사용하는 것이 적합하고, URL 쿼리 문자열로 표현하기 쉬운 단순한 객체 문자열 형태라면 querystring 모듈을 사용하는 것이 좋습니다.

 

반응형