๋ฐ˜์‘ํ˜•

URL ๊ฐ์ฒด


 

ํ˜„์žฌ ํŽ˜์ด์ง€์˜ URL์ด ์•„๋ž˜์™€ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ... ์ฐธ๊ณ ๋กœ %20 ์€ ๋นˆ์นธ(space) 1๊ฐœ

https://example.com/?name=Jonathan%20Smith&age=18

 

url ๊ฐ์ฒด์˜ search ์†์„ฑ์„ ์ด์šฉํ•ด ๋ชจ๋“  ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค

const url = new URL(window.location.href); // ํ˜„์žฌ url
url.search; // '?name=Jonathan%20Smith&age=18'

 

name age ๊ฐ™์€ ํŠน์ • ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด URLSearchParams ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. get์œผ๋กœ ๊ฐ’์„ ์กฐํšŒํ•˜๊ณ  append(๊ธฐ์กด ๊ฐ’์— ์ด์–ด๋ถ™์ด๊ธฐ) ํ˜น์€ set(๊ธฐ์กด๊ฐ’ ๊ต์ฒด)์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

url.searchParams.get('name'); // 'Jonathan Smith'
url.searchParams.get('age'); // 18

url.searchParams.append('city', 'Seoul'); // 'city' ํ‚ค ๊ฐ’์— 'Seoul' ์ถ”๊ฐ€
url.searchParams.get('city'); // 'Seoul'

url.searchParams.set('name', 'Johan'); // 'name' ํ‚ค ๊ฐ’์„ 'Jahan'์œผ๋กœ ๋Œ€์ฒด
url.searchParams.get('name'); // 'Johan'

 

๋งŒ์•ฝ ํŠน์ • ์ฟผ๋ฆฌ์˜(ํ‚ค) ๊ฐ’์ด ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด getAll์„ ์ด์šฉํ•ด์„œ ๋ชจ๋‘ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. get์€ ์ฒซ๋ฒˆ์งธ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค

url.searchParams.set('name', 'Smith');
url.searchParams.append('name', 'Johan');
url.search; // '?name=Smith&age=18&name=Johan'

url.searchParams.get('name'); // 'Smith'
url.searchParams.getAll('name'); // ['Smith', 'Johan']

 

toString ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค

const url = new URL('https://example.com/?name=Jonathan%20Smith&age=18');
url.toString(); // 'https://example.com/?name=Jonathan%20Smith&age=18'

 

searchParams ๊ฐ์ฒด


searchParams ๊ฐ์ฒด๋งŒ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๋‹จ๋…์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง(url.search)์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์ฃผ์†Œ๊ฐ€ ํ•„์š”์—†์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•˜๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ URL ๊ฐ์ฒด์™€ ๋น„์Šทํ•˜๋‹ค.

const searchParams = new URLSearchParams('hello=world');
searchParams.get('hello'); // 'world'
searchParams.append('name', 'Johan'); // 'Johan'
searchParams.toString(); // 'hello=world&name=Johan'

 

์ฒดํฌ๋ฐ•์Šค๋‚˜ ๋ผ๋””์˜ค ๊ฐ™์€ form ์–‘์‹์„ ์ „์†กํ•  ๋•Œ application/x-www-form-urlencoded ์ฝ˜ํ…์ธ  ํƒ€์ž…์œผ๋กœ ๋ณด๋‚ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. form ์–‘์‹์„ <form> ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ๊ณ  <input type="submit" /> (ํ˜น์€ submit ํƒ€์ž…์˜ button ํƒœ๊ทธ) ์ œ์ถœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์„œ๋ฒ„๋กœ ์ „์†ก๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค(์ฐธ๊ณ  ๋งํฌ).

 

๐Ÿ’ก button ํƒ€์ž…์˜ ๊ธฐ๋ณธ๊ฐ’์€ submit์ด๋‹ค(form ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•˜๋Š” ๋ฒ„ํŠผ์ž„์„ ๋ช…์‹œ).

