2/6
๐ ํ ์ผ
- ๋ฆฌ์กํธ ๊ณผ์ 19์ผ์ฐจ
โ ํ ์ผ
- ๋ฆฌ์กํธ ๊ณผ์ 19์ผ์ฐจ
์ค๋์ ๊ณผ์ ๋ ์ฒดํฌ๋ฐ์ค ์ ์ฒด์ ํ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
- ์ ์ฒด์ ํ ์ฒดํฌ์ ๋ชจ๋ ์์ ์ฒดํฌ๋ฐ์ค๊ฐ ์ฒดํน๋ฉ๋๋ค.
- ๋ชจ๋ ์์ ์ฒดํฌ๋ฐ์ค๊ฐ ์ฒดํน์ ์ ์ฒด ์ ํ ๋ฐ์ค๊ฐ ์ฒดํน๋ฉ๋๋ค.
- ์์ ์ฒดํฌ๋ฐ์ค๊ฐ ํ๋๋ผ๋ ์ฒดํน๋์ง ์์๊ฒ ์๋ค๋ฉด, ์ ์ฒด ์ฒดํฌ๋ฐ์ค์ ์ฒดํฌ๋ ํ๋ฆฝ๋๋ค.
์์ ์ธ ๊ฐ์ ์๊ตฌ์ฌํญ์ ๊ตฌํํ๋ฉด ๋๋ค
์ข ๋ณต์กํด์ ๊ตฌ๊ธ๋ง์ ์ฐธ๊ณ ํด์ ๋ง๋ค์๋ค
2/7
๐ ํ ์ผ
- ๋ฆฌ์กํธ ๊ณผ์ 20์ผ์ฐจ
โ ํ ์ผ
- ๋ฆฌ์กํธ ๊ณผ์ 20์ผ์ฐจ
์ค๋์ ๊ณผ์ ๋ `useCustomMutation` ํ ๊ณผ `useCustomQuery` ํ ์ผ๋ก todolist ๊ตฌํํ๊ธฐ
- ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋๋๋งํด์ผ ํฉ๋๋ค.
- ํฌ๋๋ฆฌ์คํธ์ ์๋ก์ด todo ๋ฅผ **์ถ๊ฐ**ํ ์ ์์ด์ผ ํฉ๋๋ค.
- ํฌ๋๋ฆฌ์คํธ์ todo๋ฅผ **์ญ์ **ํ ์ ์์ด์ผ ํฉ๋๋ค.
- ์ถ๊ฐ ๋๋ ์ญ์ ๋ฅผ ํ ๋๋ง๋ค `refetch`๋ฅผ ํ์ฌ **์์ ์ฌํญ์ด ์๋์ผ๋ก ๋ฐ์**๋์ด์ผ ํฉ๋๋ค.
์์ ๋ค๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด์๋ค
useCustomQuery ๋ ๋ฐ๋ก ์ ๊ฒฝ ์ธ ๊ฒ ์์ด์ ์ด๋ ต์ง ์์๋๋ฐ useCustomMutation ๋ ์์ , ์ญ์ , ์ถ๊ฐ๋ฅผ ํด์ฃผ๋ ํ ์ด๋ผ์ ๋ค์ด์ฌ input ์ ๊ด๋ฆฌํด์คฌ์ด์ผ ํ๋ค
๋ค๋ฅธ ํ์ํํ ๋ฌผ์ด๋ด์ ํด๊ฒฐํ๋๋ฐ ๊ณผ์ ์ ์๋๋๋ก ํ์ง ๋ชปํ ๊ฒ ๊ฐ์ ์กฐ๊ธ ์ฐ์ฐํ๋ค
interface IUseCustomMutationReturn {
addLoading: boolean;
setAddLoading: Dispatch<SetStateAction<boolean>>;
mutate: (input: string) => Promise<any>;
}
const useCustomMutation = (
mutationFn: (input: string) => Promise<any>
): IUseCustomMutationReturn => {
const [addLoading, setAddLoading] = useState(false);
const mutate = (input: string) => {
if (mutationFn === postTodos) {
setAddLoading(true);
return postTodos(input);
} else return deleteTodos(input);
};
return { addLoading, setAddLoading, mutate };
};
2/8
๐ ํ ์ผ
- ๋ฆฌ์กํธ ๊ณผ์ 20์ผ์ฐจ - ์์
โ ํ ์ผ
- ๋ฆฌ์กํธ ๊ณผ์ 20์ผ์ฐจ - ์์
๊ณผ์ ๋ฅผ ํ์ธํด์ฃผ๋ ํ์๋ถ์ด ์ด์ ํผ ๊ณผ์ ์ ๋ํด ์ฐ์ฐํ๋ ๋ถ๋ถ์ ์๋๋ ๋ค๋ฅผ๊น ์ฐ์ด์ฃผ์ จ๋ค
๋ค๋ฅธ ํ์์ ๊ณผ์ ๋ฅผ ์ฐธ๊ณ ํด์ ํ๋ค๋ณด๋ ๊ทธ ๋ถ๋ถ๋ ์ง์ ์ ๋ฐ์๋ค
const useCustomMutation = (mutationFn: (input: string) => Promise<any>) => {
const [data, setData] = useState<any>();
const [isLoading, setIsLoading] = useState(false);
// then X async await O
const mutate = async (input: string) => {
setIsLoading(true);
const res = await mutationFn(input);
setData(res);
setIsLoading(false);
return res;
};
return { data, isLoading, mutate };
};
๋ฌธ์ ๊ฐ ์์๋ mutation ๋ถ๋ถ์ ํด๊ฒฐํ๊ฒ ๋์๋๋ฐ ๊ธฐ์กด์ isLoading ๋ฅผ ์ฐ์ง ๋ชปํ๋ ๊ฒ์ true ๋ก ๋ฐ๊ฟจ๋ค๊ฐ ์๋ฃ๋๋ฉด false ๋ก ๋ฐ๊ฟ์ ํด๊ฒฐํ๊ณ then ์ด ์๋ async await ๋ก ์ฒ๋ฆฌํ์ฌ ํด๊ฒฐํด์คฌ๋ค
2/9
๐ ํ ์ผ
- ๊ทธ๋ฃน์คํฐ๋ ์ํฌ์ต ๋ฐํ ์๋ฃ ์ ๋ฆฌํ๊ธฐ
โ ํ ์ผ
- ๊ทธ๋ฃน์คํฐ๋ ์ํฌ์ต ๋ฐํ ์๋ฃ ์ ๋ฆฌํ๊ธฐ
์ค๋์ ๊ทธ๋ฃน์คํฐ๋ ์ํฌ์ต ๋ฐํ ์๋ฃ๋ฅผ ์ ๋ฆฌํ๊ณ ๋ฏธ๋ํ๋ก์ ํธ๋ฅผ ๋ค์์ฃผ๋ถํฐ ์์ํ๊ฒ ๋์ด์ ํ์๋ฅผ ํ๋ค
๋ฏธ๋ํ๋ก์ ํธ๋ ํน๋ณํ ๊ฑด ์๊ณ ํจ์บ ์ ๋ฐฑ์๋ ํ๊ณผ ๊ฐ์ด ํ์ ์ ํ๋ ํ๋ก์ ํธ๋ค
์ฒ์์ผ๋ก ๋ฐฑ์๋ํ๊ณผ ํ๋ก์ ํธ๋ฅผ ํ๊ฒ ๋์ด์ ๋๊ทผ๋๊ทผ ์ค๋ ๋ค
๋ฐฑ์๋ํ์ ์๋ฐ ์คํ๋ง ์ธ์ด๋ฅผ ๋ฐฐ์ ๋ค๊ณ ํ๋ค
์๋ฐ๋ฅผ ์์ ๋ชจ๋ฅด์ง๋ง ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ ๋ ๊ฐ๋ ์ ๋ต์ ๋ณด๋๋ผ ์ฝ๋๋ฅผ ๋ณธ ์ ์ด ์์๋ค
ํ์คํ js ๋ณด๋ค๋ ๋์ ์ธ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ฐฑ์๋๋๊น ๋ง์ฐํ ์ด๋ ต๊ฒ ์ง๋ผ๋ ์๊ฐ์ ๊ฐ์ง๊ณ ์์๋ค
์ด๋ฒ ๋ฏธ๋ ํ๋ก์ ํธ์์ ์ ๋๋ก ๋ ์ฌ์ดํธ๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ์ ์ค๋ ๋ง์์ด ์ปธ๋ค
์ด์ ๋ ๋ฏธ๋ ํ๋ก์ ํธ ์๋ด๋ฅผ ์ค์ผ๋ก ๋ฃ๊ณ ํ๋ก ํธ์๋ ์ฌ๋๋ค๊ณผ ํจ๊ป ๊ฐ๋จํ ์ด๊ธฐ์ธํ ํ์๋ฅผ ํ๋ค
์ด๋ค css ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ณ , ์ฝ๋ ์์ฑ ๋ฐฉ์์ ์ด๋ป๊ฒ ํ ๊ฑด์ง ๋ฑ๋ฑ ๊ฐ๋จํ๊ฒ ์ ํ๋ค
๊ทธ๋ฆฌ๊ณ ์ค๋์ ๋ฐฑ์๋ํ๊ณผ์ ๋ง๋จ์ ์คํ๋ผ์ธ์ผ๋ก ๊ฐ์ก๋ค
ํ์คํ ์๋ก๊ฐ ์ด๋ป๊ฒ ๊ฐ๋ฐ์ ํ๋์ง ๋๋ฃจ๋ญ์ ํ๊ฒ ์๋ค๋ณด๋๊น ์กฐ๊ธ ์กฐ์ฌ์ค๋ฌ์ด ๋ฉด๋ ์๊ณ ์งํ์ด ์ํํ์ง ์๋ ๋ถ๋ถ์ด ์์๋ค
๊ทธ๋๋ ๋ฐฑ์ ํ์ ๊ฐ ์กฐ์ฅ์ด ์กฐ์จ์ ์ ํด์ฃผ์ ์ ๋๋ฌด ํธํ๊ฒ ํ์๋ฅผ ์งํํ ์ ์์๋ค
๋ฏธ๋ ํ๋ก์ ํธ ์ฃผ์ ๋ ๊ธ์ต์ํ ์ผํ๋ชฐ์ด์๋๋ฐ ๋ํ ํ๋ก์ ํธ๋ ์๋๋ผ ๋ฐฑ์๋๋ ๊ตฌํํ ์ ์๋ ๋ฐ ํ๊ณ๊ฐ ์์ด์ ๊ณต๊ณต ์คํ api ๋ฅผ ํ์ฉํ์ฌ db ์ ์ ์ฅํ์ฌ api ๋ฅผ ์ ์ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ธฐ๋ก ํ๋ค
๊ทธ๋ฆฌ๊ณ ํ์ ์ ๋ณด๋ db ์ ์ ์ฅํ์ฌ jwt ๋ฐฉ์์ผ๋ก ํ ํฐ์ ๋ณด๋ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค
2/10
๐ ํ ์ผ
- ๋ฏธ๋ ํ๋ก์ ํธ : ํผ๊ทธ๋ง ์์
โ ํ ์ผ
- ๋ฏธ๋ ํ๋ก์ ํธ : ํผ๊ทธ๋ง ์์
์ด์ ์ ํ์ ์ดํ ์ฐธ๊ณ ํ ๋์์ธ ๋ ํผ๋ฐ์ค๋ ์ฐพ๊ณ ์ด๋ค ์ฃผ์ ๋ก ์งํํ ์ง, ๋ ์ด์์์ ์ด๋ป๊ฒ ์ก์์ง ์ด๋์ ๋ ๊ฐ๋ฅ์ด ์กํ์ ํผ๊ทธ๋ง๋ก ui ๋์์ธ ์์ ์ ํ๋ค
์ค๋๋ง์ ํผ๊ทธ๋ง๋ฅผ ์ฐ๋ ค๋ ์กฐ๊ธ ํค๋งธ์ง๋ง ๊ทธ๋ฆฌ ์ด๋ ค์ด ๊ธฐ๋ฅ์ ์์ด์ ์ฐ๋ค๋ณด๋ ๋๋ฆ ์ ์์ ํ๋ค
๋์์ธ ์์
์ ์ฃผ๋ง๊น์ง ๋ง์น๊ธฐ๋ก ํ๋ค
2/12
๐ ํ ์ผ
- ๋ฆฌ์กํธ ๊ณผ์ 21์ผ์ฐจ, 22์ผ์ฐจ
โ ํ ์ผ
- ๋ฆฌ์กํธ ๊ณผ์ 21์ผ์ฐจ, 22์ผ์ฐจ
๋ฏธ๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋๋ผ ๋ฐ๋ฆฐ 21, 22 ์ผ์ฐจ๋ฅผ ํ ๋ฒ์ ํ์๋ค
21์ผ์ฐจ๋ react-query๋ก youtube ๊ฒ์๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ์๋ค
- `react-query` ๋ฅผ ์ฌ์ฉํด์ youtube ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
- **์ด๋ฏธ ๊ฒ์ํ๋ `keyword` ์ ๋ํด์๋, ์บ์ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด์ ๋๋๋ง ํ๊ธฐ (๋คํธ์ํฌ ์์ฒญ ์๋ผ๊ธฐ)**
- ๋ง์ฝ ๋คํธ์ํฌ ์์ฒญ **ํ ๋น๋์ ์ด๊ณผ**ํด์ ์๋ฌ๊ฐ ๋๋ ๊ฒฝ์ฐ ๋ชฉ์ ๋ฐ์ดํฐ๋ฅผ ๋๋๋งํ๊ธฐ (์์ธ์ํฉ ๋๋นํ๊ธฐ)
- ๋น ๋ฌธ์์ด `""` ๋ก ๊ฒ์ํ๋ฉด, ๋ชฉ์ ๋ฐ์ดํฐ๋ฅผ ๋๋๋ง ํ๊ธฐ
์์ 4๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ณผ์ ์๋ค
const { data, isLoading } = useQuery<ISearchedResult>(
["keyword", keyword],
() => search(keyword)
);
์์ ์ฝ๋๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํํด์คฌ๋๋ฐ ๋๋ฌด ๊ฐ๋จํด์ ์ด๊ฒ ๋ง๋ ์ถ์ ์ ๋์๋ค
์๋๋ ๋ค๋ฅผ๊น ๊ณผ์ ๋ฅผ ํ์ธํด์ฃผ์๋ ๋ถ์ด ํด๋น ๋ถ๋ถ์ ๋ํด ์ค๋ฅ๊ฐ ์๋ค๊ณ ์๋ ค์ฃผ์ จ๋ค
์บ์ฑ์ด ๋์ง ์๋๋ค๊ณ ํ๋ค
๋ฐ๋๋ ํค์๋๋ฅผ ํค๊ฐ์ผ๋ก ์ง์ ํด์ฃผ๋ฉด ํด๋น ํค๊ฐ์ ์บ์ฑํ๊ณ ๋์ผํ ํค๊ฐ์ผ ๊ฒฝ์ฐ ์บ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋ค๊ณ ์๊ณ ์์๋๋ฐ ๋ญ๊ฐ ์๋ชป ์๊ณ ์์๋๋ณด๋ค ์์ ํด์ผ๊ฒ ๋ค
22์ผ์ฐจ๋ Redux toolkit ์ ์ด์ฉํด์ todolist ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด์๋ค
- todo list ๊ฐ ๋๋๋ง ๋ผ์ผํฉ๋๋ค.
- todo ๋ฅผ ์ถ๊ฐํ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํด์ฃผ์ธ์
- todo ๋ฅผ ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ฃผ์ธ์
์ ์ธ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ๋๋ค
์ต๊ทผ recoil ๋ง ์ผ๋ค๊ณ redux ๋ ์ฃ๋ค ๊น๋จน์ด์ ๋ฆฌ์กํธ ์์ ๋ ๋ฐฐ์ ๋ redux ์์ ์๋ฃ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ตฌํํ๋ค
store.ts
interface TodoState {
todos: string[];
}
const initialState: TodoState = {
todos: [],
};
export const todoSlice = createSlice({
name: "todo",
initialState,
reducers: {
createTodo: (state, action: PayloadAction<string>) => {
state.todos.push(action.payload);
},
deleteTodo: (state, action: PayloadAction<number>) => {
state.todos.splice(action.payload, 1);
},
},
});
export const { createTodo, deleteTodo } = todoSlice.actions;
export default configureStore({
reducer: {
todo: todoSlice.reducer,
},
});
app.tsx
const todo = useSelector((state: any) => state.todo.todos);
const dispatch = useDispatch();
const [value, setValue] = useState("");
const onSubmit = (event: FormEvent<HTMLFormElement>) => {
event.preventDefault();
if (value !== "") {
dispatch(createTodo(value));
setValue("");
}
};
const onChange = (event: ChangeEvent<HTMLInputElement>) => {
setValue(event.target.value);
};
const onBtnClick = (id: number) => {
dispatch(deleteTodo(id));
};
return (
<>
<h1>To Do List</h1>
<form onSubmit={onSubmit}>
<input value={value} type="text" onChange={onChange} />
<button type="submit">Add</button>
</form>
<ul>
{todo.map((todo: string, index: number) => (
<ToDo key={index} onBtnClick={onBtnClick} text={todo} id={index} />
))}
</ul>
</>
);
'๐จ ํจ์คํธ์บ ํผ์ค > ์คํฐ๋ ์ผ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[220213-220219] ํ๋ก์ ํธ ๋๋ฌธ์ ํ๋ค๋ฅ ์ฌ๋ฆฌ๊ณ ๊ฐ๋๋ค (0) | 2023.02.24 |
---|---|
[220130-220205] ์ง๊ฐ์ ์์ด์~! (0) | 2023.02.10 |
[220123-220129] ํ ๊ฑด ์๋๋ฐ ์๊ฐ์ ์ ์ด๋ฆฌ ๋นจ๋ฆฌ ์ง๋๊ฐ๋์ง (0) | 2023.02.03 |
[220116-220122] ์ฌ๋ฌ๋ถ ๊ฑด๊ฐ ์ฑ๊ธฐ์ธ์ ๊ผญ (2) | 2023.01.27 |
[220109-220115] ์ง์ ์๋๋ฐ๋ ์ง์ ๊ฐ๊ณ ์ถ์๊ฑฐ์ผ (0) | 2023.01.20 |