์ฐ๋ฆฌ fisa 2๊ธฐ 'ํด๋ผ์ฐ๋ ์๋น์ค ๊ฐ๋ฐ' 4์ฃผ์ฐจ
๋ฒ์จ ํ ๋ฌ์ด๋ค !
ํ ๋ฌ์ด ๋ค ๋์ด ๊ฐ๋ฉด์ ๋ง์ ๊ฒ๋ค์ ๋ฐฐ์ ๋ค.
์๋ก์ด ์ง์(React)
๋๊ธฐ๋ค์ ๊ฐ๋ฅด์นจ
์ฝํ
๊ฐ์ฌ์ ๊ฐ๋ฅด์นจ
์ ์ฒ๊ธฐ ์ฑ
์ ๊ฐ๋ฅด์นจ ใ
ใ
๋ฑ๋ฑ
์์์์ ์๋ณตํ๋ ๊ฑด ์ ์ํ๋ค. ๋ชธ์ด ๊ทธ๋ฅ ์์์ ์์๋๊น์ง ๋ฐ๋ ค๋ค ์ค๋ค ใ
ใ
์ด์ ๋ ๋ฐฐ์ด ์ง์์ ๋ํด ์ ์ํด์ผ ํ๋ค ใ
ใ
ํ์ผ ์ด๋์ ๊ธฐ๊ณ๊ฐ ๋์ด์ผ ํ๋ค. ์ผ์ด๋์๋ง์ ํ๊ณ๊ฑฐ๋ฆฌ๊ฐ ์๊ฐ๋๊ธฐ ์์ํ๋คใ
ใ
ํ๊ธฐ ์ซ์ด์์ธ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์, ๊ทธ๋ฐ ์๊ฐํ๋ ๋๋ฅผ ๋น์๊ณ '๊ทธ๋ฅ ๊ฐ๋ค์ ํํํ๋ค!' ํ๋ฉด์ ์ถ๋ฐํ๋ค
(๋ชจ๋ ์ด๋๋ฌ๋ค์ ๋ค ๊ทธ๋ ์ง ์๋? ใ
ใ
)
์ด ๋ฒ์ฃผ ๋ถํฐ ์ ์ฒ๊ธฐ๋ฅผ ์์ํ๋ค. ์๋๋ CS๋ฅผ ๊ณต๋ถํ๋ ค ํ์ผ๋, ์ ์ฒ๊ธฐ ์ญ์ CS์ด๊ณ ์ด์ฐจํผ ๊น๋จน์ ์๋ ์์ผ๋,
์ ์ฒ๊ธฐ ํ๊ธฐ๋ฅผ ๋จผ์ ๊ณต๋ถํ๊ณ ํ ๋ฌ ๋ค์ CS๋ฅผ ๋ค์ ์์ํ๊ธฐ๋ก ํ๋ค.
๊ณต๋ถํ ์๊ฐ์ด ๋ฐ๋ก ์์ด์ ๋ฒ์ค์์ ํ๋ค ใ
ใ
(๋ฒ์ค ํ๋ค๋ฆฌ์ง ์๊ฒ ๊ฐ์ฃผ์ธ์ ใ
)
์ด๋ฒ์ React๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ๋ด๊ฐ ๋ค์ ์ฒ์ ๋ถํฐ ๋ง๋ค์ด ๋ณด๊ฒ ๋ค๊ณ ๋๋๊ฑฐ๋ฆฌ๊ณ ์๋ ๋ชจ์ต์ด๋ค.
์ด๋ ต๋คใ
ใ
. ์ดํดํ๊ธฐ๊ฐ ํ๋ ๊ฑด ์๋๋ฐ ๊ทธ๋ฅ ์ต์ํ์ง ์์ ์ด๋ ต๋ค. ์กฐ๊ธ์ฉ ์ต์ํด์ง๊ณ , ์ ๋ง ๋ด๊ฐ ํ์์ ์ํด์
์ด์ฉํ๋ ํจ์๋ ๋ฐฉ์์ด ์๋ค๋ฉด ๋น๋ก์ ๋ด ๊ฒ์ด ๋์ง ์์๊น ํ๋ค.
(๋ฒ์ค ์)
์ด์ ๋ ์ฝํ
ํธ๋ ์๊ณผ ์๋๋ฅผ ์ฌ๋ฆฌ๊ณ ์๋ค. ์ด๋ฒ์ ์ฝ๋ฉํ
์คํธ ์คํฐ๋๋ ๋ค์ด๊ฐ์ ์ด์ฌํ ์งํํ๊ณ ์๋ค.
์ฐ๋ฆฌ ์คํฐ๋ ๊ทธ๋ฃน ์ฌ๋๋ค ์ค๋ ฅ์๋ ์๊ณ ์ด์ ๋งจ๋ ํ ๊ฐ๋์ด๋ผ์ ๋๋ฌด ์ข๋คใ
ใ
. ๋ค๋ค ๋์ ์๋ก ๋ฐ๊ณ ํฐ ์ฑ์ฅ๊ณผ ๊ฒฐ๊ณผ๊ฐ ์์์ผ๋ฉด ํ๋ค.
ใ
ใ
ใ
ใ
ใ
์ด๋ฒ ์ฃผ ๋๊น์ค๋ง ์ธ๋ฒ์ด๋ ๋จน์๋ค. ใ
ใ
ใ
์ผ๋จ ์ฌ๊ธฐ ์์ฅ? ์ด๋ผ๋ ๋๊น์ค ์ง์ธ๋ฐ ๋๋ฌด ๋ง์์๋ค.
์ฐ๋ฆฌ ๋ฐ ํ๋์ด ์ฌ๊ธฐ์ ๋ฐํด์ ๋๋ฒ ์ฐ์ ๋ฐ๋ผ๊ฐ๊ฒ ๋์๋ค ใ
ใ
์ฌ๋ฌ ๋ฒ ๋จน์ผ๋๊น ๋๋ฌด ๋ฌผ๋ฆฌ๊ธดํ์ง๋ง ๋ง์๊ธด ํ๋ค.
*๊ทธ ํ์ 3๋ฒ ๊ฐ๊ฑฐ ๊ฐ๋ค
*๋๋ ์นผ๊ตญ์ ์ง์์ ์๋๊น์ค๋ฅผ ํ ๋ฒ ๋ ๋จน๊ฒ๋๋ค ใ
ใ
(์น๊ตฌ ์๋๊น์ค ๋จน์ด ~ ๋ฅ์น๋ฒ ๋น์ํด์ ๋ง์๊ฒ ๋จน๋๋ค.)
์ด ๋ฒ ํ๋ก์ ํธ ๊ฒฐ๊ณผ๋ฌผ
์ด๋ฒ ๋ฏธ๋ ํ๋ก์ ํธ์ด๋ค!! ๋์ ์ฐ๋ฆฌ๋ฐ ๋๋ ๊ทธ๋ฆฌ๊ณ ์ปด๊ณต ๋์๊ณผ ํ ํ์ด ๋์๋ค. ํ์ง๋ง, ์ปด๊ณต ๋์์ ํ๊ต ์ผ์ ์ผ๋ก ํ๋ก์ ํธ์ ๋ฐ๋ก ์ฐธ์ฌํ์ง ๋ชปํ ์ํฉ์ด์๋ค. ๋๋ ์ฒ์ ๋ฐฐ์์ ์ด๋ณด์๊ณ ๋๋๋ ์ฒ์์ด๋ค ๋ณด๋ ์์งํ ์ด๋ฒ ํ๋ก์ ํธ๋ ๋ง๋งํ๋ค. ๊ทธ๋์ ๋ค๋ฅธ ํ์ ํฉ๋ฅํด์ ํ ์ ์๋ ๋ฐฉ๋ฒ๋ ์์๋ค. ์ฒ์์๋ ๊ฐ์ด ํ์๊ณ ํด์ ๋ง์ ์ ๋ถ๋ด๊ฐ์ ๋์ด๋ด๊ธฐ ์ํด ๋์ฉ ๊ฐ์ดํ๊ณ ์ถ์๋ค.
ํ์ง๋ง,
๊ฒฐ๊ตญ ์ค์ค๋ก ์ฑ์ฅํ๊ณ ์ผ์ด๋์ผ ํ๋ค๋ ์๊ฐ๊ณผ ์ค์ ๋ก ์ด๋ฐ ์ผ์ด ์ฌํ์ ๋๊ฐ์๋ ์ ์ผ์ด๋๋ ๋ฒ์ ์๋ค๋ ํ๋จํ์, ์ด๋ฒ์๋ ๋งจ๋
์ ํค๋ฉ์ ํด๋ณด์ ํ์๋ค. ์ด๋ ํด๋ณด์ง ์ธ์ ํด๋ณด๊ฒ ๋ ๋ผ๋ ์๊ฐ์ด์๋ค. ๋๋๋ ๊ฐ์ ์๊ฐ์ด์๋ค.
์ฐ๋ฆฌ๋ ๊ธฐ์ ์ ์ผ๋ก๋ ๋ถ์กฑํด ๋ณด์ผ์ง๋ ๋ชฐ๋ผ๋, ์ด๋ฒ ์ฃผ์ ๋ฐฐ์ด React ๋ด์ฉ์ ๋ณต์ตํ๋ฉด์ ๋ด๊ฒ์ผ๋ก ๋ง๋๋ ์ทจ์งํ์ ํ๋ก์ ํธ๋ฅผ ์ ์ ํ๊ณ ์งํํ์๋ค.
ใ
ใ
ใ
ใ
ํ์ง๋ง, ์ญ์ ์ฝ์ง ์์๋ค. ๋ญ๊ฐ ๋จ๋ค์ ์ํ๊ณ ์๋๊ฑฐ ๊ฐ๊ณ ์ฐ๋ฆฌ๋ ์ํ๊ณ ์๋์ง ์๋ฌธ์ด ๋ค์๋ค. ๋ค๋ฅธ ํ์ ํฉ๋ฅ ํ์์ด์ผ ํ๋? ๋ผ๋ ์๊ฐ์ 0.5๋ฒ ํ๋ค ใ
ใ
(ํ๋ค ๋ง์๋ค๋ ๋ป)
๋๋ ๊ฐ์ด ํ๋ ๋๋๋ ๋ธ๋ก๊ทธ๋ฅผ ์ ์ฐ๋๋ฐ, ์๋ก ๋ธ๋ก๊ทธ์ ๋ช
์ธ์ด ์์๋ค.
๋
์์์ ๋ค ๊ทธ๋ฐ๊ฑฐ๋ค. ํฌ๊ธฐ๋ง ์ ํ๋ฉด ๋๋๊ฑฐ๋ค.
๋๋
๋จ๋ค๊ณผ ๋น๊ตํ์ง ๋ง์
ใ
ใ
ใ
ใ
์ด๋ ๊ฒ ๋์ด ํ๋ ๋ช
์ธ์ ํฉ์ณ์ ์๋ก ์ข์ ํ๊ธฐ ์ ์ ๋งํด์คฌ๋ค ใ
ใ
ใ
๊ฝค๋ ํจ๊ณผ์ ์ด์๋ค?
*๊ทธ๋ ์๋ก ๋ฐค์๋ค๊ณ ํ๋๋ฐ 2์ ์ดํ๋ก ์ฐ๋ฝ์ด ๋ฟ์ง ์์๋ค.
๊ฒฐ๊ตญ, ์ ์ฒด์ ์ผ๋ก ์์ฑ์ ํ๊ณ Todos์ ํฐ ์ฐจ์ด๋ ์์ง๋ง, ์ฐ๋ฆฌ ๋์ด๊ฐ ํด๋ธ ์ฒซ ํ๋ก์ ํธ์๋ค. ใ
ใ
๊ทธ๋ฆฌ๊ณ ๋ค์๋ , ์ปด๊ณต ๋์์ด ์์ ์ด์๊ฒ ๊พธ๋ฉฐ ์ฃผ์๋ค !! ๋ณํ๋ฅผ ๋๋ฆฌ๋ฉด ์ต์๋จ์ผ๋ก ๊ฐ๊ฒ ํด์ ๋ฐฉ๋ช
๋ก์ ์ข ๋ ์ฌ๋ฐ๊ฒ ๋ง๋ค์ด์คฌ๋ค.
์ญ์ ๋ฏฟ๋ ๋์์ด๋ค ใ
ใ
์ฐ๋ฆฌ๋ ์๊ฐ๋ง ํ์ง ์ด๋ป๊ฒ ํ๋์ง๋ ์ด๋ ค์์ด ์์๋๋ฐ ๋์์ ์ฒ์ฒํ๋๋ผ. ใ
ใ
๋๋ ๊พธ์คํ ์ฑ์ฅํด์ ๋๋ฑ๋๋ฑ ํ๋ ๊ฐ๋ฐ์๊ฐ ๋๊ณ ์ถ๋ .!!
๊ทธ๋ ๊ฒ ์ ์ฌ ์๊ฐ์๋ ์๊ฐ์ ํฌ์ํด์ Readme ๊น์ง ์์ฑํ ํ, ๋๋๊ฐ ๋ฐํ๋ฅผ ํ๋ค. ๋๋ฆ ์ฑ๊ณต์ ์ด์๋ค! ์ฒซ ๋งจ๋
์ ํค๋ฉ์ด์์ง๋ง, ๋๋ฆ ์๋ฏธ ์๋ ์๊ฐ์ด์๋ค. ์ด ๋์ ๊ฒฝํ๊ณผ ๋๊ผ๋ ๊ฐ์ ์ ์์ง ์๊ณ ๋ค์ ์ฑ์ฅ์ ์ํ ๋ฐํ์ผ๋ก ๋ง๋ จํด์ผ๊ฒ ๋ค ใ
ใ
์ต์ข
๊ฒฐ๊ณผ๋ฌผ : https://github.com/woorifisa-service-dev-2nd/frontend-3rd-Memo
GitHub - woorifisa-service-dev-2nd/frontend-3rd-Memo
Contribute to woorifisa-service-dev-2nd/frontend-3rd-Memo development by creating an account on GitHub.
github.com
์ฌ๊ธด ์ฐ๋ฆฌ์ง ์ ๊ณต์ ํจ์ ๊ณต์์ด๋ค. ๊ณง ํฌ๋ฆฌ์ค๋ง์ค์ธ๋ฐ ๋์ด ์ด๋ ๊ฒ ๋ด๋ ค ์์ฌ์๋ค. ์๋ฒฝ ์ถ๊ทผ๋ฌ๋ ๋์ด ์๋ค๋ ๊ธฐ์จ๋ณด๋จ, ์์นจ์ ๋๋ ๋จ ์๊ฐ์ ๊ฑฑ์ ์ด ์์ ๋ค ใ
ใ
ใ
ใ
๊ทธ๋๋ ์ด๊ฒจ๋ด์ผ์ง ์ด์ฉ๊ฒ ์ด
1. ์ด๋ฒ ์ฃผ ๋ฐฐ์ด ๊ฒ
์ด๋ฒ ์ฃผ๋ React๋ฅผ ํ์ฉํด์ Todos๋ฅผ ๋ง๋ค์ด๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋ค.
๊ทธ ์ค์ ๊ฐ์ฅ ๋ง์ด ๊ณ ๋ คํ ์ฌํญ์ ์ปดํฌ๋ํธ ๊ตฌ์ฑ์ด์๊ณ ์๋ก์ด ์ง์์ hook๊ณผ Context API ์๋ค.
๊ธฐ๋ฅ์ ์ธ ๋ถ๋ถ์์๋ modal ์ฐฝ ์์ฑ์ด๋ค.
์ปดํฌ๋ํธ ๊ตฌ์ฑ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ
์ปดํฌ๋ํธ ๊ตฌ์ฑ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฌ์ฌ์ฉ์ฑ์ด๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ ๊ตฌ์ฑํด์ ๋ถ๋ฅํด ๋๋๋ค๋ฉด ํ์ ์ ์งํ ์ฑ ๋ด์ฉ๋ง ๋ฐ๊พธ๋ฉด์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฐ ๊ฒ์ ๊ณ ๋ คํด์ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ค์ํ๋ค.
Hook
useEffect
useState
useReducer
useEffect
useEffect๋ ๋ถ์ํจ๊ณผ๋ผ๊ณ ๋ ํ๋ค. ์ฆ, ์ด๋ค ๊ฒ์ ๋ณํ๊ฐ ์๋ค๋ฉด ์๋์ ์ผ๋ก ์๋ํ๋ค.
useEffect(() => {
if (enteredTodoFormIsNotEmpty(title, summary)) {
setInvalid(false);
} else {
setInvalid(true);
}
}, [title, summary]);
์ด ์ฝ๋์์ ๋ณด๋ฉด title, summary๊ฐ ๋ณํํ๋ฉด ์๋์ ์ผ๋ก ๋ด๋ถ ํจ์๊ฐ ๋์๊ฐ๋ค.
useReducer
useReducer๋ useState๋ฅผ ๋์ฒดํ ์ ์๋ ํ
์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก component๋ฅผ ๊ด๋ฆฌํ ๋, useState๋ฅผ ๋ง์ด ์ฌ์ฉํ๋, ๋ด์ฉ์ด ๋ณต์กํด์ง๋ฉด useReducer๋ฅผ ์ฌ์ฉํ๋ค.
const [todos, dispatch] = useReducer(reducer, { data: dummyTodos, category: 'ALL' });
์ด๋ ๊ฒ ํด๋์ผ๋ฉด reducer์ ์ค๋ฅธ์ชฝ์ ์๋ ์ธ์๋ ์ด๊ธฐ ๊ฐ์ด๋ค.
๊ทธ๋ฆฌ๊ณ reducer๋ฅผ ํจ์๋ก ์ ์ํ๋ค.
const reducer = (todos, action) => {
const { data, category } = todos;
switch (action.type) {
case 'ADD':
const { newTodo } = action;
return { data: [...data, newTodo], category };
case 'UPDATE':
const { updateTodo } = action;
const updatedTodos = data.map(todo => todo.id === updateTodo.id ? { ...updateTodo } : todo);
return { data: updatedTodos, category }
case 'DELETE':
const { id } = action;
const deletedTodos = data.filter(todo => todo.id !== id);
return { data: deletedTodos, category }
case 'FILTER':
return { data, category: action.selectedCategory }
}
}
reducer์ ์ธ์์ค todos๋ ํ์ฌ ์ํ์ด๊ณ action์ ํฅํ, dispatch๋ฅผ ํ์ฉํด์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๊ทธ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ๋ ์์น์ด๋ค.
<select className="p-2 text-gray-100 bg-gray-800 rounded"
data-cy="todo-filter"
value={todos.category} onChange={(event) => dispatch({ type: 'FILTER', selectedCategory: event.target.value })}
>
์ด๋ ๊ฒ ์ต์ข
์ ์ผ๋ก ์ฌ์ฉํ ๋ dispatch(๊ฐ์ฒด) ๋ฅผ ์ฃผ์
ํ๋ฉด ๊ฐ์ฒด๊ฐ action์ ๊ฐ๊ณ ํ์ฌ ์ํ์ ๊ฐ์ธ todos์ ๋ณํํด์ ํ์ฌ ์ํ์ ๊ฐ์ ๋ณํ์ํจ๋ค.
์์ง ์ด๊ฒ์ ํ์ฉ์ด ์ฝ์ง๋ ์์ง๋ง useState ์ฒ๋ผ ํ๋๋ง์ ๋ณํ๊ฐ ์๋ ์ฌ๋ฌ๊ฐ๊ฐ ํ ๊บผ๋ฒ์ ๋ณํํ๋ ํํ๋ผ๋ฉด ์ฝ๋ useReducer๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ฝ๋์ ๊น๋ํ ๊ฒ์ด๋ค.
์ง๊ธ์ ์ ๋๋ก ์ด์ฉ ๋ชปํ๋๋ผ๋ ์๊ณ ๋ ์์. ์ด๋ ์๊ฐ ๋ด๊ฐ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ณ ์๊ฒ ์ง ใ
ใ
Context API
๊ธฐ๋ณธ์ ์ผ๋ก React์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด์๋ Props๋ฅผ ํตํด ์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์ปดํฌ๋ํธ๊ฐ ์ค์ฒฉ๋ ์ ๋๊ฐ 2~3๊ฐ ์ ๋๋ฉด Props๋ฅผ ํ์ฉํ ์๋ ์์ง๋ง, 4~5๊ฐ ์ด์ ์ค์ฒฉ๋ ๊ตฌ์กฐ์ผ ๊ฒฝ์ฐ์๋ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์๋ค.
์ด์ฒ๋ผ ์ปดํฌ๋ํธ๊ฐ 4~5๊ฐ ์ด์ ์ค์ฒฉ๋์ด Props๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋ง์น ๋๋ฆด์ ํ๊ณ ๋ด๋ ค๊ฐ๋ ๊ฒ ๊ฐ๋ค๊ณ ํ์ฌ Props Drilling ํจํด์ด๋ผ๊ณ ํ๋ค.
์ฌ์ฉ ๋ฐฉ์
1. ์ฐ์ createContext()๋ฅผ ๊ฐ์ ธ์จ๋ค.
import { createContext } from "react";
export const TodoContext = createContext(); // Todos ๋ฐ์ดํฐ ์ ๊ณต ์ฉ๋์ Context
export const TodoDispatchContext = createContext(); // Todos Dispatch() ์ ๊ณต ์ฉ๋์ Context
2. ์ด์ ์ด๋ฅผ ํ์ฉํ ๊ณณ์ ๋ฎ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ญ์ผ๋ก ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ๋ฃ๋๋ค.
<TodoContext.Provider value={todos}>
<TodoDispatchContext.Provider value={dispatch}>
{children}
</TodoDispatchContext.Provider>
</TodoContext.Provider>
3. ์ฌ์ฉํ๊ณ ์ํ๋ ์์น์์ useContext๋ฅผ import ํ๋ค.
import { useContext} from "react";
4. ์ฌ์ฉ ํ๊ณ ์ํ๋ Context๋ฅผ useContext() ์์ ๋ด๊ณ , ์ฝ๊ธฐ ์ฌ์ด ์ด๋ฆ์ผ๋ก ์ถ์ํ ํ๋ค.
// ์ฝ๊ธฐ ์ฌ์ด ์ด๋ฆ์ผ๋ก ์ถ์ํ
export const useTodos = () => useContext(TodoContext);
export const useTodosDispatch = () => useContext(TodoDispatchContext);
5. ์ฌ์ฉํ๋ Component์ import ํด์ ์ ์ฉํ๋ค.
const TodoBody = () => {
const todos = useTodos();
const filterTodos = (todos, selectedCategory) => selectedCategory === 'ALL' ? todos : todos.filter(todo => todo.category === selectedCategory);
const filteredTodos = filterTodos(todos.data, todos.category);
return (
<ul className='px-0 my-8'>
{filteredTodos.map((todo,index) => <TodoItem todo={todo} key={index}/>)}
</ul>
)
}
๋จผ๊ฐ ๋ณต์กํ๊ฑฐ ๊ฐ์ง๋ง, ์ต์ํด์ง๋ฉด ๊ด์ฐฎ์ ๊ฑฐ ๊ฐ๋ค.
Modal ์ฐฝ ์์ฑ
{isOpen && createPortal(
<Modal onClose={closeModal}>
<TodoForm onClose={closeModal}>New Todo</TodoForm>
</Modal>,
document.body)}
Modal ์ฐฝ์ ๋์ธ ๋ ๋ง์ง๋ง์ document.body๊ฐ ์๋๋ฐ ์ด๋ html๋ฌธ์์ ๋ฐ๋ ๋ถ๋ถ์ ์ฌ๋ฆฌ๊ฒ ๋ค๋ ๋ป์ด๋ค.
<div id="root"></div>
์๋ ์ด๊ณณ์ ๋ฃ๊ณ ์์๋๋ฐ ๋ฐ๊นฅ์ชฝ์ผ๋ก ๋์ฐ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
2. ์ด๋ฒ ์ฃผ์ ๊ฒช์ ์ํ์ฐฉ์ค์ ๊ทน๋ณต
์ด ๋ฒ์ฃผ๋ ํ์คํ ๋๊ตฌ์ ๋์์ ์ต์ํํ๊ณ ์ค์ค๋ก ํ๋ก์ ํธ ์งํํ๋ ค๊ณ ํ๋ ๋ง์๊ฐ์ง๊ณผ ์ค์ฒ์ด์๋๊ฑฐ ๊ฐ๋ค. ์ด์ ์๋ ์ํ๋ ๋๋ฃ์ ๋์์ด ์์ด ํ๋ก์ ํธ๊ฐ ๊ทธ๋ ๊ฒ ์ด๋ ค์ด ๊ฒ์ ์๋์๋ค(๋ฌผ๋ก , ์ด๋ ค์ด๊ฑด ๋ง๋ค) ๊ทธ๋ฐ๋ฐ ์ด๋ฒ์๋ ์ต์ํ๋ฅผ ํตํด์ ๋์ ์ ํด๋ณด์๋ค. ์ญ์๋ ใ
ใ
์ฝ์ง๊ฐ ์์๋ค. ๊ทธ๋๋ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ชปํ๊ฒ ๋ค๋ ์๊ฐ์ ์ ๋ฌ๋๊ณ ๋ฌ๋์ ๊ฒฐ๊ตญ ํ๋์ฉ ํด๊ฒฐํ๊ธฐ ์์ํ๋ค. ๋น๋ก ์ด๋ณด ๋๋ช
์ด์์ง๋ง, ์๋ก ๋์์ ์ฃผ๋ฉฐ ํด๊ฒฐํด ๋๊ฐ๋ค!! ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์๋ ์ปด๊ณต ๋์์ด ์์ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ์ ์กฐ๊ธ ๋ ํ๋ ฅ์ ๋ฃ์ ์ ์์๋ค. ์ด๋ ๋๋ ๊ฐ์ ๊ณผ ๊ฒฝํ ์์ง ์๊ณ ์ฑ์ฅ์ ๋ฐํ์ผ๋ก ์ผ๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ todos๋ฅผ ๋ง๋ค๋ฉด์ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ๋ ๋ง์๋ค. ํ์ง๋ง ๋๊น์ง ์ดํดํ๋ ค๊ณ ํ๊ณ ํน์ฌ๋ ์ง๊ธ์ ์ดํด๊ฐ ์๋ฒฝํ์ง ์๋๋ผ๋ ๊ณต๋ถ์ ๋์ ๊ฐ์ง๊ณ ์ด์ด๋๊ฐ๋ค๋ฉด ์ด ์ญ์ ์ ๊ทน๋ณตํ ๊ฒ์ด๋ค.
3. ์์ผ๋ก ์ด๋์ ์ ์ฉ
React๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ข๋ ์น์ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์์์ ์๊ฒ ๋์๋ค. ์ด๋ฒ์๋ ์ฌ๋ฌ ์ด์ ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์งํํ์๋๋ฐ, ํฅํ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ react๋ฅผ ์ข ๋ ํจ๊ณผ์ ์ผ๋ก ์ด์ฉํด๋ณด๊ณ ์ถ๋ค.
4. ํ์ฌ๊น์ง์ ํ์ต ํ๊ฐ ๋ฐ ๋ค์ ํ์ต์ ์ํ ๋ค์ง/๋ชฉํ
ใ
ใ
ใ
ใ
๋งค์ผ๋งค์ผ ์๋ก์๊ณผ ๋๋๊ฑฐ๋ฆผ์ ์ฐ์์ด๋ค. ์ด์ ํ ๋ฌ ์งธ์ธ๋ฐ ๋ง์ ๊ฒ๋ค์ ๋ฐฐ์ ๊ณ , ํฌ๊ธฐํ์ง ์๊ณ ๋๊น์ง ์ดํดํ๋ ค๊ณ ๋
ธ๋ ฅํ๋ค. ์ง๊ธ์ ์๋๋๋ผ๋ ๊ฒฐ๊ตญ์๋ ์ต์ํด์ง๊ณ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ๋ ์ ๊ธฐ๋ํ๋ฉฐ ๊ณ์ํด์ ์ด์ฌํ ํด์ผ๊ฒ ๋ค !!
ํ์ฌ ์ ์ฒ๊ธฐ์ ์ฝ๋ฉํ
์คํธ ๊ทธ๋ฆฌ๊ณ ๋ณต์ต์ ํ๊ณ ์์ผ๋ฉฐ, ๋ค์ ์ฃผ ๋ถํฐ๋ ๊ธฐ์ ์ธ๋ฏธ๋๋ฅผ ์ํด ๋์ฑ ์ฒ ์ ํ ์์ง์ฌ์ผ ํ๋ ์ํฉ์ด๋ค. ์กฐ๊ธ ๋ ๋๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ณํ์ํค๊ณ , ๋ชธ์ ๋ง๊ฐ๋จ๋ฆฌ๋ ์ผ์ ์์ ํด์ผ๊ฒ ๋ค.
๊พธ์คํ์.