๐ WIL/๐ React
์ถ์ํ๋..
:) ์ง๋ ์คํฐ๋์์ ๋ด๊ฐ ์ ๋ฆฌํ ์ํฐํด์ ๊ณต์ ํ๊ณ , ์ X๋์ด '์ถ์ํ๋ ๋ฌด์์ธ๊ฐ?' ์ ๋ํ ์ง๋ฌธ์ ๋ช ํํ๊ฒ ๋ต๋ณ์ ๋งํ์ง ๋ชปํ์๋ค.. ~์ด์ง ์์๊น์? ์ ๋๋ก ๋ง๋ฌด๋ฆฌ๋ฅผ ํ์๋๋ฐ ์ฐพ๋ค๋ณด๋ ์ด ๋ถ๋ถ๋ ์คํฌํฐํ์ด ๋ธ๋ก๊ทธ์ ์ด๋ฏธ ๊ด๋ จํ ๊ธ์ด ์์ด์ ์ด๋ฒ์ฃผ๋ ์ถ์ํ ๊ด๋ จํด์ ์ ๋ฆฌํ๊ณ ์ ํ๋ค! ๐ Abstraction - ๋ ๋ณต์กํ ๊ฐ๋ ์ ๊ฐ๋จํ๊ฒ ๋ง๋ ๋ฒ์ ์ ์๋ฏธ - ๋ณต์กํ ์ธ๋ถ์ฌํญ์ ์จ๊ธฐ๊ณ , ์ฌ์ฉ์๊ฐ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ์์คํ ์ ๋จ์ํํ๋ ๊ณผ์ - FE ๊ฐ๋ฐ์์์ ์ถ์ํ ๊ฐ๋ 1. ๋ฎ์ ์์ค์ ์ถ์ํ : ๊ฐ๋ฐ์๊ฐ HTML, CSS ์ฝ๋์ ์ง์ ์ ๊ทผํ๊ณ ์กฐ์. ์๋ฅผ ๋ค์ด, ์น ํ์ด์ง์ ํน์ ๋ฒํผ์ ์คํ์ผ์ ์ ์ฉํ๊ณ ์ ํ ๋, ๊ฐ๋ฐ์๋ ์ง์ ํด๋น HTML ์์๋ฅผ ์ฐพ๊ณ , CSS๋ฅผ ์ฌ์ฉํ์ฌ ์คํ์ผ(..
ํด๋ก์ ์ useState
1. ํด๋ก์ ๋? ํด๋ก์ ๋ ์ค์ฒฉ ํจ์์์ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์์ ๋ด๋ถ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํ์์ด๋ค! nayeon1์ ํธ์ถํ๊ฒ ๋๋ฉด nayeon1 ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋์ด์ ์ฝ ์คํ์ ๋ด๊ธฐ๊ณ , nayeon1 ์คํ ์ปจํ ์คํธ์์ ์ ๊ฑฐ๋๋ฉด, y์ ๋ํ ์ ๋ณด๋ ์๋ ๊ฒ์ด ์๋๊น? (์ ์ญ ์คํ์ปจํ ์คํธ๋ ์ ๊ฑฐ X) ๊ทธ๋ฐ๋ฐ, ์ด๋ฐ ํ์์ ์ ์ผ์ด๋ ๊น ? ์ค์ฝํ, ๊ทธ์ค์์๋ ์ค์ฝํ ์ฒด์ธ, ๋ ์์ปฌ ์ค์ฝํ, ์คํ ์ปจํ ์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ ํ๋์ฉ ์ดํดํ๊ณ ๋๋, ํด๋ก์ ์ ๋ํด ์กฐ๊ธ์ ์ดํดํ๊ณ ์๊ตฌ๋..๋ฅผ ๋๋ ์ ์์๋ค. ํ๋์ฉ ์ ๋ฆฌํด๋ณด์. 1-1. ์ค์ฝํ ์ค์ฝํ๋ ์ด๋ค ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋ ์ ํจ ๋ฒ์๋ค. ๊ฐ๋จํ ์์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค. ๋ณ์ x๋ ์ ์ญ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ nayeon1 ํจ์์ ๋ด๋ถ ํจ์์ธ nayeon2..
React Query (์ด์ TanStack Query ๋ผ๊ณ ๋ถ๋ฆฌ๋ ..) ์ ์ฉ (2)
1. ์ ์ฉํด๋ณด์. useQuery hook๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ๋ ํ ์ด๊ธฐ ๋๋ฌธ์, todo ๋ชฉ๋ก / todo ์์ธ ๋ด์ฉ์ ๋ถ๋ฌ์ฌ ๋ ์ฌ์ฉํ์๋ค. useMutation hook์ ๋ฐ์ดํฐ๋ฅผ ์์ฑ/์์ /์ญ์ ํ ๋ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, todo ์์ฑ/์ญ์ /์ ๋ฐ์ดํธ์์ ์ฌ์ฉํ์๋ค. import { useQuery } from '@tanstack/react-query'; import { getTodoById } from '../api/todoApi'; import { TodoId } from '../common/types'; const useGetTodoById = (id: TodoId) => { return useQuery(['todos', id], () => getTodoById(id)); }; e..
Private Routes ์ ์ฉํด๋ณด์.
์ถ์ ์ฐํด ์ดํ ๋์ ์ด์ฌํ ์ ๋จน๊ณ ์ ์ฌ์์ง๋ง.. ๋ง์ ํํธ์ '๊ทผ๋ฐ.. ๋ ์ทจ์ค์์ธ๋ฐ ์ด๋ ๊ฒ ์ฌ์ด๋ ๋๋..' ํ๋ ์๊ฐ์ด ๋ค์๋ค. ๋ค์ด์ด๋ฆฌ์ ๋นผ๊ณกํ ์ ํ ์๋ ํด์ผ ํ ์ผ๋ค ์ค์ ๋ฏธ๋ฃจ๊ณ ๋ฏธ๋ฃจ๋ Private Route๋ฅผ ๋น ๋ฅด๊ฒ ์ ์ฉํด๋ณด์. Todo ๊ตฌํ ์กฐ๊ฑด ๋ค์๋ฒ์ ๋ก๊ทธ์ธ ์ ํ ํฐ์ด ์กด์ฌํ๋ค๋ฉด ๋ฃจํธ ๊ฒฝ๋ก๋ก ๋ฆฌ๋ค์ด๋ ํธ. ์ด๋ค ๊ฒฝ์ฐ๋ ํ ํฐ์ด ์ ํจํ์ง ์๋ค๋ฉด ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๊ณ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ. # Private Routes๋ฅผ ์ ์ฉํ๊ธฐ ์ ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ์ํด recoil๊ณผ recoil-persist๋ฅผ ์ฌ์ฉํ๋ค. (3์ฐจ ํ๋ก์ ํธ์์ ์ ์ฉํ ๋ก์ง๊ณผ ๊ฑฐ์ ๋๊ฐ์ด ๊ตฌํํ๋ค.) 1. ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด userState atom ์ true ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ค. 2. ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ..
Axios Interceptors ?
# Axios Interceptors ? ๋งค๋ฒ ์์ฒญ๋๋ง๋ค, ์ค๋ณต๋๋ URL ์ด ์๊ฑฐ๋ ํน์ ๋์ผํ ํค๋๊ฐ (content-type , token..) ๋ฅผ ๋ฃ๊ฑฐ๋, ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ๊ณตํต์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ถ๊ฑฐ๋ ํ ๋ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ์์๊น? ์ ๋ฌผ์์ ๋ํ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋ฐ๋ก Axios Interceptors ๋ค! ๋์ ๊ฒฝ์ฐ์๋ Todo๋ฅผ ๊ตฌํํ๋ฉด์ base URL ๊ณผ ๋์ผํ ํค๋๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ํด Axios Interceptors ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค. // Add a request interceptor axios.interceptors.request.use(function (config) { // Do something before request is sent return config; }, function (er..
TDD ๋์ ํด๋ณด์.(2) - TypeScript ์ ์ ์ฉ
TDD ๋์ ํด๋ณด์.(1) - React Testing Library ? Jest ? TDD๋ฅผ ์ ์ฉํด์ผ ํ๋ ์ผ์ด ์๊ฒจ์ ๊ณต๋ถ๋ฅผ ์์ํ๋๋ฐ, React ์๋ ์ด๋ฏธ Testing Library ๊ฐ ์กด์ฌํ๋ค๊ณ ํ๋ค!? # React Testing Library โ๏ธ ์ค์น ๋ฐฉ๋ฒ๋ ๊ธฐ์กด CRA์ ๋๊ฐ๋ค! ๊ทธ๋ฆฌ๊ณ ์ค์น๊ฐ ๋๋๋ฉด npm test ๋ช .. nayeon-zip.tistory.com ์ง๋ ๊ธ์ ์ด์ด์ ๋น ๋ฅด๊ฒ ๋ ๋ฒ์งธ โ๏ธ ์ฌ์ค ์ด์ ๊ธ์ ๋์ผ๋ก ๋ค์ ๊ธ์ TDD ํ๊ธฐ์ด์ง ์์๊น ์๊ฐํ๋๋ฐ... ๋์ ์ฐฉ๊ฐ..... CRA ์ค์น๋ฅผ ํ๋ฉด ์๋์ ์ผ๋ก React Testing Library์ jest ๊ฐ ์๋ ์ค์น๋๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก ์๋ก์ด ์ค์น๋ ํ์ ์๋ค๊ณ ์๊ฐํ๋๋ฐ, test๋ฅผ ์คํํ๋ฉด ์ค๋ฅ๋ค์ด ๋ฐ์ํ๊ณ , ์์๋ณด..
TDD ๋์ ํด๋ณด์.(1) - React Testing Library ? Jest ?
TDD๋ฅผ ์ ์ฉํด์ผ ํ๋ ์ผ์ด ์๊ฒจ์ ๊ณต๋ถ๋ฅผ ์์ํ๋๋ฐ, React ์๋ ์ด๋ฏธ Testing Library ๊ฐ ์กด์ฌํ๋ค๊ณ ํ๋ค!? # React Testing Library โ๏ธ ์ค์น ๋ฐฉ๋ฒ๋ ๊ธฐ์กด CRA์ ๋๊ฐ๋ค! ๊ทธ๋ฆฌ๊ณ ์ค์น๊ฐ ๋๋๋ฉด npm test ๋ช ๋ น์ด์ ๋ํ ์ค๋ช ์ด ๊ธฐ์ฌ๋์ด์์๋ค...! โ๏ธ npm test ๋ฅผ ์คํํ๋ฉด, ์๋์ ๊ฐ์ด ๋ช ๋ น์ด๋ค์ด ๋์จ๋ค. a๋ฅผ ์คํํ๋ฉด...! App.test.js ๊ฐ ์คํ๋๊ณ , Pass ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. โ๏ธ ๊ทธ๋ผ? App.test.js ์์ ๋ฌด์์ ํ ์คํธํ ๊ฒ์ผ๊น? ( App.test.js ํ์ผ์ ๊ทธ์ ๋งค๋ฒ CRA ์ค์น ํ ์ญ์ ํ๋ ํ์ผ์ด์์ง ์ด๋ค ํ์ผ์ธ์ง๋ ์์๋ณด์ง ์์์๋ค.๐ฎ๐จ ) test('renders learn react link', () => {..
Scroll ์ด๋ฒคํธ ๋์ Intersection Observer API ์ด์ฉํ์!
๐ ๋ณธ ๊ธ์ 2022๋ 7์ 23์ผ ๊ฐ์ธ github์ ์์ฑ๋ ๊ธ์ ๋๋ค. ๐ Scroll ์ด๋ฒคํธ ๋์ Intersection Observer API ์ด์ฉํ์! 3์ฐจ ํ๋ก์ ํธ ๋ฆฌํฉํ ๋ง! ๐ฑ Scroll ์ด๋ฒคํธ๋ฅผ ํ์ฉํ ๋ฌดํ ์คํฌ๋กค! ์ ์ฒด ์ผ๊ธฐ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง๋ฅผ ์ปค์ ๊ธฐ๋ฐ ๋ฌดํ ์คํฌ๋กค๋ก ๊ตฌํํ์๋๋ฐ, ์ด๋ window ๊ฐ์ฒด์ scroll ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํ์ฌ ํน์ ์ง์ ์ ์คํฌ๋กค์ด ๋์์ ๋, ์๋ฒ์ ๋ค์ ์ผ๊ธฐ ๋ฆฌ์คํธ๋ฅผ ์์ฒญํ๊ณ ์ด๋ ํ๋ผ๋ฏธํฐ์ cursor ๊ฐ์ ๋ณด๋ด๋ ํ์์ผ๋ก ํ์๋ค! // handleScroll.js export const handleScroll = () => { const scrollHeight = document.documentElement.scrollHeight; const scrollT..