profile
ํ”„๋ก ํŠธ๋Š” ์ˆœํ•ญ์ค‘ ยฟยฟ
ํƒœ๊ทธ ๋ชฉ๋ก
์ „์ฒด๋ณด๊ธฐ (90)TIL(26)JavaScript(16)next.js(11)React(10)typescript(7)reactjs(6)Tailwind CSS(6)์•Œ๊ณ ๋ฆฌ์ฆ˜(4)html(4)CSS(3)git(3)Modifier(3)nextjs(3)tailwind(3)php(3)WIL(3)useForm(2)setState(2)useEffect(2)์ฒดํฌ๋ฐ•์Šค(2)zod(2)frontend(2)์ค„๋ฐ”๊ฟˆ์ฒ˜๋ฆฌ(1)generateMetadata(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)classes(1)responsive(1)Prisma Studio(1)CSSํŒ(1)plugin(1)ํ† ๊ธ€(1)has-[](1)1password(1)validation(1)yarn(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)ํ”„๋ก ํŠธ์—”๋“œ(1)input(1)ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration)(1)laravel(1)peer(1)Recoil(1)ํผ๋ธ”๋ฆฌ์‹ฑ(1)await(1)skeletonui(1).safeParse(1)globals.css(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)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)getํŒŒ๋ผ๋ฏธํ„ฐ(1)react-query(1)Group(1)coerce(1)JS์—†์ด(1)sqlite(1)blade(1)Route Handlers(1)middleware(1)animate()(1)repository(1)xl(1)hook(1)animate-ping(1)CSR(1)SSR(1)๋ชจ๋‹ฌ(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)animate-spin(1)์ƒํƒœ๊ด€๋ฆฌ(1)fallback(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).parse()(1)gradient(1)

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

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

2์ผ ์ „
ยท
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๊ฐœ์˜ ๋Œ“๊ธ€
ยท

[TIL] Validation - validator, coerce

๋ฌธ์ž์—ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌcoerce๋Š” ๊ธฐ๋ณธ ๊ฐ’์„ ๊ฐ•์ œ๋กœ ๋ณ€ํ™˜๋‚ด์žฅ ์ƒ์„ฑ์ž(String(input), Number(input), new Date(input) ๋“ฑ))๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ž…๋ ฅ์„ ๊ฐ•์ œํ•จinput์˜ ๊ฐ’์€ ํ•ญ์ƒ string์œผ๋กœ ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ™”๋ฒˆํ˜ธ ๊ฐ™์€๊ฑด ๊ผญ n

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

[TIL] Prisma ๊ธฐ์ดˆ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์ด์—์„œ ํ†ต์—ญ์‚ฌ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งž์ถฐ ํ•„์š”ํ•œ ํŒŒ์ผ์ด๋‚˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ์œ ์šฉํ•จSQL์„ ๋ชฐ๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค˜์„œ ๊ฐœ๋ฐœ ์ดˆ๋ณด์ž์—๊ฒŒ๋„ ์œ ์šฉํ•จ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

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

[TIL] Next.js - Zod (refine, ์ •๊ทœํ‘œํ˜„์‹ ํ‘œํ˜„)

Zod์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ž์—ด ๊ด€๋ จ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.(https://zod.dev/?id=strings)๋ฌธ์ž์—ด ์Šคํ‚ค๋งˆ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.const name = z.string({required_error: "Name์€

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