์ด๋ฒ์๋ ๊ฒ์๊ธ์์ ํด๋น ์ ์ ์ ํ๋กํ๋ก ์ด๋ํด ๊ฑฐ๋ ์ํฉ์ ํ์ธํ๊ณ , ๋ฐ๋ก ๋ํ๋ฅผ ์์ํ ์ ์๋๋ก ํ๋ TradeProfile ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. ๋จ์ํ ํ๋กํ ํ๋ฉด์ด ์๋๋ผ, ๊ฑฐ๋ ์ ์ฉ ํ๋กํ ๋ทฐ๋ฅผ ๋ง๋๋ ์์ ์ด์๊ณ , ๊ฑฐ๋ ๋ด๋น ํ์๊ณผ์ ํ์ ์ ํตํด PostBlock โ TradeProfile๋ก ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ๋๋ UX ํ๋ฆ์ ์์ฑํ๋ค.
๊ฑฐ๋ ๋ฆฌ์คํธ์์ ๊ฐ ๊ฒ์๊ธ์ ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ๋ PostBlock์ด์๋ค. ์ด ์ปดํฌ๋ํธ๋ ๊ฑฐ๋ ๋ด๋น ํ์์ด ๊ตฌํํ ๊ตฌ์กฐ๋ก, ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ํด๋ฆญ ์ ํด๋น ์ ์ ์ TradeProfile๋ก ์ด๋ํ๋ ๋ก์ง์ ์ถ๊ฐํ๋ค.
const handleClick = () => {
const userId: string = post.foreign_ids.user_id;
const title: string = post.title;
navigate(`/trade-profile?userID=${userId}&title=${encodeURIComponent(title)}`);
};
useNavigate()๋ฅผ ์ฌ์ฉํด ์ ์ ID์ ๊ฒ์๊ธ ์ ๋ชฉ์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๊ณ , TradeProfile์์ ์ด๋ฅผ ๋ฐ์์ ํด๋น ์ ์ ์ ์ ๋ณด์ ์ต๊ทผ ๊ฑฐ๋ ๋ด์ญ์ ๋ถ๋ฌ์จ๋ค.
<ProfileContainer ... />
<TradeStatus ... />
<LatestTrade ... />
<Button>๋ํ ์์</Button>
๊ธฐ์กด์ ์ฐ๋ ProfileContainer, TradeStatus ๋ฑ์ ์ฌ์ฌ์ฉํ์ฌ ๊ตฌ์กฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ก์๋ค.
์ต๊ทผ ๊ฑฐ๋ ๋ด์ญ์ ExchangeData๋ฅผ ํํฐ๋งํด์ 3๊ฐ์ฉ ๋ณด์ฌ์ฃผ๋๋ก LatestTrade ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ก ๋ง๋ค์๋ค.
const exchangeWing = GetExchangePostByFilterWing(exchangeParam);
const exchangeResponse = await shootingStar.launch(exchangeWing);
setPosts(exchangeResponse.data.items);
โ ์ ์ ์ ๊ฑฐ๋ ๋ด์ญ์ ์๋ฒ์์ ๋ฐ์์์ ๊ฑฐ๋ ์ํ์ ํจ๊ป ํ์ํ๋ค.
ProfileContainer, TradeStatus๋ ๊ธฐ์กด Profile ํ์ด์ง์์ ์ฐ์ด๋ ๊ฒ์ ๊ทธ๋๋ก ์ฌ์ฉ
getImagePathFromProfile() ์ญ์ ๊ธฐ์กด ์ ํธํจ์๋ฅผ ๊ทธ๋๋ก ํ์ฉ
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ ์ค๊ณ๊ฐ ๋์ด ์์๊ธฐ ๋๋ฌธ์ ๋ก์ง ์ค๋ณต ์์ด ๋น ๋ฅด๊ฒ ๊ตฌํ ๊ฐ๋ฅํ๊ณ , CSS ์คํ์ผ๋ ์ด๋ฏธ ๋ง์ถฐ์ ธ ์์ด์ ๋์์ธ ํต์ผ์ฑ๋ ํ๋ณดํ ์ ์์๋ค.
์ด ์์ ์ ํผ์์ ํ ๊ฒ ์๋๋ผ, ๊ฑฐ๋ ๊ฒ์ํ์ ๋ด๋นํ ํ์๊ณผ ํจ๊ป ์์ ํ ๊ฒฐ๊ณผ๋ฌผ์ด๋ค.
PostBlock ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋จผ์ ํ์ ํ๊ณ , ํด๋ฆญ ์ navigate ์ฒ๋ฆฌ ๋ก์ง์ ์ถ๊ฐ
์๋ก post.foreign_ids.user_id๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ ํฉ์
๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ API ๊ตฌ์กฐ๋ ๋ง์ถฐ์ ํตํฉ
์ด ๊ณผ์ ์ ํตํด ์ฐ๋ฆฌ ํ์ ์ฝ๋ ์คํ์ผ์ด๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ ์ ํต์ผ๋๋ ๋๋์ ๋ฐ์๋ค.
์ด๋ฒ TradeProfile ๊ฐ๋ฐ์์ ๊ฐ์ฅ ํฌ๊ฒ ๋๋ ์ ์ค ํ๋๋ ๋ฐ๋ก props์ ์ค์์ฑ์ด์๋ค.
์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค ๋ props๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด์ ๊ฐ๋ ฅํ ์๋จ์ด๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ๊ฐ์ ๋๊ธฐ๊ณ , ์์ ์ปดํฌ๋ํธ๋ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก UI๋ฅผ ๊ตฌ์ฑํ๊ฑฐ๋ ์์ฒญ์ ์ํํ ์ ์๋ค.
์๋ฅผ ๋ค์ด TradeProfile ๋ด๋ถ์์ ProfileContainer๋ TradeStatus ๊ฐ์ ๊ธฐ์กด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋๋, ์ ์ ์ ๋ณด๋ ํต๊ณ ๋ฐ์ดํฐ๋ค์ props๋ก ๋๊ฒจ์ฃผ๋ ๊ตฌ์กฐ๋ก ๋ง๋ค์๋ค.
์ด๋ฒ ์์ ์์๋ React Router์ navigate() ํจ์๋ก URL์ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๋ ๋ฐฉ๋ฒ๋ ํ์ฉํ๋ค:
navigate(`/trade-profile?userID=${userId}&title=${encodeURIComponent(title)}`);
์ด๋ ๊ฒ ํ๋ฉด ํ์ด์ง ์ด๋๊ณผ ๋์์ userID, title ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ๋๊ธธ ์ ์๋ค.
TradeProfile ์ปดํฌ๋ํธ์์๋ ๋ค์์ฒ๋ผ location.search๋ฅผ ์ฌ์ฉํด ๋ธ๋ผ์ฐ์ ์ ์ฟผ๋ฆฌ์คํธ๋ง์ ์ง์ ํ์ฑํ๋ค:
const params = new URLSearchParams(location.search);
const userId = params.get("userID");
const title = params.get("title");
์ฌ๊ธฐ์ ํต์ฌ์ location.search๋ฅผ ์ด์ฉํด ํ์ฌ ๋ธ๋ผ์ฐ์ ์ฃผ์์ ์ฟผ๋ฆฌ์คํธ๋ง์ ๊ฐ์ ธ์ค๊ณ ,
๊ทธ๊ฑธ URLSearchParams๋ฅผ ํตํด ํ์ฑ(parsing)ํด์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํค(key) ๊ธฐ๋ฐ์ผ๋ก ๊บผ๋ธ๋ค๋ ๊ฒ์ด๋ค.
์ด๋์ key๋ URL์์ ?userID=junhyeong123&title=๋ ์ ํ ํ๋งค์ค ๊ฐ์ด ์๊ธด ์ฟผ๋ฆฌ์คํธ๋ง์ ๊ตฌ์กฐ์์ userID, title๊ณผ ๊ฐ์ ์ด๋ฆ์ ์๋ฏธํ๋ค.
๊ฐ๊ฐ์ key์ ๋์ํ๋ value๋ "junhyeong123", "๋ ์ ํ ํ๋งค์ค"์ฒ๋ผ ์ ์ฅ๋ ๊ฐ์ด๊ณ , ์ด ๊ฐ์ .get("key")๋ก ์ถ์ถํ ์ ์๋ค.
params.get("userID") โ ์ฟผ๋ฆฌ์คํธ๋ง์์ userID ๊ฐ์ ๊ฐ์ ธ์ด
params.get("title") โ ๊ฒ์๊ธ ์ ๋ชฉ์ ๊ฐ์ ธ์ด
์ด๋ ๊ฒ ํ์ฑํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ ๋ณ์๋ก ์ ์ธํด ์ดํ API ์์ฒญ์ ํ์ฉํ๊ฑฐ๋, ํ๋ฉด ๊ตฌ์ฑ์ ์ฌ์ฉํ ์ ์์๋ค.
location.search๋ ํ์ฌ URL์ ?userID=...&title=... ๊ฐ์ ์ฟผ๋ฆฌ์คํธ๋ง์ ๊ฐ์ ธ์ค๊ณ ,
URLSearchParams๋ ์ด๋ฅผ ํค-๊ฐ ํํ๋ก ํ์ฑํด์ค๋ค.
์ด ๋ฐฉ์์ React Router์์ ์ ๊ณตํ๋ useSearchParams()๋ฅผ ๊ตณ์ด ์ฌ์ฉํ์ง ์๊ณ ๋, ํ์ํ ๊ฐ๋ง ๊ฐ๋จํ๊ฒ ๊ฐ์ ธ์ค๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ๋ค.
๋ณต์กํ ์ํ ๊ด๋ฆฌ ์์ด, ๊ฐ๋ณ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ๋ฐฉ์์ด์๋ค.
๊ฑฐ๋ UX๋ฅผ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆฐ ๊ฒฝํ
๋จ์ํ ์ ๋ณด๋ง ๋ณด์ฌ์ฃผ๋ ๊ฒ ์๋๋ผ, ๊ฒ์๊ธ โ ์ ์ ํ๋กํ โ ๊ฑฐ๋ ๋ด์ญ โ ๋ํ ์์์ด๋ผ๋ ํ๋ฆ์ด ๋๊ธฐ์ง ์๋๋ก ์ ๊ฒฝ ์ด ๊ตฌ์กฐ์๋ค.
๋ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฌด๋ถ๋ณํ๊ฒ ์๋ก ๋ง๋๋ ๋์ , ๊ธฐ์กด ์ปดํฌ๋ํธ๋ฅผ ํ์ฅ/์ฌ์ฌ์ฉํ๋ฉด์ ์ ์ง๋ณด์๋ ์ฌ์ด ๊ตฌ์กฐ๋ก ๋ฐ์ ์์ผฐ๋ค๋ ์ ์ด ๋ง์กฑ์ค๋ฌ์ ๋ค.
์์ผ๋ก๋ ํ์ ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์กฐ ์ค๊ณ์ ๋ช ํํ ์ฑ ์ ๋ถ๋ฆฌ๋ฅผ ๊ณ์ ์ ๊ฒฝ ์จ์ผ๊ฒ ๋ค.