JOYLOG

ํŒŒ๋ผ๋ฏธํ„ฐ(Parameter)์™€ ์ฟผ๋ฆฌ(Query) : ์œ ๋™์ ์ธ ๊ฐ’ ์ „๋‹ฌ์„ ์œ„ํ•œ URL ์ „๋žต ๋ณธ๋ฌธ

D E V E L O P E R ๐Ÿ’ป/Front-end

ํŒŒ๋ผ๋ฏธํ„ฐ(Parameter)์™€ ์ฟผ๋ฆฌ(Query) : ์œ ๋™์ ์ธ ๊ฐ’ ์ „๋‹ฌ์„ ์œ„ํ•œ URL ์ „๋žต

์ฃผํž 2022. 1. 6. 17:19
history.pushState(null, '', '/kpi/reply');

 

์ธํ„ด ์ƒํ™œ 2์ฃผ์ฐจ! ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋‹ค ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

๊ทธ๋ž˜์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค!

 

 


 

ํŽ˜์ด์ง€ ์ฃผ์†Œ๋ฅผ ์ •์˜ํ•  ๋•Œ, ์œ ๋™์ ์ธ ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์ด ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

 

 

Tip

1. URL์„ ํ†ตํ•ด ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ’์„ ์ง€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ๋กœ๊ณ ์นจ์‹œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๊ฐ’๋“ค์„ ์žƒ์ง€ ์•Š๋Š”๋‹ค

2. ์œ ํšจํ•˜์ง€ ์•Š์€ Parameter์— ๋Œ€ํ•ด์„œ๋Š” Validation ๊ฒ€์‚ฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

 

 

ํŒŒ๋ผ๋ฏธํ„ฐ : /profiles/joy

    → ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํŠน์ • id๋‚˜ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ

์ฟผ๋ฆฌ : /about?detail=true

    → ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ์—” ์–ด๋–ค ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜, ์š”์ฒญ์„ ํ•  ๋•Œ ํ•„์š”ํ•œ ์˜ต์…˜์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ

 

 


 

URL Params

 

์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋กœํ•„ ํŽ˜์ด์ง€๊ฐ€ ์žˆ์„ ๋•Œ, ๋’ท ๋ถ€๋ถ„์— username์„ ๋„ฃ์–ด์ฃผ๋ฉฐ, ํ•ด๋‹น ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.  /profile/joy 

 

src/Profile.js

import React from "react";

const profileData = {
  joy: {
    name: "์ฐจ์กฐ์ด",
	  description: "์˜ค๋Š˜๋„ ์—ด์‹ฌํžˆ ์ผ์„ ํ•˜๋„ค.",
  }
};

// ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋• match ์•ˆ์— ๋“ค์–ด์žˆ๋Š” params ๊ฐ’์„ ์ฐธ์กฐํ•œ๋‹ค.
// match ๊ฐ์ฒด ์•ˆ์—๋Š” ํ˜„์žฌ์˜ ์ฃผ์†Œ๊ฐ€ Route ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •ํ•œ ๊ทœ์น™๊ณผ ์–ด๋–ป๊ฒŒ ์ผ์น˜ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.
function Profile({ match }) {
  const { username } = match.params;
  const profile = profileData[username];

  if (!profile) return <div>์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.</div>;
  return (
    <div>
      <h3>
        {username} ({profile.name})
      </h3>
      <p>{profile.description}</p>
    </div>
  );
}

export default Profile;

 

path ๊ทœ์น™์—๋Š” /profiles/:username ์œผ๋กœ ์ž‘์„ฑํ•ด์ค€๋‹ค๋ฉด, username์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด์ฃผ์–ด์„œ Profile ์ปดํฌ๋„ŒํŠธ์—์„œ match props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

src/App.js

<Route path="/profile/:username" component={Profile} />

 


 

Query

localhost:3000/about?username=joy&name=์ฐจ์กฐ์ด

 

์ด๋ ‡๊ฒŒ ? ๋’ค์— ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ๋“ฏํ•œ ์ฃผ์†Œ๋ฅผ ๋ณธ ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ? ๋’ท ๋ถ€๋ถ„์„ ์ฟผ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

 

์ฟผ๋ฆฌ๋Š” ๋ผ์šฐํŠธ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ props ์ „๋‹ฌ๋˜๋Š” loccation ๊ฐ์ฒด์— ์žˆ๋Š” search ๊ฐ’์—์„œ ์ฝ์–ด์˜ฌ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

location ๊ฐ์ฒด๋Š” ํ˜„์žฌ ์•ฑ์ด ๊ฐ–๊ณ  ์žˆ๋Š” ์ฃผ์†Œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

qs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์œ„ ์ž‘์—…์„ ๋„์™€์ค€๋‹ค.

 

About ์ปดํฌ๋„ŒํŠธ์—์„œ search ๊ฐ’์— ์žˆ๋Š” detail ๊ฐ’์„ ๋ฐ›์•„์™€, ํ•ด๋‹น ๊ฐ’์ด True ์ผ ๋•Œ ์ถ”๊ฐ€์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

import React from "react";
import qs from "qs";

function About({ location }) {
  const query = qs.parse(location.search, {
    ignoreQueryPrefix: true,	// ๋ฌผ์Œํ‘œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ
  });
  const detail = query.detail === "true";
  return (
    <div>
      <h1>์†Œ๊ฐœ</h1>
      <p>๋ผ์šฐํ„ฐ ๊ธฐ์ดˆ ์˜ˆ์ œ</p>
      {detail && <p>detail๊ฐ’์ด true์ž…๋‹ˆ๋‹ค.</p>}
    </div>
  );
}

export default About;
Comments