์๋
ํ์ธ์.
์ฝ๋ฉ ๊ต์ก ํฌ๋ฆฌ์์ดํฐ ์ง์ฝ๋ฉ ์
๋๋ค ๐
์ ํ๋ธ์์ ์ฝ๋ฉ ๊ต์ก "์ง์ฝ๋ฉ GYM CODING"์ฑ๋์ ์ด์ํ๊ณ ์์ผ๋ฉฐ,
์ธํ๋ฐ ๊ต์ก ํ๋ซํผ์์ ํ๋ก๊ทธ๋๋ฐ ์ง์์ ๊ณต์ ํ๊ณ ์์ต๋๋ค.
์ ๊ฐ์์ ํน์ง์ ์ด์ ๋ง ์์ํ์๋ ๋ถ๋ค์ ์ํ์ฌ
์ค๋ช
ํ๊ณ ์ ํ ๋๋ ์ต๋ํ ์ฝ๊ฒ,
์๋ ค๋๋ฆฌ๊ณ ์ ํ ๋๋ ์ต๋ํ ์์ฐจ๊ฒ ์ค๋ช
๋๋ฆฝ๋๋ค.
ํญ์ ์๊ฐ์ ์
์ฅ์์ ์๊ฐํ๋ ์ฝ๋ฉ ๊ต์ก ํฌ๋ฆฌ์์ดํฐ๊ฐ ๋๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
๐จ ์ด๋ฉ์ผ bruce.lean17@gmail.com
๐๏ธโโ๏ธ ํฌ์คํ๊ทธ๋จ @helinlee.gram
๐งโ๐ป ์ฝ๋ฉ์คํ๊ทธ๋จ @gymcoding
Courses
Reviews
thisistw944708
ยท
Next.js Complete Mastery (v15): Building a Notion-Based Developer Blog (with Cursor AI)Next.js Complete Mastery (v15): Building a Notion-Based Developer Blog (with Cursor AI)- Master React: From Basic Concepts to LinCanva Projects
- Master React: From Basic Concepts to LinCanva Projects
- Master React: From Basic Concepts to LinCanva Projects
asd93518180
ยท
Next.js Complete Mastery (v15): Building a Notion-Based Developer Blog (with Cursor AI)Next.js Complete Mastery (v15): Building a Notion-Based Developer Blog (with Cursor AI)
Posts
Q&A
ํด์ฆ ์ง๋ฌธ ํ์ด ์ค๋ฅ
์๋ ํ์ธ์ ๐๋ง์ต๋๋ค. AIํด์ฆ๊ฐ ์๋ชป๋์์ต๋๋ค.AIํด์ฆ๋ ์ธํ๋ฐ์์ ์๋์ผ๋ก ์์ฑ๋ ํด์ฆ๋ก ์์ ์์ฒญํ ๊ฒ์~!
- 0
- 2
- 22
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
- 2
- 22
Q&A
tailwindcss 4.1 docs์์๋ container๊ฐ ๋ชฉ๋ก์์ ์๋ณด์ด๋ค์
container ์ ํธ๋ฆฌํฐ ํด๋์ค๋ ์ฌ์ ํ ์กด์ฌํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค! ๋ค๋ง ๋ฌธ์์์์ ์์น์ ๊ตฌ์ฑ ๋ฐฉ์์ด ๋ณ๊ฒฝ๋์์ต๋๋ค.v4์์๋ container๊ฐ ๋ณ๋์ ๋ ๋ฆฝ์ ์ธ ๋ฌธ์ ํ์ด์ง๊ฐ ์๋, "Max Width" ์น์ ๋ด์ ํตํฉ๋์ด ์์ต๋๋คํ์ฌ max-width ๋ฌธ์ ํ์ด์ง์์ "Using breakpoints (container)" ์น์ ์ผ๋ก ์ฐพ์ ์ ์์ต๋๋คhttps://tailwindcss.com/docs/max-width
- 0
- 2
- 21
Q&A
button ์ง๋ฌธ
๊ณผ ์ ์ฐจ์ด์ ์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฒํผ์ ๋ง๋ค ์ ์๋๋ฐ, ๊ฐ๊ฐ ๋ค๋ฅธ ํน์ง์ด ์์ต๋๋ค:1. ํน์ง:๋จ์ผ ํ๊ทธ (self-closing)ํ ์คํธ๋ง ํ์ ๊ฐ๋ฅ (value ์์ฑ ์ฌ์ฉ)์ด๋ฏธ์ง๋ ๋ค๋ฅธ HTML ์์ ํฌํจ ๋ถ๊ฐ๊ฐ๋จํ ๋ฒํผ์ ์ ํฉ2. ํด๋ฆญํ์ธ์ ํน์ง:์ฌ๋ ํ๊ทธ์ ๋ซ๋ ํ๊ทธ ์์ผ๋ก ๊ตฌ์ฑํ๊ทธ ์์ ๋ค์ํ HTML ์์ ํฌํจ ๊ฐ๋ฅํ ์คํธ, ์ด๋ฏธ์ง, ์์ด์ฝ ๋ฑ์ ์์ ๋กญ๊ฒ ๋ฐฐ์น๋ ์ ์ฐํ ๋์์ธ ๊ฐ๋ฅ์ค์ ์์ ๋น๊ต (์ฌ์ง) ์ด๋ฏธ์ง๊ฐ ์๋ ๋ฒํผ ์ธ์ ๋ฌด์์ ์ฌ์ฉํ ๊น?: ๋จ์ํ ํ ์คํธ ๋ฒํผ: ๋์์ธ์ด ํ์ํ๊ฑฐ๋ ๋ณต์กํ ๋ด์ฉ์ด ๋ค์ด๊ฐ ๋ฒํผ๊ถ์ฅ์ฌํญ: ํ์ฌ๋ ํ๊ทธ๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ๋ ์ ์ฐํ๊ณ ์ ๊ทผ์ฑ๋ ์ข๊ธฐ ๋๋ฌธ์ ๋๋ค! ๐ฏ
- 0
- 2
- 19
Q&A
Streaming ๊ด๋ จํด์ ๋ฌธ์๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์ ๐๋ค, ๋ง์ต๋๋ค! ์๋ฒ-ํด๋ผ์ด์ธํธ ๊ฒฝ๊ณ์ ์คํธ๋ฆฌ๋ฐ ๋์ ๋ฐฉ์์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.์คํธ๋ฆฌ๋ฐ ๋์ ์๋ฆฌ1. ์๋ฒ ์ปดํฌ๋ํธ์์:// ์๋ฒ ์ปดํฌ๋ํธ export default function Page() { // await ํ์ง ์๊ณ Promise ์์ฒด๋ฅผ ์์ฑ const postsPromise = getPosts(); const tagsPromise = getTags(); return ( }> ); } 2. ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์:// ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ 'use client' import { use } from 'react'; export default function BlogList({ posts, tags }) { // ์ฌ๊ธฐ์ Promise๊ฐ resolve๋จ const resolvedPosts = use(posts); const resolvedTags = use(tags); return {/* ๋ ๋๋ง */}; } ํต์ฌ ํฌ์ธํธPromise ์ ๋ฌ: ์๋ฒ์์ ๋ฐ์ดํฐ๊ฐ ์๋ Promise ๊ฐ์ฒด ์์ฒด๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ๋น๋๊ธฐ ํด๊ฒฐ: ์ค์ Promise resolve๋ ํด๋ผ์ด์ธํธ์์ ๋ฐ์์คํธ๋ฆฌ๋ฐ ํจ๊ณผ: ์ด๊ธฐ HTML์ ๋น ๋ฅด๊ฒ ์ ์ก๋๊ณ , ๋ฐ์ดํฐ๋ ์ค๋น๋๋ ๋๋ก ์ ์ง์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐ์ฅ์ ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ์ด ๋นจ๋ผ์ง์ฌ๋ฌ ๋ฐ์ดํฐ ์์ฒญ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ์ฌ์ฉ์๋ ์ฆ์ UI ๊ณจ๊ฒฉ์ ๋ณผ ์ ์์์ด ๋ฐฉ์์ผ๋ก ์๋ฒ์ ๊ณ์ฐ ๋ฅ๋ ฅ๊ณผ ํด๋ผ์ด์ธํธ์ ๋ฐ์์ฑ์ ๋ชจ๋ ํ์ฉํ ์ ์์ต๋๋ค ๐ช
- 0
- 2
- 25
Q&A
ISR ๋งค์ปค๋์ฆ์ ๋ํ ๊ถ๊ธ์ฆ
์๋ ํ์ธ์ ๐ ISR ๋์ ์์ฝํด๋๋ฆฌ๋ฉด~!์์ ๋์ (๋ง์ต๋๋ค!)๋ฏธ๋ฆฌ ์์ฑ๋ 2๊ฐ ์ฌ๋ฌ๊ทธ: ์ฆ์ ๋ก๋ ์๋ก์ด ์ฌ๋ฌ๊ทธ ์ฒซ ๋ฐฉ๋ฌธ: 1์ด ์ง์ฐ ํ ๋ก๋ ์๋ก์ด ์ฌ๋ฌ๊ทธ ์ฌ๋ฐฉ๋ฌธ: ์ฆ์ ๋ก๋ (์บ์๋จ)๊ทธ๋ฆฌ๊ณ ISR ๋์์ ๋ฐ๋์ build ํ ํ๋ก๋์ ํ๊ฒฝ์์ ์งํํด์ฃผ์ธ์~!npm run build npm start # โ ํ๋ก๋์ ํ๊ฒฝ์์ ํ ์คํธ
- 0
- 2
- 25
Q&A
cursor AI ํ๋ก์ ํธ ๋ฃฐ ๊ด๋ จ ์ง๋ฌธ ๋๋ฆฝ๋๋ค.
UI๊ฐ ์กฐ๊ธ ๋ณ๊ฒฝ๋์๋๋ฐ์! Cursor AI์ Rules ์ฌ์ฉ๋ฒ์ ๋ฃฐ ํ์ ๋ณ๋ก ์ค๋ช ํด๋๋ฆฌ๊ฒ ์ต๋๋ค.Cursor AI Rules ํ์ ๋ณ ์ฌ์ฉ๋ฒ1. Always Apply (ํญ์ ์ ์ฉ)์ค๋ช : ๋ชจ๋ ์ฑํ ๊ณผ Cmd+K ์ธ์ ์ ์ ์ฉ๋๋ ๊ธ๋ก๋ฒ ๋ฃฐ์ฌ์ฉ ์๊ธฐ:ํ๋ก์ ํธ ์ ๋ฐ์ ์ฝ๋ฉ ์คํ์ผ ๊ฐ์ด๋ํญ์ ์ง์ผ์ผ ํ ๊ฐ๋ฐ ์์น๊ธฐ๋ณธ ์ธ์ด๋ ํ๋ ์์ํฌ ์ค์ ์์:- TypeScript๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ - ESLint ๊ท์น ์ค์ - ํจ์๋ช ์ camelCase ์ฌ์ฉ - ์ฃผ์์ ํ๊ตญ์ด๋ก ์์ฑ2. Apply Intelligently (์ง๋ฅ์ ์ ์ฉ)์ค๋ช : AI๊ฐ ์ปจํ ์คํธ๋ฅผ ํ๋จํ์ฌ ๊ด๋ จ์ฑ์ด ์์ ๋๋ง ์๋ ์ ์ฉ์ฌ์ฉ ์๊ธฐ:ํน์ ๊ธฐ์ ์คํ ๊ด๋ จ ๊ฐ์ด๋๋ผ์ธ๋๋ฉ์ธ๋ณ ๋ฒ ์คํธ ํ๋ํฐ์ค์กฐ๊ฑด๋ถ ์ ์ฉ์ด ํ์ํ ๊ท์น์์:- React ์ปดํฌ๋ํธ ์์ฑ ์ hooks ํจํด ์ฌ์ฉ - API ํธ์ถ ์ ์๋ฌ ํธ๋ค๋ง ํ์ - ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ ์ฑ๋ฅ ์ต์ ํ ๊ณ ๋ ค3. Apply to Specific Files (ํน์ ํ์ผ์ ์ ์ฉ)์ค๋ช : ์ง์ ๋ ํ์ผ ํจํด๊ณผ ์ผ์นํ๋ ํ์ผ์๋ง ์ ์ฉ์ฌ์ฉ ์๊ธฐ:ํน์ ํ์ผ ํ์ฅ์๋ ๋๋ ํ ๋ฆฌ ๊ท์นํ ์คํธ ํ์ผ, ์ค์ ํ์ผ ๋ฑ ํน์ ์ฉ๋ ํ์ผ์ค์ ๋ฐฉ๋ฒ: ํ์ผ ํจํด ์ง์ (์: *.test.ts, src/components/**)์์:ํจํด: src/api/** ๋ฃฐ: axios ์ฌ์ฉ, ์๋ฌ ์ฒ๋ฆฌ ํ์คํ4. Apply Manually (@-mentioned)์ค๋ช : @๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ํธ์ถํ ๋๋ง ์ ์ฉ์ฌ์ฉ ์๊ธฐ:ํน๋ณํ ์ํฉ์์๋ง ํ์ํ ๊ท์น์ ํ์ ์ผ๋ก ์ ์ฉํ๊ณ ์ถ์ ๊ฐ์ด๋๋ผ์ธ์คํ์ ์ด๊ฑฐ๋ ์์์ ์ธ ๊ท์น์ฌ์ฉ ๋ฐฉ๋ฒ: ์ฑํ ์์ @๋ฃฐ์ด๋ฆ์ผ๋ก ํธ์ถ์์:๋ฃฐ ์ด๋ฆ: performance-optimization ๋ด์ฉ: ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์ฝ๋ ๋ฆฌํฉํ ๋ง ๊ฐ์ด๋์ฌ์ฉ: "์ด ์ฝ๋๋ฅผ @performance-optimization ํด์ค"
- 0
- 2
- 42
Q&A
json-server ์ค๋ฅ๊ฐ ๋ค๋ฅธ๊ฒ ๋จ๋ค์
์ ์ญ์ค์น๋ก ํด๋ณด์๊ฒ ์ด์?npm install -g json-server@0.17.4
- 0
- 1
- 34
Q&A
params ์ Promise ๊ฐ์ฒด ํ์ ์ด ์ง์ ๋์ด์ผ ํ๋ ์ด์ ? ์ต์ ?
์๋ ํ์ธ์ ๐Next.js 15๋ถํฐ params๊ฐ Promise๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ์คํ์ด ๊ทธ๋ฌํฉ๋๋ค. Server Component Params ๊ฐ์ ธ์ค๊ธฐ// app/posts/[slug]/page.tsx export default async function PostPage({ params }) { const { slug } = await params // Next.js 15+ // ... }Client Component Params ๊ฐ์ ธ์ค๊ธฐ'use client' import { useParams } from 'next/navigation' export default function ClientComponent() { const params = useParams() const slug = params.slug // ๋๊ธฐ์ ์ ๊ทผ }
- 0
- 1
- 32
Q&A
๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์๋ฉ๋๋น...
props ๋ก ๋ฐ์ id ๊ฐ์ ๋๋ฒ๊น ํด๋ด์ผ ์ ๊ฒ ๊ฐ์์์ํ๋ ๊ฐ์ผ๋ก ๋์ด๊ฐ๋์ง ํ์ธ์ด ํ์ํด๋ณด์ฌ์~!
- 0
- 2
- 23