profile
ํ”„๋ก ํŠธ๋Š” ์ˆœํ•ญ์ค‘ ยฟยฟ
ํƒœ๊ทธ ๋ชฉ๋ก
์ „์ฒด๋ณด๊ธฐ (93)TIL(26)JavaScript(19)next.js(11)React(10)html(7)typescript(7)CSS(6)reactjs(6)Tailwind CSS(6)์•Œ๊ณ ๋ฆฌ์ฆ˜(4)์ฒดํฌ๋ฐ•์Šค(3)tailwind(3)php(3)nextjs(3)git(3)Modifier(3)WIL(3)zod(2)setState(2)useEffect(2)๋ชจ๋‹ฌ(2)ํ”„๋ก ํŠธ์—”๋“œ(2)frontend(2)useForm(2)gradient(1)์ค„๋ฐ”๊ฟˆ์ฒ˜๋ฆฌ(1)generateMetadata(1)๋จธํ‹ฐ๋ฆฌ์–ผ๋””์ž์ธ(1)migrations(1)hooks(1)CloudFlare Images(1)edge runtime(1)๋กœ๋”ฉUI(1)register(1)๋ฐฑ์—”๋“œ(1)StretchedLink(1)Dynamic Routes(1)ํผ๋ธ”๋ฆฌ์…”(1)prisma(1)data fetching(1)link(1)์‹œ๋ฉ˜ํ‹ฑ๋งˆํฌ์—…(1)Loading Components(1)invalid(1)matcher(1)์Šค์ผˆ๋ ˆํ†คUI(1)superRefine(1)framework(1)library(1)layoutshift(1)mobile first(1)์›น์„ฑ๋Šฅ(1)์นด๋“œui(1)ShimmerEffect(1)image(1)๋ฐ”ํ…€์‹œํŠธ(1)classes(1)responsive(1)Prisma Studio(1)CSSํŒ(1)plugin(1)ํ† ๊ธ€(1)has-[](1)1password(1)validation(1)yarn(1)์Šค๋‚ต๋ฐ”(1)create-next-app@latest(1)useSetRecoilState(1)useformstate(1)useActionState(1)createObjectURL(1)CSS์• ๋‹ˆ๋ฉ”์ด์…˜(1)animate-bounce(1)react hook form(1)router(1)input(1)ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration)(1)laravel(1)peer(1)Recoil(1)ํผ๋ธ”๋ฆฌ์‹ฑ(1)await(1)skeletonui(1).safeParse(1)globals.css(1)UI์ปดํฌ๋„ŒํŠธ(1)abstract class(1)empty(1)Non-null assertion operator(1)async(1)Just-in-Time Mode(1)postMessage()(1)prisma client(1)useformstatus(1)useParams(1)useRecoilValue(1)ํšŒ์›๊ฐ€์ž…ํ”„๋กœ์„ธ์Šค์š”์•ฝ(1)useRouteMatch(1)React-query devtools(1)ํ”„๋ก ํŠธ์—”๋“œ์ž…๋ฌธ(1)group-focus-within(1)๋ฌธ์ž์—ด(1)Refine(1)์ฟผ๋ฆฌ์ŠคํŠธ๋ง(1)์‹ค๋ฌดํŒ(1)Parallel Requests(1)์„ค์น˜(1)์ธ์Šคํ„ด์Šค(1)ํ† ์ŠคํŠธ(1)arraybuffer(1)๋А๋‚Œํ‘œ(1)Route Groups(1)layouts(1)๋ผ๋””์˜ค๋ฒ„ํŠผ(1)bootstrap(1)iOS(1)tailwind.config.ts(1)interface(1)Tailwind CSS IntelliSense(1)lg(1)bcrypt(1)build(1)watch(1)๋ชจ๋ฐ”์ผUI(1)getํŒŒ๋ผ๋ฏธํ„ฐ(1)react-query(1)Group(1)coerce(1)JS์—†์ด(1)sqlite(1)setTimeout(1)blade(1)Route Handlers(1)middleware(1)animate()(1)repository(1)xl(1)hook(1)animate-ping(1)CSR(1)SSR(1)not found(1)type(1)animate-pulse(1)error handling(1)onsubmit(1)sm(1)Metadata(1)models(1)ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…(1)daisyui(1)์ ‘๊ทผ์„ฑ(1)dynamic metadata(1)remote remove(1)form(1)label(1)Fetch(1)word-break(1)spa(1)Vercel(1)github(1)seo(1)validator(1)JSX(1)2xl(1)use client(1)z.NEVER(1)php์ž…๋ฌธ(1)rendering(1)iframe(1)password generator(1)heroicons(1)overflow-wrap(1)Iron-session(1)autocomplete(1)animate-spin(1)์ƒํƒœ๊ด€๋ฆฌ(1)fallback(1)์Šคํฌ๋กค์ž ๊ธˆ(1)Suspense(1)promise.all(1)์ƒ์„ฑ์ž(1)Server Actions(1)ring(1)vscode(1)usePathname(1)์›น์ ‘๊ทผ์„ฑ(1)prefetch(1)scope(1)md(1)์•„์ฝ”๋””์–ธ(1)๋ชจ๋ฐ”์ผ์›น(1)๋ฒ„๊ทธ(1).parse()(1)

