๐Ÿ—‚ WIL/๐Ÿ“ React

    ์ถ”์ƒํ™”๋ž€..

    ์ถ”์ƒํ™”๋ž€..

    :) ์ง€๋‚œ ์Šคํ„ฐ๋””์—์„œ ๋‚ด๊ฐ€ ์ •๋ฆฌํ•œ ์•„ํ‹ฐํด์„ ๊ณต์œ ํ•˜๊ณ , ์ •X๋‹˜์ด '์ถ”์ƒํ™”๋ž€ ๋ฌด์—‡์ธ๊ฐ€?' ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋ช…ํ™•ํ•˜๊ฒŒ ๋‹ต๋ณ€์„ ๋งํ•˜์ง€ ๋ชปํ–ˆ์—ˆ๋‹ค.. ~์ด์ง€ ์•Š์„๊นŒ์š”? ์ •๋„๋กœ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ํ–ˆ์—ˆ๋Š”๋ฐ ์ฐพ๋‹ค๋ณด๋‹ˆ ์ด ๋ถ€๋ถ„๋„ ์Šคํฌํ‹ฐํŒŒ์ด ๋ธ”๋กœ๊ทธ์— ์ด๋ฏธ ๊ด€๋ จํ•œ ๊ธ€์ด ์žˆ์–ด์„œ ์ด๋ฒˆ์ฃผ๋Š” ์ถ”์ƒํ™” ๊ด€๋ จํ•ด์„œ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค! ๐Ÿ˜Š Abstraction - ๋” ๋ณต์žกํ•œ ๊ฐœ๋…์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“  ๋ฒ„์ „์„ ์˜๋ฏธ - ๋ณต์žกํ•œ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ˆจ๊ธฐ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ์Šคํ…œ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ณผ์ • - FE ๊ฐœ๋ฐœ์—์„œ์˜ ์ถ”์ƒํ™” ๊ฐœ๋… 1. ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™” : ๊ฐœ๋ฐœ์ž๊ฐ€ HTML, CSS ์ฝ”๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ํŽ˜์ด์ง€์˜ ํŠน์ • ๋ฒ„ํŠผ์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ, ๊ฐœ๋ฐœ์ž๋Š” ์ง์ ‘ ํ•ด๋‹น HTML ์š”์†Œ๋ฅผ ์ฐพ๊ณ , CSS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ(..

    ํด๋กœ์ €์™€ useState

    ํด๋กœ์ €์™€ useState

    1. ํด๋กœ์ €๋ž€? ํด๋กœ์ €๋Š” ์ค‘์ฒฉ ํ•จ์ˆ˜์—์„œ ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„์ƒ์ด๋‹ค! nayeon1์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด nayeon1 ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด์„œ ์ฝœ ์Šคํƒ์— ๋‹ด๊ธฐ๊ณ , nayeon1 ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด, y์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์—†๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ? (์ „์—ญ ์‹คํ–‰์ปจํ…์ŠคํŠธ๋Š” ์ œ๊ฑฐ X) ๊ทธ๋Ÿฐ๋ฐ, ์ด๋Ÿฐ ํ˜„์ƒ์€ ์™œ ์ผ์–ด๋‚ ๊นŒ ? ์Šค์ฝ”ํ”„, ๊ทธ์ค‘์—์„œ๋„ ์Šค์ฝ”ํ”„ ์ฒด์ธ, ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ํ•˜๋‚˜์”ฉ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋‹ˆ, ํด๋กœ์ €์— ๋Œ€ํ•ด ์กฐ๊ธˆ์€ ์ดํ•ดํ•˜๊ณ  ์žˆ๊ตฌ๋‚˜..๋ฅผ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜๋‚˜์”ฉ ์ •๋ฆฌํ•ด๋ณด์ž. 1-1. ์Šค์ฝ”ํ”„ ์Šค์ฝ”ํ”„๋Š” ์–ด๋–ค ๋ณ€์ˆ˜๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํšจ ๋ฒ”์œ„๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค. ๋ณ€์ˆ˜ x๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— nayeon1 ํ•จ์ˆ˜์™€ ๋‚ด๋ถ€ ํ•จ์ˆ˜์ธ nayeon2..

    React Query (์ด์   TanStack Query ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ..) ์ ์šฉ (2)

    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 Routes ์ ์šฉํ•ด๋ณด์ž.

    ์ถ”์„ ์—ฐํœด ์ดํ‹€ ๋™์•ˆ ์—ด์‹ฌํžˆ ์ž˜ ๋จน๊ณ  ์ž˜ ์‰ฌ์—ˆ์ง€๋งŒ.. ๋งˆ์Œ ํ•œํŽธ์— '๊ทผ๋ฐ.. ๋‚˜ ์ทจ์ค€์ƒ์ธ๋ฐ ์ด๋ ‡๊ฒŒ ์‰ฌ์–ด๋„ ๋˜๋‚˜..' ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋‹ค์ด์–ด๋ฆฌ์— ๋นผ๊ณกํžˆ ์ ํ˜€ ์žˆ๋Š” ํ•ด์•ผ ํ•  ์ผ๋“ค ์ค‘์— ๋ฏธ๋ฃจ๊ณ  ๋ฏธ๋ฃจ๋˜ Private Route๋ฅผ ๋น ๋ฅด๊ฒŒ ์ ์šฉํ•ด๋ณด์ž. Todo ๊ตฌํ˜„ ์กฐ๊ฑด ๋‹ค์Œ๋ฒˆ์— ๋กœ๊ทธ์ธ ์‹œ ํ† ํฐ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฃจํŠธ ๊ฒฝ๋กœ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ. ์–ด๋–ค ๊ฒฝ์šฐ๋“  ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ. # Private Routes๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „ ์œ„์˜ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด recoil๊ณผ recoil-persist๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. (3์ฐจ ํ”„๋กœ์ ํŠธ์—์„œ ์ ์šฉํ•œ ๋กœ์ง๊ณผ ๊ฑฐ์˜ ๋˜‘๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ๋‹ค.) 1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด userState atom ์€ true ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค. 2. ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ..

    Axios Interceptors ?

    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 ๋„์ „ํ•ด๋ณด์ž.(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 ๋„์ „ํ•ด๋ณด์ž.(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 ์ด์šฉํ•˜์ž!

    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..