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 ๋ฑ...)
์ฐ์ ๋จ์ํ ์ฌ์ฉ๋ฒ์ ์์๋ณด์ฃ
- stringify ํ object์ schema๋ฅผ ์์ฑํ๊ณ ,
- fast-json-stringify ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ schema๋ฅผ ์ธ์๋ก ๋ฃ๋๋ค.
- 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 ๋งํฌ์ ๊ธฐ์ฌ๋์ด ์์ต๋๋ค.)