๋ฐ”ํ…€์‹œํŠธ/๋ชจ๋‹ฌ ์—ด๋ฆด ๋•Œ ๋ฐฐ๊ฒฝ ์Šคํฌ๋กค ๋ง‰๊ธฐ (scroll lock)

๋“ค์–ด๊ฐ€๋ฉฐ ๋ฐ”ํ…€์‹œํŠธ๋ฅผ ๋งŒ๋“ค๋‹ค๊ฐ€, ์‹œํŠธ๋Š” ์˜ฌ๋ผ์™”๋Š”๋ฐ ๋’ค ๋ฐฐ๊ฒฝ์ด ๊ฐ™์ด ์Šคํฌ๋กค๋˜๋Š” ๊ฑธ ๋ดค๋‹ค. ์ฒ˜์Œ์—” "๊ทธ๋ƒฅ body ์— overflow:hidden ํ•˜๋ฉด ๋˜๊ฒ ์ง€" ์‹ถ์—ˆ๋Š”๋ฐ, ๋ง‰์ƒ ํ•ด๋ณด๋‹ˆ ํ™”๋ฉด์ด ๋งจ ์œ„๋กœ ํŠ•๊ฒจ๋ฒ„๋ ธ๋‹ค. ๊ทธ๋Ÿผ body ๋ฅผ fixed ๋กœ ๋ฐ”๊พธ๋ฉด ๋˜๊ฒ ๋‹ค ์‹ถ์–ด ํ•ด๋ดค๋”

์•ฝ 12์‹œ๊ฐ„ ์ „
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

ํ† ์ŠคํŠธ(์Šค๋‚ต๋ฐ”) ์ง์ ‘ ๋งŒ๋“ค๊ธฐ

ํ† ์ŠคํŠธ(์Šค๋‚ต๋ฐ”) ์ง์ ‘ ๋งŒ๋“ค๊ธฐ ๋“ค์–ด๊ฐ€๋ฉฐ ์–ด๋–ค ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š”๋ฐ ๋””์ž์ธ ์‹œ์•ˆ์— 'snackbar(์Šค๋‚ต๋ฐ”)'๋ผ๋Š” ๊ฒŒ ๊ณ„์† ๋‚˜์™”๋‹ค. ํ™”๋ฉด ์•„๋ž˜์— ์ž ๊น ๋–ด๋‹ค ์‚ฌ๋ผ์ง€๋Š” ์•ˆ๋‚ด ๋ ์ธ๋ฐ, ์†”์งํžˆ ์ฒ˜์Œ ๋ณด๋Š” ๋‹จ์–ด์˜€๋‹ค. 'ํ† ์ŠคํŠธ'๋Š” ๋“ค์–ด๋ดค์–ด๋„ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณธ ์ ์€ ์—†์—ˆ๊ณ , "ํ† ์ŠคํŠธ๋ž‘ ์Šค๋‚ต

4์ผ ์ „
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

์ฒดํฌ๋ฐ•์Šค ์ž๋™๋ณต์› (form autocomplete / bfcache)