<form onSubmit={(e) => e.preventDefault()}>
  <div>
    <span>์ด๋ฉ”์ผ</span>
    <input type="email" onChange={this.handleInputValue('email')} />
  </div>
  <button className="btn btn-login" type="submit" onClick={this.handleLogin}>
    ๋กœ๊ทธ์ธ
  </button>
</form>;

 

๋งŒ์•ฝ form ์–‘์‹(input ํƒœ๊ทธ)์„ ๋ณ„๋„ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์ œ์ถœ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์™€ <input> ํƒœ๊ทธ๋ฅผ ๋ Œ๋”ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ๋‹ค๋ฅด๋‹ค๋ฉด searchParams ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œ์—์„œ payload๋Š” POST ์š”์ฒญ ์‹œ body๋กœ ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ์›ํ•˜๋Š” key์˜ ๊ฐ’์œผ๋กœ ๋‹ด์•„์„œ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์—์„  'input'์ด๋ผ๋Š” key์— ๋‹ด์•˜๋‹ค.

export default {
  get: () => {}, // ์ƒ๋žต
  post: (payload) => {
    const params = new URLSearchParams();
    params.append('input', JSON.stringify(payload));

    return axios.post(`${baseUrl}/submit`, params, {
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
      },
    });
  },
};

 

๋ฐฐ์—ด / ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์œผ๋กœ ํ• ๋‹นํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ URL ์ธ์ฝ”๋”ฉ(ASCII Encoding) ๋œ๋‹ค.

const url = new URL('https://example.com/');
const payload = [{ name: 'Johan', age: 30 }];

url.searchParams.append('input', JSON.stringify(payload));
url.search; // '?input=%5B%7B%22name%22%3A%22Johan%22%2C%22age%22%3A30%7D%5D'

 

 

๋” ๋งŽ์€ URL ์ธ์ฝ”๋”ฉ ๋ ˆํผ๋Ÿฐ์Šค ๋ฆฌ์ŠคํŠธ๋Š” W3C ์ฐธ๊ณ .

  • [ : %5B
  • ] : %5D
  • { : %7B
  • } : %7D
  • " : %22

 

๐Ÿ’ก searchParams ๊ฐ์ฒด๋Š” forEach ๋ฉ”์„œ๋“œ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ (value ์ˆœํšŒ) for of ๋ฐ˜๋ณต๋ฌธ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค(key/value ์Œ ์ˆœํšŒ). ์œ ๋‹ˆ์ฝ”๋“œ ํฌ์ธํŠธ ์ˆœ์œผ๋กœ key๋ฅผ ์ •๋ ฌํ•˜๋Š” sort() ๋ฉ”์„œ๋“œ๋„ ์žˆ๋‹ค.

const searchParams = new URLSearchParams();
searchParams.append('name', 'smith');
searchParams.append('name', 'johan');
searchParams.append('age', '30');

// ๋ชจ๋“  value ์ˆœํšŒ
searchParams.forEach((el) => console.log(el)); // 'smith' 'johan' '30'

// ๋ชจ๋“  key/value ์Œ ์ˆœํšŒ. searchParams.entries()๋ฅผ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค
for (p of searchParams) {
  console.log(p); // ['name', 'smith'] ['name', 'johan'] ['age', '30']
}

// ๋ชจ๋“  key ์ˆœํšŒ
for (key of searchParams.keys()) {
  console.log(key); // 'name' 'age'
}

// ๋ชจ๋“  value ์ˆœํšŒ
for (key of searchParams.values()) {
  console.log(key); // 'smith' 'johan' '30'
}

const searchParams = new URLSearchParams('c=4&a=2&b=3&a=1');
searchParams.sort(); // ์œ ๋‹ˆ์ฝ”๋“œ ํฌ์ธํŠธ ๊ฐ’์— ๋”ฐ๋ผ key ์ •๋ ฌ
console.log(searchParams.toString()); // "a=2&a=1&b=3&c=4"

 

๋ ˆํผ๋Ÿฐ์Šค


 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•