Frontend/TypeScript

[ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript) ] query๋ฌธ์˜ value๊ฐ’์— key๊ฐ’๊ณผ ๋™์ผํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ์„ ๋•Œ

YWTechIT 2022. 7. 12. 06:41
728x90

๐Ÿ“ query๋ฌธ์˜ value๊ฐ’์— key๊ฐ’๊ณผ ๋™์ผํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ์„ ๋•Œ

๋ณธ์ธ์ธ์ฆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘ query์— key1=value1&key2=value2๊ฐ’์ด ์ถ”๊ฐ€๋œ ์ƒํƒœ๋กœ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— query๋ฌธ์„ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ฒช์—ˆ๋˜ ์ผ์ด๋‹ค. ๋‹น์‹œ URL์€ http://localhost:3001/foo/bar?returnUrl=returnUrl=/foo&id=baz์™€ ๊ฐ™์•˜๋Š”๋ฐ query๋ฌธ์„ ๋ถ„์„ํ•˜๋ฉด returnUrl=returnUrl=/foo๊ฐ€ ํ•œ ๋ฌถ์Œ id=baz๊ฐ€ ํ•œ ๋ฌถ์Œ์ธ ์ด 2๊ฐœ์˜ query๊ฐ€ ๋‚˜์™”๋‹ค.

 

๋‘๋ฒˆ์งธ query๊ฐ’์€ ๋ณ„ ์ด์ƒ์ด ์—†์—ˆ์œผ๋‚˜, ์ฒซ๋ฒˆ์งธ query๊ฐ€ ์ด์ƒํ–ˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์ฒซ๋ฒˆ์งธ query์˜ key๊ฐ’์ธ returnUrl์ด value๊ฐ’์—๋„ ๋“ค์–ด๊ฐ€์žˆ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ๋‹น์‹œ value์— returnUrl=์€ ํ•„์š”์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ’์„ ์ œ๊ฑฐํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์„ ๋Š๊ผˆ๋Š”๋ฐ, ๋‚˜์ค‘์— ๋งค์šฐ ๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ ์ฒ˜์Œ์—” ์–ด๋–ป๊ฒŒ ์ œ๊ฑฐํ•ด์•ผํ• ์ง€ ๋ชฐ๋ž๋‹ค. ๊ทธ๋ž˜์„œ qs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ encoder์„ ์ด์šฉํ–ˆ๋‹ค. ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ README๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

728x90

stringify์˜ ๋‘๋ฒˆ์งธ์ธ์ž์— encoder ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ ์ธ์ž์— query๋ฌธ์ด ๋„˜์–ด์˜ค๊ฒŒ ๋˜๊ณ , ๋„ค๋ฒˆ์งธ ์ธ์ž์ธ type์„ ์ด์šฉํ•ด type์ด value์ผ ๋•Œ ์กฐ๊ฑด์„ ๊ฑธ์–ด ์›ํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ’์ด ๋„˜์–ด์˜ค๋ฉด includes๋ฅผ ํ†ตํ•ด split์„ ํ•˜๋Š”๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ง€๋Š” ์ฝ”๋“œ๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณฐ๊ณฐ์ด ์ƒ๊ฐ + ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋์— ๋– ์˜ฌ๋ฆฐ๊ฒƒ์€ query๋ฌธ์„ ๋„˜๊ฒจ์ค„ ๋•Œ key๊ฐ’์„ ๋งŒ๋“ค์–ด ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ• ๋Œ€์‹  qs.parse๋ฅผ ์ด์šฉํ•˜์—ฌ key๊ฐ’์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  value์— ์žˆ๋Š” ๊ฐ’(returnUrl=/foo)์˜ returnUrl์„ key๊ฐ’์ธ ๊ฐ์ฒดํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด qs.stringify์— ๋„˜๊ฒจ์ค„ ๋•Œ spread operator๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด์ „ ์ฝ”๋“œ๋ณด๋‹ค ๋” ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง„ ์ฝ”๋“œ๊ฐ€ ๋˜์—ˆ๋‹ค. qs.stringify๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ key๊ฐ’์ด value์— ์ค‘๋ณต์„ ์–ธ ๋˜์–ด์žˆ์–ด ์ œ๊ฑฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด ๊ธ€์ฒ˜๋Ÿผ parse + ...๋กœ ํ•ด๊ฒฐํ•ด๋ณด์ž. ๋ถˆํ•„์š”ํ•˜๊ฒŒ encoder๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

import { stringify } from 'qs'

// encoder example
var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {
    if (type === 'key') {
        return // Encoded key
    } else if (type === 'value') {
        return // Encoded value
    }
}})

// before
const url = generateUrl({
    path,
    query: stringify(
      {
        returnUrl: returnUrlQuery,
        ordrIdxx,
      },
      {
        encoder: (query: string, _0, _1, type) => {
          if (type === 'value') {
            const value = 'returnUrl='
            const isValue = query.includes(value)
            if (isValue) {
              const [, extractValue] = query.split(value)
              return extractValue
            }
          }
          return query
        },
      },
    ),
  })

// after
import { stringify, parse } from 'qs'

const { path, query: returnUrlQuery } = parseUrl(returnUrl) // returnUrlQuery: returnUrl=/foo
const originalQuery = parse(returnUrlQuery)  // { returnUrl: '/foo' }

const url = generateUrl({
  path,
  query: stringify({
    ...originalQuery,
    baz,
  }),
  })  // url: /foo/bar?returnUrl=/foo

Reference

  1. qs-stringify
๋ฐ˜์‘ํ˜•