๋ชฉ๋ก์—์„œ ํ•ญ๋ชฉ์„ ํ•˜๋‚˜ ์‚ญ์ œํ–ˆ๋”๋‹ˆ, ์ƒˆ๋กœ๊ณ ์นจ๋œ ํ™”๋ฉด์—์„œ ๋‚จ์•„์žˆ๋˜ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์—์ฒดํฌ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์—ˆ๋‹ค. "์–ด ์ด๋ฏธ ์„ ํƒ๋ผ ์žˆ๋„ค?" ํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋”๋‹ˆ์˜คํžˆ๋ ค "์‚ญ์ œํ•  ํ•ญ๋ชฉ์„ ์„ ํƒํ•ด ์ฃผ์„ธ์š”"๋ผ๋Š” ์•ˆ๋‚ด๊ฐ€ ๋–ด๋‹ค.๋ถ„๋ช… ์ฒดํฌ๋Š” ๋ณด์ด๋Š”๋ฐ, ์‹œ์Šคํ…œ์€ ์•„๋ฌด๊ฒƒ๋„ ์„ ํƒ ์•ˆ ๋๋‹ค๊ณ 

2026๋…„ 6์›” 1์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

label๊ณผ input ์—ฐ๊ฒฐ ๋ฐฉ์‹ ๋น„๊ต (์•”๋ฌต์  vs ๋ช…์‹œ์ )

