JSON.stringify๊ฐ€ ๋ฒ”์ธ..? #

node์™€ browser๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ๋ณธ์ธ์€ JSON ๊ฐ์ฒด๋ฅผ ๋งŽ์ด๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์™€ ๋…ธ๋“œ ๋“ฑ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  JSON์„ ๋‚จ๋ฐœํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”. ์ด JSON.stringify๊ฐ€ ๋งŒ์•ฝ O(n)์˜ ์†๋„๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ๊ณผ์—ฐ ์‰ฝ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์„๊นŒ์š”?

์š”์ฆ˜์ด์•ผ cpu ์„ฑ๋Šฅ์ด ์›Œ๋‚™ ์ข‹์•„ ์ถฉ๋ถ„ํžˆ ์ž‘์€ O(n)์€ ๋ฌด์‹œํ•  ์ •๋„๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ ๋Š” ํ•ด๋„,

JSON์€ ์ƒ๊ฐ๋ณด๋‹ค ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ„๊ณผํ•ด์„œ๋Š” ์•ˆ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ์ ์„ ์ฐพ์•„๋‚ธ ๊ฒฝ์œ„ #

์ด ๋ธ”๋กœ๊ทธ์˜ ์ด๋ฏธ์ง€๋“ค์€ base64๋กœ encode๋˜์–ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. file system์„ ๊ธฐ๋ฐ˜์œผ๋กœ db์—†์ด ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ํ•˜๊ณ  server ๋˜ํ•œ ์˜์กดํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ณ  ๋นŒ๋“œํƒ€์ž„์— ์ด๋ฏธ base64๋Š” ์™„์„ฑ๋˜์–ด ๋‚˜๊ฐ€๋ฏ€๋กœ ์œ ์ €์—๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋ฐ›๊ฒŒ network I/O๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์™„๋ฒฝํ• ๊นŒ์š”?

์•„๋‹™๋‹ˆ๋‹ค. base64 ์ด๋ฏธ์ง€๋Š” ์ด๋ฏธ์ง€๋ฅผ text๋กœ encode ํ•ด๋†“์€ ์ƒํƒœ์ด๋ฏ€๋กœ text๊ฐ€ ์•„์ฃผ ํฝ๋‹ˆ๋‹ค.

์ „ ํ•ด๋‹น text๋ฅผ json์œผ๋กœ ์ €์žฅํ•ด๋‘๋Š”๋ฐ์š”.

json ํŒŒ์ผ์€ ๋ธ”๋กœ๊ทธ์˜ post๊ฐ€ ์Œ“์ผ์ˆ˜๋ก ํ•จ๊ป˜ ์šฉ๋Ÿ‰์ด ๋Š˜์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ•์€? #

db ๋„์ž… ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ดค์ง€๋งŒ ํŒŒ์ผ์‹œ์Šคํ…œ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ธฐ์กด์˜ ๋กœ์ง์„ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์€ json์˜ encode, decode๋ฅผ ๋น ๋ฅด๊ฒŒํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

JSON.stringify๊ฐ€ ์‹คํ–‰๋  ๋•Œ, ์ฝ์–ด๋“ค์ด๊ณ  ์žˆ๋Š” json์ด ๋  ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ string์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, ๋ณด๋‹ค ๋น ๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด string์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค„ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ๋ผ๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์ž˜ ๊ตฌํ˜„ํ•ด๋†“์€ ๊ฒƒ์ด

npm์˜ fast-json-stringify์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ• #

๋””ํ…Œ์ผํ•œ ์„ค์ •์€ ๋งํฌ๋ฅผ ํ†ตํ•ดํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (ajv, integer์˜ rounding, largeArrayMechanism ๋“ฑ...)

์šฐ์„  ๋‹จ์ˆœํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์ฃ 

  1. stringify ํ•  object์˜ schema๋ฅผ ์ž‘์„ฑํ•˜๊ณ ,
  2. fast-json-stringify ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€ schema๋ฅผ ์ธ์ž๋กœ ๋„ฃ๋Š”๋‹ค.
  3. 2์—์„œ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋กœ ์‹ค์ œ object๋ฅผ ๋„ฃ์œผ๋ฉด ๋์ž…๋‹ˆ๋‹ค.
const fastJson = require('fast-json-stringify')
const schema = {
  title: 'Example Schema with required field',
  type: 'object',
  properties: {
    nickname: {
      type: 'string'
    },
    mail: {
      type: 'string'
    }
  },
  required: ['mail']
};

const obj = {
	nickname: 'zerozoo',
	mail:'zoozooClub@sbs.com'
};

const stringifySchema = fastJson(schema);
const result = stringifySchema(obj);

(*์†๋„ ๋ฐด์น˜๋งˆํฌ๋Š” ํ•ด๋‹น npm ๋งํฌ์— ๊ธฐ์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.)