์๋ ํ์ธ์.
์ฝ๋ฉ ๊ต์ก ํฌ๋ฆฌ์์ดํฐ ์ง์ฝ๋ฉ ์ ๋๋ค ๐
์ ํ๋ธ์์ ์ฝ๋ฉ ๊ต์ก "์ง์ฝ๋ฉ GYM CODING"์ฑ๋์ ์ด์ํ๊ณ ์์ผ๋ฉฐ,
์ธํ๋ฐ ๊ต์ก ํ๋ซํผ์์ ํ๋ก๊ทธ๋๋ฐ ์ง์์ ๊ณต์ ํ๊ณ ์์ต๋๋ค.
์ ๊ฐ์์ ํน์ง์ ์ด์ ๋ง ์์ํ์๋ ๋ถ๋ค์ ์ํ์ฌ
์ค๋ช ํ๊ณ ์ ํ ๋๋ ์ต๋ํ ์ฝ๊ฒ,
์๋ ค๋๋ฆฌ๊ณ ์ ํ ๋๋ ์ต๋ํ ์์ฐจ๊ฒ ์ค๋ช ๋๋ฆฝ๋๋ค.
ํญ์ ์๊ฐ์ ์ ์ฅ์์ ์๊ฐํ๋ ์ฝ๋ฉ ๊ต์ก ํฌ๋ฆฌ์์ดํฐ๊ฐ ๋๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
๐จโ๐ซ์ธํ๋ฐ ์ง์ ๊ณต์ ์ | ์๊ฐ์ 24,000+ | ๊ฐ์ํ์ โญ๏ธ4.9
๐น์ง์ฝ๋ฉ ์ ํ๋ธ ์ฑ๋ ์ด์ | ๊ตฌ๋ ์ 25,000+
๐ป ์ง์ฝ๋ฉ ํด๋ฝ | gymcoding.co
๐ GitHub: https://github.com/gymcoding
๐งโ๐ป ์ธ์คํ๊ทธ๋จ @gymcoding
๐จ ์ด๋ฉ์ผ bruce.lean17@gmail.com
Courses
Reviews
- Next.js Complete Mastery (v15): Building a Notion-Based Developer Blog (with Cursor AI)
- Front-end Wings: Knowledge You Must Know Before Learning Vue and React
- Vue3 Perfect Mastery: From Basics to Practice - "Practical Edition"
- Introduction to HTML&CSS Web Development for Beginners
- Master TailwindCSS: From Portfolio to Admin!
Posts
Q&A
๊ฐ์์ ๋ง๋ค์ด์ง ์ฝ๋๊ฐ ๋ฌ๋ผ์
ReactDOM.createRoot์ createRoot์ ์ฐจ์ด๋ ๋ชจ๋์ ๊ฐ์ ธ์ค๋ import ๋ฐฉ์์ ์ฐจ์ด์ ๋๋ค:ReactDOM.createRoot (๋ค์์คํ์ด์ค import)ReactDOM ๊ฐ์ฒด๋ฅผ ํตํด ์ ๊ทผ์ ํต์ ์ด๊ณ ๋ช ์์ ์ธ ๋ฐฉ์์ด๋ค ํจํค์ง์์ ์จ ๋ฉ์๋์ธ์ง ๋ช ํํจ createRoot (named import)ํจ์๋ฅผ ์ง์ import๋ ๊ฐ๊ฒฐํ ์ฝ๋ํ์ํ ํจ์๋ง import (tree-shaking์ ์ ๋ฆฌํ ์ ์์)๊ธฐ๋ฅ์ ์ฐจ์ด๋ ์์ต๋๋ค! ๋ ๋ฐฉ์ ๋ชจ๋ ๋์ผํ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.๊ถ์ฅ์ฌํญ๊ฐ์ธ/ํ ์ ํธ๋์ ๋ฐ๋ผ ์ ํ์ผ๊ด์ฑ ์ ์ง๊ฐ ์ค์React ๊ณต์ ๋ฌธ์๋ ์ฃผ๋ก named import ๋ฐฉ์ ์ฌ์ฉ์ต์ ํ๋ก์ ํธ์์๋ createRoot (named import)๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๋ ์ถ์ธ
- 0
- 3
- 20
Q&A
๊ฐ์์๋ฃ
ํ์ฌ ๋ ธ์ ์ผ๋ก๋ง ์ ๊ณตํ๋ ์ ์ํด๋ถํ๋๋ฆฝ๋๋ค.
- 0
- 2
- 33
Q&A
ํ์ฅ ํ๋ก๊ทธ๋จ ์ค์น ๋ฐ ์ต์ ํ ๋ฒ์ ๋ฌธ์
์๋ ํ์ธ์ ๐์๋ ๊ฐ์ด๋๋ฅผ ํ๋ฒ ํ์ธํด ๋ณด์๊ฒ ์ด์?Play CDN ์ฌ์ฉํ๊ธฐPlay CDN์ ์ฌ์ฉํ๋ฉด ๋ณ๋์ ๋น๋ ๊ณผ์ ์์ด ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก Tailwind๋ฅผ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค. Play CDN์ ๊ฐ๋ฐ ๋ชฉ์ ์ผ๋ก๋ง ์ค๊ณ๋์์ผ๋ฉฐ, ์ค์ ์ด์ ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.01 HTML์ Play CDN ์คํฌ๋ฆฝํธ ์ถ๊ฐํ๊ธฐHTML ํ์ผ์ ์ Play CDN ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ์ถ๊ฐํ๊ณ , Tailwind์ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ์คํ์ผ์ ์ง์ ํ๊ธฐ ์์ํ์ธ์.index.html Hello world! 02 ์ปค์คํ CSS ์ถ๊ฐํด๋ณด๊ธฐtype="text/tailwindcss"๋ฅผ ์ฌ์ฉํ์ฌ Tailwind์ ๋ชจ๋ CSS ๊ธฐ๋ฅ์ ์ง์ํ๋ ์ปค์คํ CSS๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.index.html @theme { --color-clifford: #da373d; } Hello world!
- 1
- 2
- 46
Q&A
Notion API-DB ์ฐ๊ฒฐ์ด ์๋ผ์
์๋ ํ์ธ์ ๐๋ ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ์ธก ์๋จ ๋๋ณด๊ธฐ ๋ฒํผ ํด๋ฆญ ํ [์ฐ๊ฒฐ] ๋ฉ๋ด์์ ์์ฑํ์ API ํตํฉ์ ์ค์ ํ์ จ์๊น์?๋ง์ ๋ถ๋ค์ด ์ด๋ถ๋ถ์ ์ค์๋ก ๋๋ฝํ์ ์์.
- 0
- 2
- 106
Q&A
ํํฐ watchEffect ์ง๋ฌธ์ ๋๋ค.
์๋ ํ์ธ์ ๐์ค๋ฌด์์๋ ์ ๋ ฅํ ๋๋ง๋ค DB ์กฐํ๋ฅผ ํ๋ฉด ํ์คํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ์ Debounce, Throttle ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค.์ข์ ์ง๋ฌธ์ ๋๋ค! ์ค๋ฌด์์๋ ์ ๋ ฅํ ๋๋ง๋ค DB ์กฐํ๋ฅผ ํ๋ฉด ํ์คํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ ์ฌ์ฉํฉ๋๋ค:1. Debouncing (๋๋ฐ์ด์ฑ) - ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์ ๋ฉ์ถ ํ ์ผ์ ์๊ฐ(๋ณดํต 300-500ms)์ด ์ง๋๋ฉด API๋ฅผ ํธ์ถํฉ๋๋ค.import { ref, watch } from 'vue'; import { debounce } from 'lodash-es'; // ๋๋ ์ง์ ๊ตฌํ const searchKeyword = ref(''); // lodash ์ฌ์ฉ ์์ const debouncedSearch = debounce(async (keyword) => { // API ํธ์ถ const response = await axios.get('/api/search', { params: { q: keyword } }); }, 300); // 300ms ๋๊ธฐ watch(searchKeyword, (newValue) => { debouncedSearch(newValue); }); ์ง์ ๊ตฌํ ์์:const searchKeyword = ref(''); let timeoutId = null; watch(searchKeyword, (newValue) => { clearTimeout(timeoutId); timeoutId = setTimeout(async () => { // API ํธ์ถ await fetchData(newValue); }, 300); }); 2. Throttling (์ฐ๋กํ๋ง)์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก๋ง API๋ฅผ ํธ์ถํฉ๋๋ค (์: 1์ด์ ํ ๋ฒ๋ง).3. ์ต์ ๊ธ์ ์ ์ ํwatch(searchKeyword, (newValue) => { if (newValue.length 4. ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ์ด๋ฏธ ๊ฒ์ํ ํค์๋๋ ์บ์์ ์ ์ฅํ๊ณ , ๊ฐ์ ๊ฒ์์ด๋ ์ฌ์์ฒญํ์ง ์์ต๋๋ค.const cache = new Map(); const searchWithCache = async (keyword) => { if (cache.has(keyword)) { return cache.get(keyword); } const result = await axios.get('/api/search', { params: { q: keyword } }); cache.set(keyword, result.data); return result.data; }; 5. ๋ฐฑ์๋์์ ์ฒ๋ฆฌ๋ฐฑ์๋์์ Rate Limiting ์ ์ฉ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ฑ ์ต์ ํ๊ฒ์ ์์ง(Elasticsearch ๋ฑ) ํ์ฉ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์กฐํฉ:Debouncing + ์ต์ ๊ธ์ ์ ์ ํ + ํด๋ผ์ด์ธํธ ์บ์ฑ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ๋ ์ข๊ณ , ์๋ฒ ๋ถํ๋ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค!
- 0
- 1
- 22
Q&A
eslint ๋ฃฐ ๊ด๋ จ ์ง๋ฌธ์ด ์์ต๋๋ค.
์๋ ํ์ธ์ ๐์ปจ๋ฒค์ ์ ๋ํด ๋ง์๋๋ฆฌ๋ฉด์ฃผ์ ESLint ์ปจ๋ฒค์ ๋ํ์ ์ธ ์ปจ๋ฒค์ :Airbnb Style Guide - ๊ฐ์ฅ ์ธ๊ธฐ ์๋ JavaScript ์ปจ๋ฒค์ Standard JS - ์ธ๋ฏธ์ฝ๋ก ์๋ ์คํ์ผGoogle Style Guide - ๊ตฌ๊ธ์ JavaScript ์ปจ๋ฒค์ Vue ์ ์ฉ:vue/recommended - Vue ๊ณต์ ๊ถ์ฅ ๊ท์น์ค์น ์์# Airbnb (๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ) npm install --save-dev eslint-config-airbnb-base # Standard npm install --save-dev eslint-config-standard ์ถ์ฒ์ค๋ฌด์์๋ Airbnb ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ณ , Vue ํ๋ก์ ํธ๋ฉด eslint-plugin-vue ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.ํ ์ํฉ์ ๋ง๊ฒ ์ ํํ๊ฑฐ๋ ์ปค์คํฐ๋ง์ด์งํด์ ์ฌ์ฉํ๋ ๊ฑธ ๊ถ์ฅ๋๋ฆฝ๋๋ค.~!
- 0
- 2
- 21
Q&A
private folders ์ ์ ์ญ ํด๋
์๋ ํ์ธ์ ๐์ข์ ์ง๋ฌธ์ ๋๋ค! src/components์ src/app/_components์ ์ฐจ์ด์ ์ฌ์ฉ ์ด์ ๋ฅผ ์ค๋ช ํด๋๋ฆฌ๊ฒ ์ต๋๋ค.์ฃผ์ ์ฐจ์ด์ src/components (์ ์ญ ํด๋)ํ๋ก์ ํธ ์ ์ฒด์์ ์ฌ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ์ฌ๋ฌ ํ์ด์ง/๋ผ์ฐํธ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ์: Header, Footer, Button, Modal ๋ฑsrc/app/_components (Private ํด๋)์ธ๋์ค์ฝ์ด(_)๋ก ์์ํ๋ ํด๋๋ Next.js ๋ผ์ฐํ ์์ ์ ์ธ๋จํด๋น ๋ผ์ฐํธ ์ธ๊ทธ๋จผํธ ๋ด๋ถ์์๋ง ์ฌ์ฉํ๋ ์ปดํฌ๋ํธํ์ด์ง URL์ ์ํฅ์ ์ฃผ์ง ์์๋ถ๋ฆฌํ๋ ์ด์ 1. ๋ช ํํ ์ค์ฝํ ๊ด๋ฆฌsrc/ โโโ components/ # ์ ์ญ ์ฌ์ฌ์ฉ ์ปดํฌ๋ํธ โ โโโ Header.tsx โ โโโ Button.tsx โโโ app/ โโโ blog/ โ โโโ _components/ # blog ํ์ด์ง์์๋ง ์ฌ์ฉ โ โ โโโ BlogCard.tsx โ โโโ page.tsx โโโ about/ โโโ _components/ # about ํ์ด์ง์์๋ง ์ฌ์ฉ โ โโโ TeamMember.tsx โโโ page.tsx 2. ์ฝ๋ ์กฐ์งํ์ ์ ์ง๋ณด์์ปดํฌ๋ํธ๊ฐ ์ด๋์ ์ฌ์ฉ๋๋์ง ๋ช ํํ ์ ์ ์์ํน์ ํ์ด์ง ์์ ์ ํด๋น _components๋ง ํ์ธํ๋ฉด ๋จ3. ์์กด์ฑ ๊ด๋ฆฌ์ ์ญ ์ปดํฌ๋ํธ ์์ ์ ์ํฅ ๋ฒ์๊ฐ ๋์Private ์ปดํฌ๋ํธ๋ ์ํฅ ๋ฒ์๊ฐ ์ ํ์ ์ฌ์ฉ ๊ฐ์ด๋๋ผ์ธํ๋๋ง ์ฌ์ฉํด๋ ๋๋ ๊ฒฝ์ฐ:์์ ํ๋ก์ ํธ์ฌ์ฌ์ฉ ์ปดํฌ๋ํธ๊ฐ ๋ง์ง ์์ ๋ํ ๊ท๋ชจ๊ฐ ์์ ๋๋ถ๋ฆฌ๊ฐ ๊ถ์ฅ๋๋ ๊ฒฝ์ฐ:๋๊ท๋ชจ ํ๋ก์ ํธ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํ์ ํ ๋ํ์ด์ง๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ์ปดํฌ๋ํธ๊ฐ ๋ง์ ๋๊ฒฐ๋ก ๋ฐ๋์ ๋ถ๋ฆฌํ ํ์๋ ์์ต๋๋ค. ํ๋ก์ ํธ ๊ท๋ชจ์ ํ์ ์ ํธ๋์ ๋ฐ๋ผ ์ ํํ๋ฉด ๋ฉ๋๋ค.๊ฐ๋จํ ํ๋ก์ ํธ: src/components๋ง ์ฌ์ฉ๋ณต์กํ ํ๋ก์ ํธ: ๋ ๊ฐ์ง ๋ชจ๋ ํ์ฉํ์ฌ ๋ช ํํ ๊ตฌ๋ถ์ ๊ฐ์ธ์ ์ธ ์ถ์ฒ์ ์ฒ์์๋ src/components๋ง ์ฌ์ฉํ๋ค๊ฐ, ํน์ ํ์ด์ง ์ ์ฉ ์ปดํฌ๋ํธ๊ฐ ๋ง์์ง๋ฉด ๊ทธ๋ _components๋ฅผ ๋์ ํ๋ ๊ฒ์ ๋๋ค.
- 0
- 2
- 24
Q&A
AI์ CSS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ถํฉ
์๋ ํ์ธ์ ๐Tailwind CSSCursor AI๋ Tailwind์ ์ ํธ๋ฆฌํฐ ํด๋์ค ํจํด์ ๋งค์ฐ ์ ์ดํดํ๊ณ ์์ต๋๋ค. flex items-center gap-4 ๊ฐ์ ํด๋์ค๋ง ๋ด๋ ์ ํํ ์ด๋ค ๋ ์ด์์์ธ์ง ํ์ ํ ์ ์์ด์, ์๋์์ฑ๊ณผ ์ฝ๋ ์ ์์ด ๋๋ผ์ธ ์ ๋๋ก ์ ํํฉ๋๋ค. Tailwind๋ AI์ ํ์ต ๋ฐ์ดํฐ์ ๊ฐ์ฅ ๋ง์ด ํฌํจ๋ CSS ํ๋ ์์ํฌ์ด๊ธฐ ๋๋ฌธ์, Cursor๊ฐ ๊ฑฐ์ ์๋ฒฝํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํด์ค๋๋ค. ํด๋์ค ์ด๋ฆ๋ง์ผ๋ก ์คํ์ผ์ด ๋ช ํํ๊ฒ ํํ๋์ด AI๊ฐ ์๋๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์์ต๋๋ค.shadcn/uiTailwindCSS ๊ธฐ๋ฐ ์ปดํฌ๋ํธ ํ๋ ์์ํฌ์ ๋๋ค!! ์ปดํฌ๋ํธ ์ฝ๋๊ฐ ํ๋ก์ ํธ์ ์ง์ ๋ณต์ฌ๋๊ธฐ ๋๋ฌธ์ AI๊ฐ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์์ ํ ํ์ ํ๊ณ ์์ ๋กญ๊ฒ ์์ ํ ์ ์์ต๋๋ค. npm ํจํค์ง๋ก ์ค์น๋๋ ๋ค๋ฅธ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ ๋ฌ๋ฆฌ, Cursor๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ด์ด๋ณด๊ณ ์ํ๋ ๋๋ก ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ค๋ ์ ์ด ํฐ ์ฅ์ ์ ๋๋ค. ๋ํ ๋ฌธ์ํ๊ฐ ๋งค์ฐ ์ ๋์ด ์์ด AI๊ฐ ์ ํํ ์ฌ์ฉ๋ฒ์ ์๊ณ ์์ต๋๋ค.์ต์ ์ ์กฐํฉ: Tailwind CSS + shadcn/ui๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์๋์ง ํจ๊ณผ๊ฐ ๊ทน๋ํ๋ฉ๋๋ค. shadcn/ui๊ฐ Tailwind ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์, Cursor๋ ์ปดํฌ๋ํธ์ ์คํ์ผ์ Tailwind ํด๋์ค๋ก ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค. "Create a login form with shadcn Button" ๊ฐ์ ๊ฐ๋จํ ํ๋กฌํํธ๋ง ์ค๋ ์์ฑ๋ ๋์ ์ปดํฌ๋ํธ๋ฅผ ์ฆ์ ์์ฑํด์ฃผ๋ฉฐ, ์ดํ ์ธ๋ถ ์คํ์ผ ์กฐ์ ๋ ๋งค์ฐ ์ฝ์ต๋๋ค. AI์ ํจ๊ป ์์ ํ ๋ ๊ฐ์ฅ ๋์ ์์ฐ์ฑ์ ๋ณด์ฅํ๋ ์กฐํฉ์ ๋๋ค.
- 0
- 1
- 45
Q&A
ํด์ฆ ์ง๋ฌธ ํ์ด ์ค๋ฅ
์๋ ํ์ธ์ ๐๋ง์ต๋๋ค. AIํด์ฆ๊ฐ ์๋ชป๋์์ต๋๋ค.AIํด์ฆ๋ ์ธํ๋ฐ์์ ์๋์ผ๋ก ์์ฑ๋ ํด์ฆ๋ก ์์ ์์ฒญํ ๊ฒ์~!
- 0
- 2
- 43
Q&A
onClick ์ด๋ฒคํธ์ ํจ์ ๋๊ธธ ๋
์๋ ํ์ธ์! ์ด ๋ ๋ฐฉ๋ฒ์ ์ฐจ์ด์ ์ ๋ช ํํ๊ฒ ์ค๋ช ํด๋๋ฆฌ๊ฒ ์ต๋๋ค.1. onClick={() => onDeleteTodo(item.id)}ํ์ดํ ํจ์๋ก ๊ฐ์ธ์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ:// ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ ๊ฒฝ์ฐ onDeleteTodo(item.id)}> ์ญ์ ์ธ์ ์ฌ์ฉํ๋์?ํจ์์ ํน์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํด์ผ ํ ๋ (์: item.id) 2. onClick={onDeleteTodo}ํจ์๋ฅผ ์ง์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ:// ๋งค๊ฐ๋ณ์๊ฐ ๋ถํ์ํ๊ฑฐ๋ event ๊ฐ์ฒด๋ง ํ์ํ ๊ฒฝ์ฐ ์ญ์ ์ธ์ ์ฌ์ฉํ๋์?๋งค๊ฐ๋ณ์๊ฐ ํ์ ์์ ๋์ด๋ฒคํธ ๊ฐ์ฒด(event)๋ง ์ฌ์ฉํ๋ฉด ๋ ๋์ฑ๋ฅ์ ์ต์ ํํ๊ณ ์ถ์ ๋์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ// โ ๋งค๋ฒ ์๋ก์ด ํจ์ ์์ฑ (๋ ๋๋งํ ๋๋ง๋ค) onDeleteTodo(item.id)}>์ญ์ // โ ๋์ผํ ํจ์ ์ฐธ์กฐ ์ ์ง ์ญ์ ๊ฒฐ๋ก ๋ฐ ๊ถ์ฅ์ฌํญ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ๋ค๋ฉด: onClick={() => func(param)} ์ฌ์ฉ๋งค๊ฐ๋ณ์๊ฐ ๋ถํ์ํ๋ค๋ฉด: onClick={func} ์ฌ์ฉ ๊ฐ์์์ onClick={() => onDeleteTodo(item.id)}๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ๊ฐ๊ฐ์ todo ํญ๋ชฉ์ ๊ณ ์ ํ id๋ฅผ ์ญ์ ํจ์์ ์ ๋ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค!์ถ๊ฐ ๊ถ๊ธํ ์ ์ด ์์ผ์๋ฉด ์ธ์ ๋ ์ง๋ฌธํด์ฃผ์ธ์! ๐
- 0
- 1
- 36