label๊ณผ input์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์—” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๋‘˜ ๋‹ค ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์ •ํ™•ํžˆ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ๋ชฐ๋ผ์„œ ์ด๋ฒˆ์— ์ œ๋Œ€๋กœ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. ๋‚˜๋Š” ์ฃผ๋กœ ๋ช…์‹œ์  ์—ฐ๊ฒฐ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์™”์—ˆ๋Š”๋ฐ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ณจ๋ผ์“ฐ๋ฉด ๋ ๊ฑฐ ๊ฐ™๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹ ์•”๋ฌต์  ์—ฐ๊ฒฐ (Implicit

2026๋…„ 5์›” 6์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

Stretched Link ํŒจํ„ด โ€” ์นด๋“œ/์˜์—ญ ์ „์ฒด ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ

์˜›๋‚ ์—” a ์•ˆ์— button ๋„ฃ๊ณ  JS ๋กœ stopPropagation ํ–ˆ๋Š”๋ฐ, HTML ํ‘œ์ค€ ์œ„๋ฐ˜์ด๋ผ๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋๊ณ  ๋ชจ๋˜ ํ‘œ์ค€ (Stretched Link) ์œผ๋กœ ์ •๋ฆฌํ•ด ๋‘ . ์นด๋“œ๋‚˜ ์˜์—ญ ์ „์ฒด๋ฅผ ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ๋•Œ, a/button ์œผ๋กœ ์ปจํ…์ธ ๋ฅผ ๊ฐ์‹ธ์ง€ ์•Š๊ณ 

2026๋…„ 4์›” 28์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

PHP ์—์„œ URL ์˜ ๊ฐ’ ๋ฐ›๊ธฐ

ํผ๋ธ”๋ฆฌ์…”๋กœ ์ผํ•˜๋‹ค๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๋ฐฑ์—”๋“œ ์ฝ”๋“œ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณผ ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ, URL ์—์„œ ๊ฐ’ ๋ฐ›๋Š” ํŒจํ„ด์ด ๊ณ„์† ๋‚˜์™€์„œ ์ด๋ฒˆ์— ์ œ๋Œ€๋กœ ์ •๋ฆฌํ•ด๋ดค๋‹ค.PHP ๊ฐ€ URL ์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ ๋ณ€์ˆ˜์— ๋‹ด๋Š” ํŒจํ„ด ์ •๋ฆฌ? ๋’ค๋ถ€ํ„ฐ = ์ฟผ๋ฆฌ์ŠคํŠธ๋ง (query string)& ๋กœ ์—ฌ๋Ÿฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ตฌ๋ถ„ํ˜•

2026๋…„ 4์›” 28์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

CSS Checkbox/Radio Hack โ€” JS ์—†์ด ํ† ๊ธ€ยทํƒญยท๋ชจ๋‹ฌ ๋งŒ๋“ค๊ธฐ

ํ† ๊ธ€ ์Šค์œ„์น˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์ฐพ๋‹ค๊ฐ€ :checked ํ•ดํ‚น์„ ์•Œ๊ฒŒ ๋๋Š”๋ฐ, ํ† ๊ธ€๋ฟ ์•„๋‹ˆ๋ผ ํƒญยท๋ชจ๋‹ฌยท์•„์ฝ”๋””์–ธ๊นŒ์ง€ ๊ฐ™์€ ์›๋ฆฌ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธธ๋ž˜ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.input์˜ :checked ์ƒํƒœ๋ž‘ CSS ํ˜•์ œ ์„ ํƒ์ž(+, ~)๋งŒ์œผ๋กœ JS ์—†์ด ํ† ๊ธ€, ํƒญ, ๋ชจ๋‹ฌ, ์•„์ฝ”๋””์–ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ

2026๋…„ 4์›” 23์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

Git์—์„œ ํŒŒ์ผ๋ช… ๋Œ€์†Œ๋ฌธ์ž๋งŒ ๋ฐ”๊ฟ€ ๋•Œ ์ฃผ์˜ํ•  ์ 

ํŒŒ์ผ๋ช…์˜ ๋Œ€์†Œ๋ฌธ์ž๋งŒ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ Git์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์›์ธ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•œ๋‹ค. ๋ฌธ์ œ ์ƒํ™ฉ CSS ํŒŒ์ผ๋ช…์ด Main.css๋กœ ๋˜์–ด ์žˆ์–ด ์†Œ๋ฌธ์ž main.css๋กœ ๋ฐ”๊พธ๋ ค๊ณ  ํ–ˆ๋‹ค. ์—๋””ํ„ฐ๋‚˜ ํƒ์ƒ‰๊ธฐ์—์„œ ์ด๋ฆ„๋งŒ ๋ฐ”๊พผ ๋’ค Git ์ƒํƒœ๋ฅผ ํ™•์ธํ–ˆ

2026๋…„ 4์›” 16์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

div๋กœ ๋‹ค ๋˜๋Š”๋ฐ ์™œ form์„ ์จ์•ผ ํ• ๊นŒ?

์‚ฌ์‹ค ํ‰์†Œ์—” <form> ํƒœ๊ทธ๋ฅผ ์ž˜ ์•ˆ ์ผ๋‹ค. ๋กœ๊ทธ์ธ์ด๋“  ๊ฒ€์ƒ‰์ด๋“  ๊ทธ๋ƒฅ <div>๋กœ ๊ฐ์‹ธ๊ณ  ๋ฒ„ํŠผ์— ์ด๋ฒคํŠธ ๊ฑธ์–ด์„œ JS๋กœ ๊ฐ’ ๊ธ์–ด ๋ณด๋‚ด๋Š” ์‹์ด์—ˆ๊ณ , ๋™์ž‘์€ ์ž˜ ๋˜๋‹ˆ๊นŒ ๊ตณ์ด form์„ ์จ์•ผ ํ•  ์ด์œ ๋ฅผ ๋ชป ๋А๊ผˆ๋‹ค.๊ทธ๋Ÿฌ๋‹ค ์ตœ๊ทผ์— ๋ ˆ๊ฑฐ์‹œ ํŽ˜์ด์ง€ ๋ฆฌ๋‰ด์–ผ ์ž‘์—…์„ ํ•˜๋ฉด์„œ

2026๋…„ 4์›” 14์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

์ƒํ™ฉ๋ณ„๋กœ `word-break`๊ณผ `overflow-wrap` ์ œ๋Œ€๋กœ ์“ฐ๊ธฐ

๋Œ“๊ธ€, ์ฑ„ํŒ…, ๋ฆฌ๋ทฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋ฅผ ๊ณ ์ •ํญ ๋ฐ•์Šค ์•ˆ์— ๋ณด์—ฌ์ค˜์•ผ ํ•  ๋•Œ, ๋„์–ด์“ฐ๊ธฐ ์—†์ด ๊ธธ๊ฒŒ ๋ถ™์—ฌ ์“ด ๋ฌธ์ž์—ด(์˜ˆ: URL, ์—ฐ์†๋œ ์˜๋ฌธ/์ˆซ์ž)์ด ๋ ˆ์ด์•„์›ƒ์„ ๋ฐ€์–ด๋‚ด๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉด word-break, overflow-wrap, wor

2026๋…„ 4์›” 14์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

Blade ํ…œํ”Œ๋ฆฟ ๊ธฐ์ดˆ ์ •๋ฆฌ

Laravel์—์„œ HTML์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„.ํŒŒ์ผ ํ™•์žฅ์ž๋Š” .blade.phpHTML ์•ˆ์—์„œ @๋ฌธ๋ฒ•, {{ }}๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค. ํผ๋ธ”๋ฆฌ์…” ์ž…์žฅ์—์„œ๋Š”"ํ•˜๋“œ์ฝ”๋”ฉ HTML โ†’ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ UI๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •"์ด๋ผ๊ณ  ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค.์˜ˆ์‹œ:

2026๋…„ 4์›” 3์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

iframe ์“ธ ๋•Œ ๊ผญ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค (๋†’์ด, postMessage, ์‹ค๋ฌด ํŒ)

iframe์€ ์ƒ๊ฐ๋ณด๋‹ค ์ž์ฃผ ๋ณด์ด์ง€๋งŒ,๋ง‰์ƒ ์ง์ ‘ ๋‹ค๋ฃจ๋ ค๊ณ  ํ•˜๋ฉด ๋†’์ด ๋ฌธ์ œ๋‚˜ ๋„๋ฉ”์ธ ์ œ์•ฝ ๋•Œ๋ฌธ์— ๊ฝค ๊นŒ๋‹ค๋กœ์šด ํƒœ๊ทธ๋‹ค.ํŠนํžˆ ๊ทธ๋ƒฅ ๋ถ™์—ฌ ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ์ค„ ์•Œ์•˜๋‹ค๊ฐ€๋†’์ด๊ฐ€ ์•ˆ ๋งž๊ฑฐ๋‚˜, ๋‚ด๋ถ€ ํŽ˜์ด์ง€์— ์ ‘๊ทผ์ด ์•ˆ ๋˜๊ฑฐ๋‚˜, ๋ฐ˜์‘ํ˜• ๋Œ€์‘์ด ๊ผฌ์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.์ด๋ฒˆ ๊ธ€์€ ์‹ค๋ฌด์—์„œ i

2026๋…„ 4์›” 3์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

๋ชจ๋ฐ”์ผ ํŽ˜์ด์ง€์—์„œ ์ž…๋ ฅ์ฐฝ์ด ์•„๋‹Œ ์˜์—ญ์„ ํ„ฐ์น˜ํ•ด๋„ ํ‚ค๋ณด๋“œ๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ํ˜„์ƒ

๋ชจ๋ฐ”์ผ ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์—์„œ ๊ฒ€์ƒ‰์ฐฝ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์˜์—ญ(์Šค์™€์ดํผ, ๋นˆ ๊ณต๊ฐ„ ๋“ฑ)์„ ํ„ฐ์น˜ํ•ด๋„ ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์™”๋‹ค.document ์ „์ฒด์— touchstart ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์„œ ๊ฒ€์ƒ‰์ฐฝ์— .focus()๋ฅผ ์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค.์˜๋„๋Š” iOS ๋Œ€์‘์ด์—ˆ๋‹ค. iOS์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ œ์Šค์ฒ˜ ์—†์ด ํ˜ธ์ถœํ•œ .

2026๋…„ 4์›” 2์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

์Šค์ผˆ๋ ˆํ†ค UI๋ž€? ์‹ค๋ฌด์—์„œ ์“ฐ๋Š” ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€ ์ •๋ฆฌ

๋ชฉ๋ก UI๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค ๋ณด๋ฉด ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋™์•ˆ ํ™”๋ฉด์ด ๋น„๊ฑฐ๋‚˜ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐ€๋ฆฌ๋Š” ์ƒํ™ฉ์„ ์ž์ฃผ ๋งˆ์ฃผ์นœ๋‹ค.์Šค์ผˆ๋ ˆํ†ค UI(Skeleton UI)๋Š” ๊ทธ ์ˆœ๊ฐ„์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ ๋กœ๋”ฉ ํŒจํ„ด์œผ๋กœ, ์‹ค์ œ ์ฝ˜ํ…์ธ ์™€ ๋น„์Šทํ•œ ํ˜•ํƒœ์˜ ํšŒ์ƒ‰ ๋ธ”๋ก์„ ๋จผ์ € ๋ณด์—ฌ์ค€๋‹ค.๋ผˆ๋Œ€(skeleton)๋งŒ ๋จผ์ € ๊ทธ๋ ค๋‘

2026๋…„ 4์›” 1์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

[TIL] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ - ! (๋А๋‚Œํ‘œ) ์ด๊ฒŒ ๋ญ๊ธธ๋ž˜? Non-Null Assertion Operator

์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ๊ฒƒ & ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ typescript์™€ next.js๋ฅผ ์ ‘๋ชฉ์‹œ์ผœ์„œ ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ์žˆ๋Š”๋ฐ, ๊ฐ€๋”์”ฉ ๋А๋‚Œํ‘œ๊ฐ€ ๋‚˜์™”๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ๋А๋‚Œํ‘œ๋Š” ๋ถ€๋“ฑํ˜ธ์™€ ํ•จ๊ป˜ ์•ž์— ์‚ฌ์šฉํ•˜๋Š” not์˜ ์˜๋ฏธ๋ฐ–์— ๋ชฐ๋ž๋Š”๋ฐ, ๋“œ๋ฌธ๋“œ๋ฌธ ๋’ค์— ๋А๋‚Œํ‘œ๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ €๊ฒŒ ๋ญ˜๊นŒ ์ €๊ฒŒ ๋ญ˜

2024๋…„ 12์›” 6์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

[TIL] Next.js ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ - createObjectURL, arrayBuffer, CloudFlare Images

์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ๊ฒƒ & ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ createObjectURL URL.createObjectURL์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ์ปฌ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜์—ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ์ปฌ ํŒŒ์ผ์„ ๊ฐ„๋‹จํžˆ ๋กœ๋“œ ๊ฐ€๋Šฅ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž์—๊ฒŒ

2024๋…„ 12์›” 5์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

[TIL] Zod - superRefine, z.NEVER

์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ๊ฒƒ & ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ .superRefine ctx.addIssue๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๋งŒํผ ์ด์Šˆ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ์‹คํ–‰ ์ค‘์— ctx.addIssue๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ํ†ต๊ณผ fatal: true ์„ค์ • ์‹œ, ๊ทธ ๋‹ค์Œ refine์ด ์‹คํ–‰

2024๋…„ 12์›” 4์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

[TIL] Next.js - Image ์ปดํฌ๋„ŒํŠธ

์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ๊ฒƒ & ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ Image ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ณธ jsx img๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค. ๋กœ๋”ฉ ์ „ํ›„๋กœ ์ปดํฌ๋„ŒํŠธ ์œ„์น˜๊ฐ€ ๋ฐ€๋ฆฌ๋Š” content shift๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. ์••์ถ•๋ฅ ์ด๋‚˜, ํ™”๋ฉด ํฌ๊ธฐ๋ณ„ ์••์ถ• ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค. ํ•„์ˆ˜ prop์œผ๋กœ

2024๋…„ 12์›” 3์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

[TIL] Next.js - Middleware, Matcher, Edge Runtime

๋ง ๊ทธ๋Œ€๋กœ ์ค‘๊ฐ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์ผ์ข…์˜ ์†ŒํŠธํ”„์›จ์–ด๋ฅผ ๋œปํ•œ๋‹ค. ์–ด๋–ค ๊ฒƒ๊ณผ ๋‹ค๋ฅธ๊ฒƒ ์‚ฌ์ด์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ.๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด request๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.์ด๋ฏธ์ง€, CSS, JS, Favicon ์š”์ฒญ ๋“ฑ ์›น ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ๋‹จ์ผ request ํ•˜๋‚˜ํ•˜๋‚˜ ๋งˆ

2024๋…„ 12์›” 2์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท

[TIL] Database Validation, bcrypt, iron-session

์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ๊ฒƒ & ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ bcrypt ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ด์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•ด์‹œํ•จ์ˆ˜๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฉฑ๋“ฑ์„ฑ ํ•จ์ˆ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.(ํ•ดํ‚น์˜ ์œ„ํ—˜์„ฑ) ์ •ํ•ด์ง„ ์ž…๋ ฅ์— ๋”ฐ๋ผ ์ •ํ•ด์ง„ ๋‚œ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•จ bcryptํ•˜๋Š” ์ด์œ  ๋ณด์•ˆ์ƒ ๋ฐ์ดํ„ฐ๊ฐ€

2024๋…„ 12์›” 1์ผ
ยท
0๊ฐœ์˜ ๋Œ“๊ธ€
ยท