๐ 1์ฐจ ํ๋ก์ ํธ : ์ฟกํท ์ฌ์ดํธ ํด๋ก ์ฝ๋ฉ
๐ ๋ ์ด์์ ์ฝ๋๋ฆฌ๋ทฐ ์ง์ ๋ฐ์ ์ฌํญ
- ์ด๋ฏธ์ง ์ ๋๊ฒฝ๋ก๋ก ์์
- ๋ถํ์ํ ์ฃผ์ ์ญ์
- ํ๊ทธ๋ก ์คํ์ผ ์ค ๊ฒ ํด๋์ค ์ ๋ ํฐ๋ก ๋ณ๊ฒฝํ๊ธฐ
- ๋งค๊ฐ๋ณ์ ๊ตฌ์กฐ๋ถํด ํ์ฉํ๊ธฐ
- ํ๋์ ํ์ผ์ ํ๋์ ์ปดํฌ๋ํธ๋ง ์๋๋ก ํ๊ธฐ
- ์ธ๋ผ์ธ ์คํ์ผ ์ฌ์ฉํ์ง ๋ง๊ธฐ
- ์ปดํฌ๋ํธ ๋ณ๋ก SCSS ํ์ผ ๋๋๊ธฐ
- API๋ฅผ ๋ฐ์์ฌ ๋ฐ์ดํฐ๋ผ๋ฉด ๋ชฉ๋ฐ์ดํฐ, ๊ณ ์ ์ ์ธ ๋ฐ์ดํฐ๋ผ๋ฉด ์์๋ฐ์ดํฐ ํ์ฉํ๊ธฐ
- ์์ ๋ฐ์ดํฐ๋ ์ปดํฌ๋ํธ ํ๋จ์ ์์ฑํ๊ธฐ
- ํจ์ ์ด๋ฆ์ ์ด๋ค ๋์์ ํ๋ ํจ์์ธ์ง ์ ์ ์๋๋ก ์์ฑํ๊ธฐ
๋ฆฌ์กํธ์ ์ต์ํ์ง ์์์ HTML/CSS๋ก ๋ ์ด์์ ์ง๋ฏ์ด JSX๋ ํ๋์ฝ๋ฉ์ผ๋ก ๋ง๋ค๊ณ push ํ ๋ฉํ ๋๊ป ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์๋ค.
์ฒ์์๋ HTML ์์ฑํ๋ ๊ฒ์ฒ๋ผ Review.js ํ ๊ณณ์ ๋ชจ์์ ์์ฑํ์๋ค.
ํผํธ๋ฐฑ ํ์ ์ปดํฌ๋ํธํ ์ํค๊ณ ๋ฐ๋ณต๋๋ UI๋ค์ UseState, map ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฆฌํฉํ ๋ง ํ๋ ๊ณผ์ ์์ ํ๋์ฝ๋ฉ์ด ์ผ๋ง๋ ๋นํจ์จ์ ์ธ์ง ์์ผ ๊นจ๋ฌ์๊ณ , map์ ์ฌ์ฉํ๋ ๊ณผ์ ์ ์ ํํ ์ดํดํ๊ฒ ๋์๋ค.
์ปดํฌ๋ํธ ๋ถ๋ฆฌ ํ Review.js์ ์ฝ๋๊ฐ ๊น๋ํด์ก๋ค.๐คฉ
map ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ต์ํ์ง ์์์ ๋น์ทํ ๊ตฌ์กฐ์ UI๋ฅผ ์ ๋ถ ํ๋์ฝ๋ฉํ๋๋ฐ ๋ง์ map์ด ์ต์ํด์ง๋๊น ๊ฐํธํ๊ณ ํธํด์ก๋ค.
map์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ์๋ฉด
์๋์ ๊ฐ์ ์ ๋ ํธ ๋ฐ์ค๊ฐ ์์๋ค.
<option>
ํ๊ทธ์์ ์๋ ๋ฐ์ดํฐ๋ค์ ๋ชฉ ๋ฐ์ดํฐ๋ก ๋ง๋ค์๋ค.
menu.json
(๋ชฉ ๋ฐ์ดํฐ๋ .json
ํ์์ด๋ค.)
[
{
"id": 1,
"menuName": "๋จํธ๋ฐํฌ๋ฆผํ์คํ"
},
{
"id": 2,
"menuName": "ํ ๋งํ ๋นํ์คํ"
},
{
"id": 3,
"menuName": "์๊ณ ๊ธฐ๋ฒ์ฏ์ก์ฑ"
},
{
"id": 4,
"menuName": "๋งค์ด ์น์ฆ์ฐ๋ญ"
},
{
"id": 5,
"menuName": "๋ก์ ๋ก๋ณถ์ด"
},
{
"id": 6,
"menuName": "๋น๋น๊ตญ์"
},
{
"id": 7,
"menuName": "๋ญํ๋ง๋ฆฌ์ ์นผ๊ตญ์"
},
{
"id": 8,
"menuName": "์์ ๋น์ ๋ฐฐ์ถ์ฒ"
},
{
"id": 9,
"menuName": "๊ฐ์ฅ๋ถ๊ณ ๊ธฐ"
},
{
"id": 10,
"menuName": "๊น์น์ฐ๊ฐ"
},
{
"id": 11,
"menuName": "๋งค์ด ์นํจํฌ๋ฆผ์คํ"
},
{
"id": 12,
"menuName": "์น์ฆ๋ญ๊ฐ๋น"
}
]
fetch
๋ก ๋ชฉ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ setMenu
์ ์ ์ฅํ๋ค.
menu
์ ์ ์ฅ๋ ๋ฐฐ์ด์ ๊ธธ์ด๋งํผ map์ ๋๋ฆฐ๋ค.
const ReviewAdd = () => {
const [menu, setMenu] = useState([]);
useEffect(() => {
fetch('/data/menu.json')
.then(res => res.json())
.then(data => {
setMenu(data);
});
}, [setMenu]);
return (
<select name="์ํ์ ํ" onChange={saveReviewMenu} required>
<option disabled defaultValue>
๋ฉ๋ด๋ฅผ ์ ํํด์ฃผ์ธ์.
</option>
{menu.map(({ id, menuName }) => (
<option key={id}>{menuName}</option>
))}
</select>
)}
menu ๋ฐ์ดํฐ์ key๊ฐ ๋ค ์ค menuName๋ฅผ props๋ก ๊ฐ์ ธ์์ <option>
ํ๊ทธ์ ๋ฃ๋๋ค.
๊ทธ๋ฌ๋ฉด ์๋์ผ๋ก menuName์ ๋ฐฐ์ด์์ ๋ฝ์์ ๋ฃ์ด์ค๋ค.
์ด๋ฐ์์ผ๋ก ๋น์ทํ UI๊ฐ ๋ง๋ค์ด์ง ๊ฒฝ์ฐ์๋ ์ ๋ถ map๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๋ค.
4์ฐจ๊น์ง ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ ํ์์ผ ํต๊ณผ ํ๋ค.
Layout์ ์ฝ๋๋ฆฌ๋ทฐ์ ํฌ์ธํธ๋ ์์ํ ์ค์ ์์ ์ ์ ์ธํ๊ณ ๊ฑฐ์ ์ปดํฌ๋ํธํ ํ๋๊ฒ๊ณผ, ๋ฐ๋ณต ๋๋ UI map ๋ฉ์๋ ํ์ฉํ๊ธฐ ์๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์ map ์ฌ์ฉํ๋๊ฒ ์ ๋ง map๋๋ผ๊ตฌ์