๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?

๐€๐ฅ๐ฅ ๐๐จ๐ฌ๐ญ292

[ํšŒ๊ณ ] ๋™๋ฃŒ ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ๋˜๋Œ์•„๋ณธ ๋‚˜ - 4๋…„์ฐจ ๊ฐœ๋ฐœ์ž์˜ ํšŒ๊ณ ๋ก ํšŒ๊ณ  · Retrospective ๋™๋ฃŒ ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ๋˜๋Œ์•„๋ณธ ๋‚˜— ํ”„๋ก ํŠธ์—”๋“œ ๋ฉ”์ธ ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ํšŒ๊ณ  ํ•จ๊ป˜ ์ผํ–ˆ๋˜ ๋™๋ฃŒ๋“ค์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๋‹ค. ํ˜„์žฌ ๊ฐ™์ด ์ผํ•˜๋Š” ๋™๋ฃŒ๋„ ์žˆ๊ณ , TF๋กœ ์ž ๊น ํ•จ๊ป˜ํ–ˆ๋˜ ๋™๋ฃŒ๋„, ์ด๋ฏธ ํ‡ด์‚ฌํ•œ ๋™๋ฃŒ๋„ ์žˆ๋‹ค. ๋ฐ›์•„๋ณด๊ธฐ ์ „์—๋Š” ์†”์งํžˆ ๋‘๊ทผ๊ฑฐ๋ ธ๋‹ค. ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์•ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๋ง‰์ƒ ๊ธ€์ž๋กœ ๋งˆ์ฃผํ•˜๋Š” ๊ฑด ๋‹ค๋ฅธ ์ผ์ด๋‹ˆ๊นŒ. ํ”ผ๋“œ๋ฐฑ์„ ์ฝ์œผ๋ฉฐ ์›ƒ๊ธฐ๋„ ํ–ˆ๊ณ , ์กฐ์šฉํžˆ ๋ˆŒ๋Ÿฌ๋‘์—ˆ๋˜ ๊ฐ์ •์ด ์˜ฌ๋ผ์˜ค๊ธฐ๋„ ํ–ˆ๋‹ค. ์ด ๊ธ€์€ ๊ทธ ํ”ผ๋“œ๋ฐฑ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์Šค์Šค๋กœ๋ฅผ ๋Œ์•„๋ณธ ๊ธฐ๋ก์ด๋‹ค. ๋‚˜๋Š” ์–ด๋–ค ๊ฐœ๋ฐœ์ž์ธ๊ฐ€ ๋‚˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ด์ž, ํ˜„์žฌ ํด๋ผ์šฐ๋“œ ์ œํ’ˆ ํŒŒํŠธ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ฉ”์ธ ๊ฐœ๋ฐœ์ž ์—ญํ• ์„ ๋งก๊ณ  ์žˆ๋‹ค. ๋‚˜์˜ ์ฃผ์š” ์—ญํ• ์€ ๊ฐœ๋ฐœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๊ฐ์„ ๋ฏธ๋ฆฌ ๋ถ„๋ฐฐํ•˜๊ณ  ํ˜„์‹ค์ ์ธ ์ผ์ •์„ ์‚ฐ์ถœํ•˜์—ฌ ํƒ€ .. 2026. 5. 27.
[ํšŒ๊ณ ] HIGH FIVE 2026 - ๋‚˜๋Š” ์–ด๋–ค ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•ด์•ผ ํ•˜๋Š”๊ฐ€? HIGH FIVE 2026์— ๋‹ค๋…€์˜ค๋ฉฐ์ด ๊ธ€์€ ๊ฐ•์—ฐ ๋‚ด์šฉ๋ณด๋‹ค๋Š” ๊ฐœ์ธ ๊ด€์ ์—์„œ ๋А๋‚€ ์ ์— ๋Œ€ํ•ด ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ HIGH FIVE 2026์€ ๊ฐœ์ธ์ ์œผ๋กœ ๊ฝค ์˜๋ฏธ๊ฐ€ ์ปธ๋˜ ํ–‰์‚ฌ์˜€๋‹ค.์‚ฌ์‹ค ๋‚˜๋Š” ๋งค๋…„ 2~3๋ฒˆ ์ •๋„๋Š” ๊ฐœ๋ฐœ ์ปจํผ๋Ÿฐ์Šค๋ฅผ ์ฐพ์•„๋‹ค๋‹ˆ๋Š” ํŽธ์ด๋‹ค.์ƒˆ๋กœ์šด ๊ธฐ์ˆ  ์ž์ฒด๋„ ์ข‹์•„ํ•˜์ง€๋งŒ, ๊ฒฐ๊ตญ ์ง€๊ธˆ ์—…๊ณ„๊ฐ€ ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๊ณ„์† ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.์šฐ๋ฆฌ ํšŒ์‚ฌ์˜ ๊ทœ๋ชจ๋ณด๋‹ค ๋ช‡๋ฐฑ๋ฐฐ๋Š” ํฐ ํšŒ์‚ฌ์—์„œ๋Š” ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜๊ธฐ๋„ ํ•˜๊ณ ,๊ทธ๋“ค์ด ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ๋“ค๊ณผ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์œผ๋ฉด์„œ ์•Œ์„ ๊นจ๊ณ  ๋‚˜์˜ค๋Š” ๊ฑฐ ๊ฐ™์„ ๋•Œ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฒˆ ์ปจํผ๋Ÿฐ์Šค๋Š” TECH ์„ธ์…˜๋งŒ ๋“ค์€๊ฒŒ ์ข€ ์•„์‰ฌ์šธ ์ •๋„๋กœ,๋‹ค๋ฅธ ์„ธ์…˜๋“ค๋„ ์žฌ๋ฐŒ๋Š”๊ฒŒ ๋งŽ์•„๋ณด์—ฌ์„œ ๋‹ค์Œ์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜๋ฉด ๋” ๋‹ค์–‘ํ•˜๊ฒŒ ๋“ค์–ด๋ณด๊ณ  ์‹ถ๋‹ค. ์ด๋ฒˆ์—๋„ ํšŒ์‚ฌ์— ๋จผ์ € ์ด์•ผ๊ธฐํ•ด์„œ ํ•จ.. 2026. 5. 19.
[DX ๊ฐœ์„ ] Orval์„ ํ™œ์šฉํ•œ API Boilerplate ์ž๋™ํ™” ๊ฒฝํ—˜๊ธฐ ๊ธฐํš์€ ๊ณ„์† ๋ฐ”๋€Œ๋Š”๋ฐ ๊ฐœ๋ฐœ ์ผ์ •์€ ๊ณ ์ •๋˜์–ด ์žˆ์—ˆ๋‹ค์„œ๋น„์Šค ์ „์ฒด ๊ฐœํŽธ์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์งง์€ ๊ธฐ๊ฐ„ ์•ˆ์— ๋งค์šฐ ๋งŽ์€ ํ™”๋ฉด์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.ํŽ˜์ด์ง€, ์Šฌ๋ผ์ด๋“œ์•„์›ƒ, ๋ชจ๋‹ฌ์„ ํฌํ•จํ•ด 30๊ฐœ ์ด์ƒ์˜ ํ™”๋ฉด์ด ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ–ˆ๊ณ , ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ ํ™”๋ฉด ์ˆ˜๋งŒ ๋งŽ์•˜๋˜ ๊ฒƒ์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.๊ธฐํš์€ ์™„์ „ํžˆ ํ™•์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜€๊ณ , ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋Š” ๋™์•ˆ์—๋„ ๊ณ„์†ํ•ด์„œ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ฆด๋ฆฌ์ฆˆ ์ผ์ •์€ ๊ณ ์ •๋˜์–ด ์žˆ์—ˆ๊ณ , ๊ฒฐ๊ตญ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ œ ๊ตฌํ˜„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์€ ๊ณ„์† ์ค„์–ด๋“œ๋Š” ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค.์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ €๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‹ค์Œ ์งˆ๋ฌธ์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.“์ง€๊ธˆ ๋‚ด๊ฐ€ ์ •๋ง ์ œํ’ˆ ๊ฐœ๋ฐœ์— ์‹œ๊ฐ„์„ ์“ฐ๊ณ  ์žˆ๋Š” ๊ฑธ๊นŒ? ์˜๋ฏธ ์—†๋Š” ๋ฐ˜๋ณต ์ž‘์—…์— ์‹œ๊ฐ„์„ ์Ÿ๋Š”๊ฑฐ ์•„๋‹๊นŒ?” ๋ฐ˜๋ณต๋˜๋Š” API Boilerplate ๋ฌธ์ œ๊ธฐ.. 2026. 5. 12.
[Next.js] ์„ฑ๋Šฅ ์ตœ์ ํ™” - ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ๋ฐฐ๋Ÿด ํŒŒ์ผ ๊ด€๋ฆฌ ์ „๋žต ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์šฐ๋ฆฌ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ '๊น”๋”ํ•œ ์ฝ”๋“œ'๋ฅผ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ์ˆ˜์‹ญ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ๊ณณ์— ๋ชจ์•„ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฐ๋Ÿด ํŒŒ์ผ(Barrel File) ํŒจํ„ด์„ ํ”ํžˆ ์‚ฌ์šฉํ•˜๊ณค ํ•˜์ฃ . ํ•˜์ง€๋งŒ ์ด ํŽธ๋ฆฌํ•จ ๋’ค์—๋Š” ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ์™€ ์„ฑ๋Šฅ์„ ๊ฐ‰์•„๋จน๋Š” ์น˜๋ช…์ ์ธ ํ•จ์ •์ด ์ˆจ์–ด ์žˆ์Šต๋‹ˆ๋‹ค.์˜ค๋Š˜์€ ๋ฐฐ๋Ÿด ํŒŒ์ผ์ด ์™œ ์„ฑ๋Šฅ์˜ ์ ์ด ๋˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ ์ปค์ ธ๋ฒ„๋ฆฐ ํ”„๋กœ์ ํŠธ์—์„œ Next.js์˜ optimizePackageImports๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ์šฐ์•„ํ•˜๊ฒŒ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 1. ๋ฐฐ๋Ÿด ํŒŒ์ผ(Barrel File)์ด๋ž€?๋ฐฐ๋Ÿด ํŒŒ์ผ์€ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ํ•˜๋‚˜์˜ index.ts ํŒŒ์ผ๋กœ ๋ชจ์•„์„œ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๋Š”(Re-export) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.// components/index.ts (๋ฐฐ๋Ÿด ํŒŒ์ผ)export { d.. 2026. 2. 13.
[Next.js] ๋นŒ๋“œ ์ตœ์ ํ™” - ํ”„๋กœ๋•์…˜ ๋ฒˆ๋“ค์—์„œ ๊ฐœ๋ฐœ ์ „์šฉ ์ฝ”๋“œ ์ œ์™ธํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก Next.js ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์ ์  ๋Š˜์–ด๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ์ฒด๊ฐํ•˜๊ฒŒ ๋๋‹ค.“์ฝ”๋“œ๊ฐ€ ๋Š˜๋ฉด ๋นŒ๋“œ๊ฐ€ ๋А๋ ค์ง€๋Š” ๊ฑด ๋‹น์—ฐํ•œ ๊ฑฐ ์•„๋‹Œ๊ฐ€?” ์‹ถ์ง€๋งŒ,์ž์„ธํžˆ ๋ณด๋ฉด ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๊นŒ์ง€ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์‹œ๊ฐ„์„ ์žก์•„๋จน๋Š” ๊ตฌ๊ฐ„๋“ค์ด ์žˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์€ ๊ทธ์ค‘ ํ•˜๋‚˜์˜€๋˜ React Query / Jotai DevTools๋ฅผ _app์— ์ •์  import๋กœ ๋„ฃ์–ด๋‘” ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•ด์„œ,๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ค„์ธ ๊ณผ์ •์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค. 1. ๋ฌธ์ œ: DevTools๋ฅผ ๊ทธ๋ƒฅ ๋„ฃ์œผ๋ฉด?๊ฐœ๋ฐœ ํŽธ์˜๋ฅผ ์œ„ํ•ด @tanstack/react-query-devtools, jotai-devtools๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ,๋ณดํ†ต์€ ์ƒ๋‹จ์—์„œ ์ •์  import ํ•œ ๋’ค _app ์•ˆ์—์„œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋œ๋‹ค.import { ReactQu.. 2026. 2. 4.
[AI/Dev] AI ๊ฐ€์ด๋“œ ๊ธฐ๋Šฅ ํ”„๋กฌํ”„ํŠธ ๊ณ ๋„ํ™” ๊ธฐ๋ก๊ณผ ๊ณ ์ฐฐ ๋‚˜๋Š” ํ˜„์žฌ ํšŒ์‚ฌ์—์„œ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์ผํ•˜๊ณ  ์žˆ๋‹ค.ํ˜„์žฌ ๋‚ด๊ฐ€ ๋งก์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ์— AI ๊ฐ€์ด๋“œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ด์ง€๋งŒ ํŒŒํŠธ์žฅ๋‹˜๊ป˜ ํ”„๋กฌํ”„ํŠธ ๊ณ ๋„ํ™”๋ฅผ ์ฃผ๋„์ ์œผ๋กœ ๋ง์”€๋“œ๋ ค์„œ,๋‚ด๊ฐ€ ์ฃผ๋„ํ•˜์—ฌ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์™€ ํ•จ๊ป˜ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ์„ ํ•˜๋Š” ์—ญํ• ์„ ์ž์ฒ˜ํ–ˆ๋‹ค.๊ทธ ์ด์œ ๋Š” AI ์‘๋‹ต์˜ ํ’ˆ์งˆ๊ณผ ์ผ๊ด€์„ฑ์ด ๊ณง ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์œผ๋กœ ์ง๊ฒฐ๋œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ธ€์€ ๋‚ด๊ฐ€ ๋‹ค์Œ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.AI Guide๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด์„œ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผํ–ˆ๊ณ ์™œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กฌํ”„ํŒ…์— ๊ฐœ์ž…ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์œผ๋ฉฐ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ณ ๋„ํ™”ํ–ˆ๋Š”์ง€ ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•œ ๊ธฐ๋ก์ด๋‹ค. 1. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ AI ๊ฐ€์ด๋“œ ๊ธฐ๋Šฅ์„ ๋ฐ”๋ผ๋ณธ ๊ด€์ AI ๊ฐ€์ด๋“œ ๊ธฐ๋Šฅ์„ ๋Œ€๋žต์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.ํ˜„์žฌ ๋‚ด๊ฐ€.. 2026. 2. 4.
[Next.js] ์„ฑ๋Šฅ ์ตœ์ ํ™” - ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐœ์„  (feat. bundle-analyzer) ์–ด๋А ๋‚  ๋ฌธ๋“ ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ์ดˆ๊ธฐ ๋กœ๋”ฉ์ด ๋А๋ฆฌ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค. Bundle Analyzer๋ฅผ ๋Œ๋ ค๋ณด๋‹ˆ... _app.js๊ฐ€ 4.2MB์˜€๋‹ค. ์–ด๋–ป๊ฒŒ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๊ณต์œ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ค€๋น„: Bundle Analyzer ์„ค์น˜๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋ถ„์„ํ•˜๋ ค๋ฉด ๋จผ์ € @next/bundle-analyzer๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.yarn add -D @next/bundle-analyzernext.config.js์— ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ๋‹ค:const withBundleAnalyzer = require('@next/bundle-analyzer')({ enabled: process.env.ANALYZE === 'true',});module.exports = withBundleAnalyzer({ // ๊ธฐ์กด ์„ค์ •...});ํŽธ์˜๋ฅผ ์œ„.. 2026. 2. 3.
[React] ํŒŒํŽธํ™”๋œ Form ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง, Zod๋กœ ์šฐ์•„ํ•˜๊ฒŒ ๊ฒฉ๋ฆฌํ•˜๊ธฐ 1. ๋“ค์–ด๊ฐ€๋ฉฐ: ๊ฑฐ๋Œ€ํ•ด์ง„ Form์˜ ์Šต๊ฒฉํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ˆ˜์‹ญ ๊ฐœ์˜ ์ž…๋ ฅ ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฑฐ๋Œ€ํ•œ ์„ค์ • Form์„ ๋‹ค๋ค„์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.์ดˆ๊ธฐ์—๋Š” ๋‹จ์ˆœํ–ˆ๋˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง๋„ ์„œ๋น„์Šค๊ฐ€ ์„ฑ์žฅํ•˜๋ฉด์„œ ์ ์  ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.์ •๊ทœ์‹ ๊ธฐ๋ฐ˜ ํฌ๋งท ๊ฒ€์ฆํŒŒ์ผ ํฌ๊ธฐ ๋ฐ ํ™•์žฅ์ž ์ฒดํฌํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๋งŒ ์ด์–ด์ง€๋Š” ์ˆœ์ฐจ ๊ฒ€์ฆ์ด๋Ÿฐ ๋กœ์ง๋“ค์ด ํ•˜๋‚˜๋‘˜ ์ถ”๊ฐ€๋˜๋‹ค ๋ณด๋ฉด, ์–ด๋А ์ˆœ๊ฐ„ UI ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์ˆ˜๋ฐฑ ์ค„์˜ ๊ฒ€์ฆ ์ฝ”๋“œ๊ฐ€ ๋’ค์—‰์ผœ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ์ดˆ๊ธฐ์— ์•ฝ 3์ฃผ๋งŒ์— ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋ฅผ ์˜ฌ๋ ค์•ผ ํ–ˆ์œผ๋ฉฐ, MVP๊ฐ€ ๊ธฐ์กด์˜ ์˜จํ”„๋ ˆ๋ฏธ์Šค์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ํ˜ผ์ž ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ•‘๊ณ„๋กœ UI๋กœ์ง๊ณผ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์ด ๋’ค์„ž์ธ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋กœ์ง์ด ์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ๋“ค์–ด์˜ค๊ฒŒ ๋˜์–ด ๋ฎ์–ด๋‘์—ˆ.. 2026. 1. 12.
์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„ ํ•˜๊ธฐ : 4. ํ•˜๋‚˜์˜ ์ฑ„๋„๋กœ SSE ํ†ต์‹ ํ•˜๊ธฐ (with. Shared Worker) ์ด์ „๊ธ€์—์„œ SSE ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ๋ฅผ ๋งˆ์นœํ›„์— ์‹ค์ œ๋กœ ๊ฐœ๋ฐœ์— ์ฐฉ์ˆ˜ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ฐœ๋ฐœ ์ด์ „์— ๋‚ด๊ฐ€ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์•˜๋‹ค. 1. SSE๋Š” ๋ธŒ๋ผ์šฐ์ € ํƒญ๋งˆ๋‹ค ์—ฐ๊ฒฐ์ด ์ƒˆ๋กœ ์—ด๋ฆฐ๋‹ค.2. ํ—ค๋” ์ปค์Šคํ…€์ด ํ•„์š”ํ•˜์ง€๋งŒ SSE์˜ ๊ฒฝ์šฐ ํ—ค๋” ์ปค์Šคํ…€์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ์กฐ๊ฑด์„ ๋™์‹œ์— ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ด๋ฒˆ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ ๊ณผ์ œ์˜€๋‹ค. 1. ํƒญ๋งˆ๋‹ค ์ƒˆ๋กœ ์—ด๋ฆฌ๋Š” SSE ์—ฐ๊ฒฐ ๋ฌธ์ œSSE๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ํƒญ ๋‹จ์œ„๋กœ ์—ฐ๊ฒฐ์ด ์ƒ์„ฑ๋œ๋‹ค.์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ์„œ๋น„์Šค์—์„œ ํƒญ์„ 3๊ฐœ ์—ด๋ฉด ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” SSE ์—ฐ๊ฒฐ์ด 3๊ฐœ๊ฐ€ ์—ด๋ฆฐ๋‹ค. ๊ธฐ์ˆ  ๊ฒ€ํ†  ์ดˆ๊ธฐ์—๋Š” ์ด ๋ถ€๋ถ„์„ ํฌ๊ฒŒ ๋ฌธ์ œ ์‚ผ์ง€ ์•Š์•˜๋‹ค.ํ•˜์ง€๋งŒ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์€ ํŠน์ • ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ํ—ค๋”์— ํ•ญ์ƒ ๋–  ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์ด์—ˆ๊ณ , ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉ์ž๋Š” ์—ฌ๋Ÿฌ ํƒญ์„ .. 2025. 12. 7.
์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„ ํ•˜๊ธฐ : 3. ์ธํ”„๋ผ ํ™˜๊ฒฝ์—์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ (with. trouble shooting) ์ด์ „ ๊ธ€์—์„œ ๋ฐฑ์—”๋“œ ๋กœ์ปฌ ์„œ๋ฒ„์—์„œ๋Š” ์‹คํ–‰์ด ์ž˜ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ k8s ์ธํ”„๋ผ ํ™˜๊ฒฝ์— ์˜ฌ๋ ธ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Next.js API Routes + SSE ํ”„๋ก์‹œ ๊ตฌ์„ฑ ์‹œ K8s ํ™˜๊ฒฝ์—์„œ localhost๋กœ ์—ฐ๊ฒฐ๋˜๋˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•ด๋ณด๋ ค ํ•œ๋‹ค. Next.js API Routes๋ฅผ ์‚ฌ์šฉํ•ด SSE(Server-Sent Events) ํ”„๋ก์‹œ๋ฅผ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘, ๋กœ์ปฌ(Linux ์„œ๋ฒ„)์—์„œ๋Š” ์ •์ƒ ๋™์ž‘ํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ Kubernetes(K8s) ์ธํ”„๋ผ ํ™˜๊ฒฝ์— ๋ฐฐํฌ๋˜์ž localhost๋กœ ์ž˜๋ชป ์—ฐ๊ฒฐ๋˜๋ฉฐ ์‹คํŒจํ•˜๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋‹จ์ˆœํ•œ “env ์„ค์ • ์‹ค์ˆ˜”๋ฅผ ๋„˜์–ด,IP ์ง์ ‘ ์ ‘๊ทผ ↔ Service Name ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์˜ ๊ตฌ์กฐ์  ์ฐจ์ด,๊ทธ๋ฆฌ๊ณ  Next.js์˜ ๋นŒ๋“œ·๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ .. 2025. 12. 7.
์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„ ํ•˜๊ธฐ : 2. SSE ๋ฐฑ์—”๋“œ ๋กœ์ปฌ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ (feat. next.js) ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ํ”„๋ก ํŠธ(next.js - pages router)์™€ ๋ฐฑ์—”๋“œ(spring boot)๋กœ ๋œ ํ”„๋กœ์ ํŠธ์ด๋‹ค. ๊ธฐ์ˆ ์„ ๋„์ž…ํ•˜๊ธฐ ์ „ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์™€ SSE ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ์ง€ ํ™•์ธ์„ ์œ„ํ•ด ํ”„๋กœํ†  ํƒ€์ž… ํ…Œ์ŠคํŠธ๋ฅผ ์‹œํ–‰ํ•˜์˜€๋‹ค. ํ”„๋ก ํŠธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์˜€๋‹ค. EventSource ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด SSE ์ฑ„๋„์„ ์—ด๊ณ , ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์ด๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ฐฑ์—”๋“œ์™€์˜ ํ†ต์‹ ์„ next.config.js์˜ rewrites ์„ค์ •์„ ํ†ตํ•ด ํ”„๋ก์‹œํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, SSE ์—”๋“œํฌ์ธํŠธ(/sse/test)๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค.// pages/sse-example.jsximport { useEffect } from 'react';export default function SseExa.. 2025. 12. 7.
์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„ ํ•˜๊ธฐ : 1. SSE(Server Sent Events)๋Š” ๋ฌด์—‡์ธ๊ฐ€? SSE(Server Sent Events)SSE์˜ ๊ฒฝ์šฐ ์›นํŽ˜์ด์ง€(ํด๋ผ์ด์–ธํŠธ)์˜ ์š”์ฒญ ์—†์ด๋„ ์–ธ์ œ๋“ ์ง€ ์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ์ „ํ†ต์ ์œผ๋กœ ์›นํŽ˜์ด์ง€(ํด๋ผ์ด์–ธํŠธ)๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•จSSE(Server-Sent Events)๋Š” ์‹ค์‹œ๊ฐ„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” Web API์‹ค์‹œ๊ฐ„์œผ๋กœ ์†Œ์‹ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ, ์•Œ๋ฆผ ๋ฐ›๊ธฐ ๋“ฑ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉํ•ด์„œ ์‚ฌ์šฉํ• ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋™์ž‘ ํ๋ฆ„ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ SSE๋กœ ํ†ต์‹ ํ•˜์ž๋Š” ์š”์ฒญ์„ ๋ณด๋ƒ„. (Connection Request)์„œ๋ฒ„๋Š” ์ด ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๊ณ  ์ˆ˜๋ฝํ–ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ„. (Connection Response)ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฅผ ๋ฐ›๊ณ , ์ง€๊ธˆ๋ถ€ํ„ฐ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐ์ดํ„ฐ๋“ค์— ๋ฐ˜์‘ํ•  ์ค€๋น„์ด์ œ ์„œ๋ฒ„.. 2025. 12. 1.
์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„ ํ•˜๊ธฐ : 0. ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„๊ณผ ๋ฐฉ๋ฒ•๋ก  ๋น„๊ต ์ด์ „์—๋Š” ์„œ๋น„์Šค์— ์•Œ๋ฆผ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฑ„๋„์ด ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค.์„œ๋น„์Šค ๋‚ด์— ๊ธฐ์กด์— ์ง€์›ํ•˜๋˜ ๋ถ„์„๊ณผ ๊ด€๋ จ๋œ ์„œ๋น„์Šค ์™ธ์— SBOM์„ ํ™œ์šฉํ•œ ์„œ๋น„์Šค์˜ ๊ณต์œ  ๊ธฐ๋Šฅ์ด ์ƒ๊ธฐ๊ฒŒ ๋˜๋ฉด์„œ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์ด ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค. ์ฃผ์š” ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.์ด๋ฒคํŠธ ์ˆ˜์‹  ์—ฌ๋ถ€ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ์ด๋ฒคํŠธ ์‚ญ์ œ ์‹œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ์š”๊ตฌ ์‚ฌํ•ญ ๋ถ„์„ โœ… ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ๋ฐ์ดํ„ฐ ์ „์†ก ํ๋ฆ„case 1 : ํด๋ผ์ด์–ธํŠธ → ์„œ๋ฒ„ (์š”์ฒญ)case 2 : ์„œ๋ฒ„ → ํด๋ผ์ด์–ธํŠธโœ… ์ด๋ฒคํŠธ ์ˆ˜์‹  ์—ฌ๋ถ€ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜, ์ด๋ฒคํŠธ ์‚ญ์ œ ์‹œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ๋ฐ์ดํ„ฐ ์š”์ฒญ/์ „์†ก ํ๋ฆ„ํด๋ผ์ด์–ธํŠธ ๋™์ž‘ → ์„œ๋ฒ„ (์š”์ฒญ)์‹ค์‹œ๊ฐ„์„ฑ์ด ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ ๋™์ž‘์— ๋”ฐ๋ฅธ ์„œ๋ฒ„ ์š”์ฒญ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ๊ณผ ๋ณ„๊ฐœ๋กœ ์ƒ๊ฐ๊ธฐ์กด REST ์š”์ฒญ์„.. 2025. 12. 1.
์‚ฌ๋‚ด ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ํ†ตํ•ฉ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ธฐ : 6. on-premise sentry ๊ณ ๋„ํ™” ์ด์ „๊ธ€ ์—์„œ sentry๋ฅผ ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„์— ์—ฐ๋™ ์™„๋ฃŒํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ค ์œ ์ €๊ฐ€ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์ธ์ง€ ํ™•์ธํ•˜๊ธฐ๋Š” ์–ด๋ ค์› ๊ณ  ์†Œ์Šค๋งต ์—ฐ๋™๋„ ์ œ๋Œ€๋กœ ๋˜์–ด์žˆ์ง€ ์•Š์•„์„œ ์–ด๋–ค ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์ธ์ง€ ํ•œ ๋ˆˆ์— ์•Œ์•„๋ณผ ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์— ์˜ค๋ฅ˜๋ฅผ ํŠธ๋ ˆ์ด์Šคํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ, ํ˜„์žฌ ์„œ๋น„์Šค๊ฐ€ ๋ฆด๋ฆฌ์ฆˆ ๋˜์–ด์žˆ๋Š” ํ˜„์žฌ ์‹œ์ ์— ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ํŽ˜์ด์ง€(๊ธฐ๋Šฅ๋‹จ์œ„์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.)๋ฅผ ์ž์ฃผ ๋“ค์–ด๊ฐ€๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ๋‚ด๋ถ€์˜ ์˜๊ฒฌ๋„ ์กด์žฌํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” 3๊ฐ€์ง€์— ๋Œ€ํ•ด์„œ ์ผ๋‹จ ๊ณ ๋„ํ™”๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค. 1. ์–ด๋–ค ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋น„๋กฏ๋œ ์˜ค๋ฅ˜์ธ๊ฐ€2. ์–ด๋–ค ์†Œ์Šค์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ํŠธ๋ ˆ์ด์Šค ๋œ ์˜ค๋ฅ˜์ธ๊ฐ€3. ์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์ด ์ ‘๊ทผํ•˜๋Š”๊ฐ€ ์–ด๋–ค ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋น„๋กฏ๋œ ์˜ค๋ฅ˜์ธ๊ฐ€Sentry์—์„œ๋Š” ์—๋Ÿฌ ์ด๋ฒคํŠธ์— ์‚ฌ์šฉ.. 2025. 11. 29.
์‚ฌ๋‚ด ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ํ†ตํ•ฉ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ธฐ : 5. ํŽ˜์ด์ง€ ๋‹จ์œ„์˜ UI/UX ๊ฐœ์„ ํ•˜๊ธฐ ์ด์ „์— ์ž‘์„ฑํ–ˆ๋˜ UI/UX ๊ฐœ์„ ๊ธฐ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ๊ฐœ์„ ์„ ๋‹ค๋ค˜๋‹ค๋ฉด,์ด๋ฒˆ์—๋Š” ํŽ˜์ด์ง€ ๋‹จ์œ„์˜ UI/UX ๊ฐœ์„  ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.์–ด์ฉŒ๋‹ค๋ณด๋‹ˆ "๋ ˆํผ๋Ÿฐ์Šค"๋ผ๋Š” ๊ฐœ๋…์— ๋Œ€ํ•œ ๊ฐœ์„ ์„ ์ž๊พธ ๋‹ค๋ฃจ๊ฒŒ ๋˜์ง€๋งŒ, ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋“ค๋„ ๊ฐœ์„  ์‚ฌํ•ญ์ด ๊ฝค ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ, ์ถ”๊ฐ€ ๋˜๋Š” ๊ฐœ๋…๋“ค์ด ์žˆ์–ด์„œ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ์ž๋“ค์ด ์„ค๋ช… ์—†์ด ์ง๊ด€์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?๋ผ๋Š” ๊ณ ๋ฏผ์„ ๋˜๊ฒŒ ๋งŽ์ด ํ–ˆ๋‹ค. ๊ฐœ๋ฐœ๋„ ๊ฐœ๋ฐœ์ด์ง€๋งŒ ๊ธฐํš๊ณผ UI/UX๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ์ผ๋„ ๊ฝค๋‚˜ ์˜๋ฏธ์žˆ๊ณ  ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜์”ฉ ๋‹ค ๋œฏ์–ด๋ณด๊ณ , ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๋ถˆํŽธํ•œ ์ ๋“ค์„ ์ทจํ•ฉํ•˜๊ณ , ๊ธฐ์กด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋ฌผ์–ด๋ด์„œ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋“ค์— ๊ณ ๋ฏผํ–ˆ๋‹ค. ์•ฝ๊ฐ„์˜ ์ž์œจ์„ฑ์ด ์ฃผ์–ด์ง€๋Š” ํ”„๋กœ์ ํŠธ๋ผ์„œ ํ”ผ๋“œ๋ฐฑ์ด ๋” ๋น ๋ฅด๊ฒŒ ์˜ค๊ฐ”๋˜ ํ™˜๊ฒฝ์ด๋ผ ๋”์šฑ ํฅ๋ฏธ๋ฅผ ๋А๊ผˆ๋˜๊ฑฐ ๊ฐ™๋‹ค. ๊ฐ™์ด ์ฐธ์—ฌํ•œ ๋ถ„๋“ค๋„ .. 2025. 11. 28.
์‚ฌ๋‚ด ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ํ†ตํ•ฉ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ธฐ : 4. sentry self-hosted (on-premise) ์„ธํŒ… with next.js 1. Sentry๋ž€?Sentry๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ ๋ฐ ์˜ˆ์™ธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ์˜ค๋ฅ˜ ์ถ”์  ์‹œ์Šคํ…œ์ด๋‹ค.์ฃผ๋กœ ์›น, ๋ชจ๋ฐ”์ผ, ๋ฐ์Šคํฌํƒ‘ ๋“ฑ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜ ์ด์Šˆ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋œ๋‹ค.“Application Monitoring and Error Tracking that helps developers see what actually matters, solve quicker, and learn continuously in production.”2. Sentry๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“คโœ… ์—๋Ÿฌ ์ถ”์ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ํฌํ•จํ•œ ์ƒ์„ธ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•ด ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์‹œ๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ .. 2025. 6. 18.
์‚ฌ๋‚ด ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ํ†ตํ•ฉ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ธฐ : 3. URL์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•œ ํ•„ํ„ฐ, ๊ฒ€์ƒ‰, ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ฒด์ปค ๋ชฉ๋ก ํ™”๋ฉด์—์„œ ํ•„ํ„ฐ, ๊ฒ€์ƒ‰, ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ–ˆ๋Š”์ง€ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.ํŠนํžˆ Next.js ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ์—์„œ URL ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ƒํƒœ๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๊ณ ,์ด๋ฅผ React Query์™€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)๊นŒ์ง€ ์—ฐ๊ฒฐํ•ด ์ผ๊ด€๋œ UX์™€ ์ดˆ๊ธฐ ์„ฑ๋Šฅ์„ ํ™•๋ณดํ•˜๋Š” ์ „๋žต์„ ์„ค๊ณ„ํ–ˆ๋‹ค. ๐Ÿ” ๋ฌธ์ œ ์ •์˜์ฒ˜์Œ์—๋Š” ํ•„ํ„ฐ์™€ ๊ฒ€์ƒ‰ ์ƒํƒœ๋ฅผ ์ „์—ญ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ localStorage์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ–ˆ์—ˆ๋‹ค.ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ์‹ค์งˆ์ ์ธ ํ•œ๊ณ„์ ์ด ์กด์žฌํ–ˆ๋‹ค.ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์ƒํƒœ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์–ด ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์งํ•„ํ„ฐ๋ง๋œ ์ƒํƒœ๋ฅผ URL๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์—†์–ด ํ˜‘์—… ์‹œ ๋ถˆํŽธํ•จ๋ธŒ๋ผ์šฐ์ € ๋’ค๋กœ๊ฐ€๊ธฐ/์•ž์œผ๋กœ๊ฐ€๊ธฐ ๋™์ž‘์ด ๊ธฐ๋Œ€์™€ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•จSSR์„ ํ™œ์šฉํ•œ ์ดˆ๊ธฐ ๋ Œ๋”๋ง๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•„ ๋กœ๋”ฉ ์‹œ UX๊ฐ€ ์ข‹์ง€ ์•Š์Œ์ด.. 2025. 6. 13.
์‚ฌ๋‚ด ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ํ†ตํ•ฉ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ธฐ : 2. ๊ณ„์ธตํ˜• ๋ ˆํผ๋Ÿฐ์Šค ํ•„ํ„ฐ UI ๊ฐœ์„ ๊ธฐ ๐Ÿงฑ ๋ณต์žกํ•œ ํŠธ๋ฆฌ๊ตฌ์กฐ ํ•„ํ„ฐ, ๊ณ„์ธตํ˜• ํ•„ํ„ฐ๋กœ ๊ฐœ์„ ํ•˜๊ธฐโŒ ๊ธฐ์กด UI์˜ ๋ฌธ์ œ์ ๊ธฐ์กด์˜ ์ฒด์ปค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํŠธ๋ฆฌ ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์˜ ๋ ˆํผ๋Ÿฐ์Šค ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ ํ•„ํ„ฐ๋Š” ์‹œ๊ฐ์ ์œผ๋กœ ๋ณต์žกํ•˜๋ฉฐ, ์ค‘์ฒฉ ๋ ˆ๋ฒจ์ด ๋งŽ์•„์ง€๋ฉด ๊ฐ€๋…์„ฑ๊ณผ ์‚ฌ์šฉ์„ฑ์ด ๊ธ‰๊ฒฉํžˆ ๋–จ์–ด์ง€๋Š” ๊ตฌ์กฐ๊ฐ ์ฑ•ํ„ฐ/๋ฃฐ ๋‹จ์œ„๋กœ ์„ ํƒํ•  ์ˆ˜๋Š” ์žˆ์—ˆ์ง€๋งŒ, ์ „์ฒด ์„ ํƒ/ํ•ด์ œ ๋กœ์ง์ด ์ง๊ด€์ ์ด์ง€ ์•Š์•˜๊ณ , ๋งˆ์šฐ์Šค ์—†์ด ์กฐ์ž‘ํ•˜๊ธฐ์—๋„ ๋ถˆํŽธ์Šคํฌ๋กค์ด ๋งŽ๊ณ  ๊ตฌ์กฐ๊ฐ€ ํ‰ํ‰ํ•˜์ง€ ์•Š์•„, ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์„ ํƒํ• ์ง€ ํŒŒ์•…์ด ์–ด๋ ค์›Œ ๋ณด์ž„์ฒซ๋ฒˆ์งธ ์„ ํƒ ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ ํ•„ํ„ฐ ๋ ˆ์ด์•„์›ƒ์„ ๋ฒ—์–ด๋‚œ UI๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ โœ… ๊ฐœ์„  ๋ฐฉํ–ฅ: 3๋‹จ๊ณ„ ๊ณ„์ธตํ˜• ํ•„ํ„ฐ UI๊ธฐ์กด์— ํ•œ๋ˆˆ์— ๋ณด๊ธฐ ์–ด๋ ค์šด UI๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด 3๋‹จ๊ณ„ ๊ณ„์ธต ๊ตฌ์กฐ์— ๊ธฐ๋ฐ˜ํ•œ ์ปค์Šคํ…€ ํ•„ํ„ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ํ–ˆ๋‹ค. ?.. 2025. 6. 13.
์‚ฌ๋‚ด ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ํ†ตํ•ฉ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ธฐ : 1. ๋ถˆํŽธํ•œ ํ•„ํ„ฐ UI, ๋ชจ๋‹ฌ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ ๋ณต์žกํ•œ ํ•„ํ„ฐ UI, ๋ชจ๋‹ฌ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ์„ ํ•˜๊ธฐโŒ ๊ธฐ์กด UI์˜ ๋ฌธ์ œ์  ๊ธฐ์กด SAST ์ฒด์ปค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ์œ„์™€ ๊ฐ™์€ ํ•„ํ„ฐ UI๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋กœ ์ธํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค.๋„ˆ๋ฌด ์ข์€ ๊ณต๊ฐ„์— ๋งŽ์€ ํ•„ํ„ฐ ํ•ญ๋ชฉ์ด ๋ฐฐ์น˜๋˜์–ด ์žˆ์–ด ์‹œ์ธ์„ฑ์ด ๋‚ฎ๊ณ  ์กฐ์ž‘์ด ์–ด๋ ค์›€ํ•„ํ„ฐ ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ์„ธ๋กœ ์Šคํฌ๋กค์ด ๊ธธ์–ด์ง€๊ณ , ์ผ๋ถ€ ํ•ญ๋ชฉ์€ ๊ฐ€๋กœ ์Šคํฌ๋กค ์—†์ด ๋ณผ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋ ˆ์ด์•„์›ƒ์ด ๊นจ์ง€๋Š” ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒํ•„ํ„ฐ ํ•ญ๋ชฉ์— ๋”ฐ๋ผ ๋“œ๋กญ๋‹ค์šด์ด ํ•„ํ„ฐ ์˜์—ญ ๋ฐ–์œผ๋กœ ์‚์ ธ๋‚˜์˜ค๋Š” ๋ฌธ์ œ๋„ ์žˆ์—ˆ๊ณ , ์ผ๋ถ€ ๊ธด ํ…์ŠคํŠธ๋Š” ์ž˜๋ ค์„œ ํ‘œ์‹œ๋˜๊ธฐ๋„ ํ•จ โœ… ๊ฐœ์„  ๋ฐฉํ–ฅ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ UI ๊ฐœ์„ ์„ ์ ์šฉํ–ˆ๋‹ค. ํ•„ํ„ฐ๋ฅผ ๋ชจ๋‹ฌ๋กœ ๋ถ„๋ฆฌ ์ขŒ์ธก ์‚ฌ์ด๋“œ ์˜์—ญ์—์„œ ๋ฒ—์–ด๋‚˜ ์ „์ฒด ๋ชจ๋‹ฌ ์ฐฝ์œผ๋กœ ํ•„ํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‹œ์•ผ ํ™•๋ณด ๋ฐ ์‚ฌ์šฉ์ž ์กฐ์ž‘์„ฑ์„ .. 2025. 6. 13.
์‚ฌ๋‚ด ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ํ†ตํ•ฉ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ธฐ : 0. ํ”„๋กœ์ ํŠธ ๊ฐœ์š”์™€ ๊ธฐ์ˆ  ์„ ํƒ ์‚ฌ๋‚ด ๋ณด์•ˆ ๋ถ„์„ ์ฒด๊ณ„ ํ†ตํ•ฉ ์‹œ์Šคํ…œ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌ์šฐ๋ฆฌ ํšŒ์‚ฌ๋Š” ์ •์  ๋ถ„์„(SAST), ๋™์  ๋ถ„์„(DAST), ์˜คํ”ˆ์†Œ์Šค ์ปดํฌ๋„ŒํŠธ ๋ถ„์„(SCA) ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๋ถ„์„ ์„œ๋น„์Šค๋ฅผ ์ž์ฒด์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์šด์˜ํ•˜๊ณ  ์žˆ๋‹ค.๊ธฐ์กด์— SAST์™€ ๊ด€๋ จ๋œ ์ฒด์ปค(๋ถ„์„ ๊ทœ์น™ ๋ชจ๋“ˆ)๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ์‚ฌ๋‚ด ์‹œ์Šคํ…œ์ด ์กด์žฌํ–ˆ์œผ๋‚˜, ๊ทธ ์™ธ๋Š” ์ˆ˜๋™ ๊ด€๋ฆฌ์— ์˜์กดํ•˜๊ณ  ์žˆ์–ด ์ฒด๊ณ„์ ์ธ ํ†ตํ•ฉ ๊ด€๋ฆฌ ํ”Œ๋žซํผ์ด ๋ถ€์žฌํ•œ ์ƒํ™ฉ์ด์—ˆ๋‹ค. ํŠนํžˆ ์‹ ๊ทœ ์ฒด์ปค๋‚˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์ค‘๋ณต๋œ ์ž‘์—…์ด๋‚˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค.์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด SAST, DAST, SCA ์ฒด์ปค ๋ฐ ๋ ˆํผ๋Ÿฐ์Šค ์ •๋ณด๋ฅผ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์—์„œ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹ ๊ทœ ํ†ตํ•ฉ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๊ธฐํšํ•˜๊ณ  ๊ตฌ์ถ•ํ•˜๋Š” ํ”„๋กœ์ ํŠธ TF๊ฐ€ ๊พธ๋ ค์กŒ๋‹ค. ๋‚˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ.. 2025. 6. 13.
[Docker] next.js๋ฅผ Docker๋กœ ๋ฐฐํฌํ•˜๊ธฐ with multi-stage ๋นŒ๋“œ ๋”๋ณด๊ธฐ๐Ÿ“Œ ๋ชฉ์ฐจDockerfile ์ž‘์„ฑํ•˜๊ธฐ (Single-stage Dockerfile)Multi-stage ๋นŒ๋“œ๋ฅผ ํ†ตํ•œ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”.dockerignore๋กœ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ œ๊ฑฐ์ฃผ์š” Docker ๋ช…๋ น์–ดReference ์‚ฌ๋‚ด ์„œ๋น„์Šค ํ”„๋กœ์ ํŠธ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ๋งก์œผ๋ฉด์„œ CI๋ฅผ ๊ตฌ์ถ•ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ๋‹ค.ํ˜„์žฌ ๊ฐœ๋ฐœ์ค‘์ธ ์„œ๋น„์Šค๋Š” next.js ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋‚ด๊ฐ€ ๋งก์€ ์—ญํ• ์€ Dockerfile์„ ์ƒ์„ฑํ•˜์—ฌ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜์—ฌ Teamcity์— ์—ฐ๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ณผ์ •์—์„œ ํŠน์ • ๋ธŒ๋žœ์น˜์— ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ ์‹œ, ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ ํ›„ ์‚ฌ๋‚ด ์ €์žฅ์†Œ์— push ํ•˜๋„๋ก ํ•˜๋Š” ๊ณผ์ •๊นŒ์ง€๋Š” ๋‚ด๊ฐ€ ๋งก์•˜๋‹ค. ์ตœ์‹  ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์™€ ์„œ๋ฒ„๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์ž‘์—…์€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž ์„ ๋ฐฐ๋‹˜์ด ์—ฐ๋™ํ•˜์‹œ๊ธฐ๋กœ ํ–ˆ๋‹ค. Doc.. 2025. 6. 5.
[Next.js] tailwind CSS ๋กœ์ปฌ ํฐํŠธ ์ ์šฉ (feat. Type '{ children: Element[]; className: string; }' is not assignable to type) next.js + tailwind CSSํ”„๋กœ์ ํŠธ์—์„œ ๊ธ€์”จ์ฒด๋ฅผ ์ ์šฉ ํ•˜๋Š” ๋ฐฉ๋ฒ•ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์€ ๋‹ค์Œ ๊ธฐ์ˆ  ์Šคํƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.- next.js v15 pages-router- react v19- typescript- tailwindCSS- shadcnUIํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” pretendard๋ฅผ ์˜ˆ์‹œ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.  Optimizing: Fonts | Next.jsOptimize your application's web fonts with the built-in `next/font` loaders.nextjs.org Pretendard ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค.https://cactus.tistory.com/306ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํฐํŠธ ๊ฒฝ๋Ÿ‰ํ™”๋ฅผ ์œ„ํ•ด .woff2 ํ™•์žฅ์ž ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ–ˆ์Šต๋‹ˆ๋‹ค.๋‹ค์Œ ๊ฒฝ๋กœ์—.. 2025. 3. 14.
[Next.js] node.js ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ๊ณผ heap ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ ์šฉํ•˜๊ธฐ node.js ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ๊ณผ heap ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ ์šฉํ•˜๊ธฐํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” next.js์—์„œ server๋ฅผ ์ปค์Šคํ…€ ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ GPT์˜ ๋„์›€์„ ๋ฐ›์•„ process.memoryUsage()๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. 1. process.memoryUsage์˜ ์ค‘์š” ์š”์†ŒNode.js(Next.js) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ธ์‚ฌ์ดํŠธ / if(kakaoAI)2024ํ•ด๋‹น ์ปจํผ๋Ÿฐ์Šค ๋‚ด์šฉ์ด ๋‚ด๊ฐ€ ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ๋…์ ์ธ ๋ถ€๋ถ„์„ ๋‹ค๋ค„์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค. 1-1. ์ฝ”๋“œ ์ ์šฉ// server.jsconst { createServer } = require('http');const { parse } = require('url');.. 2024. 12. 23.
[Next.js] Next.js์˜ ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ตฌ์กฐ - node.js v8 Next.js์˜ ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ตฌ์กฐNext.js๋Š” Node.js ๊ธฐ๋ฐ˜์˜ V8 ์—”์ง„์—์„œ ์‹คํ–‰๋œ๋‹ค.JavaScript๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ด๋‹ค. ๋”ฐ๋ผ์„œ V8 ์—ญ์‹œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Context ๋‹น ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹จ, ์„œ๋น„์Šค ์›Œ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์›Œ์ปค์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฆ์‹ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์€ V8 ํ”„๋กœ์„ธ์Šค์—์„œ ํ• ๋‹น๋œ ์ผ์ •๋Ÿ‰์˜ ๋ฉ”๋ชจ๋ฆฌ๋กœ ํ‘œํ˜„๋˜๋Š”๋ฐ, ์ด๋ฅผ Resident set์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™๋‹ค.์‚ฌ์ง„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํฌ๊ฒŒ ํž™ ๋ฉ”๋ชจ๋ฆฌ์™€ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ด€๋ฆฌ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.1๏ธโƒฃ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์Šคํƒ์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๊ณ  V8๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์Šคํƒ์„ ๊ฐ€์ง„๋‹ค. ์Šคํƒ์—๋Š” ์ •์ ๋ฐ์ดํ„ฐ(๋ฉ”์„œ๋“œ์™€ ํ•จ์ˆ˜ ํ”„๋ ˆ์ž„, ์›์‹œ ๊ฐ’, ๊ฐ์ฒด ํฌ์ธํ„ฐ)๊ฐ€ ์ €์žฅ๋œ๋‹ค.V8์˜ ์Šคํƒ ์˜์—ญ์˜ ๊ด€๋ฆฌ๋Š”.. 2024. 12. 22.
[Next.js] SWC ์˜ต์…˜์„ ํ™œ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•ํ•˜๊ธฐ SWC๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•ํ•˜๊ธฐ ์‚ฌ๋‚ด์—์„œ๋Š” CI/CD ๋„๊ตฌ๋กœ ๊นƒํ—™ ์•ก์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.๋ฐฑ์—”๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ ํ”„๋ก ํŠธ๋Š” ์•ก์…˜์ด ์™„๋ฃŒ๋˜๋Š”๋ฐ ๊นŒ์ง€ ์ „์ฒด์ ์ธ ์‹œ๊ฐ„์ด ์ข€ ๋” ์†Œ์š”๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” ํ”„๋ก ํŠธ ํ™˜๊ฒฝ์—์„œ CI/CD ๊ณผ์ • ์ค‘ ๊ฐ€์žฅ ์†Œ์š” ์‹œ๊ฐ„์ด ๊ธด ์Šคํƒญ์€ ๋นŒ๋“œ ํ›„ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด ECR๋กœ ์˜ฎ๊ธฐ๋Š” ์‹œ์ ์ด๋‹ค. ๊ทธ ์ค‘ CI ๊ณผ์ • ์ค‘์—์„œ ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์‹œ๊ฐ„๊ณผ ECR PUSH ํƒ€์ž„์ด ๋Œ€๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•จ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. โ“๊ทธ๋ ‡๋‹ค๋ฉด,ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์–ด๋–ป๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ? Next.js ๋นŒ๋“œ ์‹œ๊ฐ„์„ ๋‹จ์ถ• ํ•˜๋Š” ๋ฐฉ๋ฒ•SWC ์ฝ”๋“œ ์••์ถ• ํ™œ์„ฑํ™”: swcMinify: true๋ฅผ ์„ค์ •ํ•ด ๋นŒ๋“œ ์‹œ SWC๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•˜์—ฌ ์ตœ์ ํ™”.Webpack ์บ์‹ฑ ์‚ฌ์šฉ: W.. 2024. 11. 1.
[JavaScript] ๋งˆ์šฐ์Šค ๋ฐ ํœ  ์ด๋ฒคํŠธ (onMouseEnter, onMouseLeave, onWheel) [JavaScript] ๋งˆ์šฐ์Šค ๋ฐ ํœ  ์ด๋ฒคํŠธ (onMouseEnter, onMouseLeave, onWheel)ํšŒ์‚ฌ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ ํ•˜๋ฉด์„œ ํšŒ์‚ฌ ์ž์ฒด ์ปดํฌ๋„ŒํŠธ ํˆดํŒ ์ŠคํŽ™๋•Œ๋ฌธ์—,๋งˆ์šฐ์Šค๊ฐ€ ํ…์ŠคํŠธ ์œ„์— ์กด์žฌ ํ•˜์ง€ ์•Š์Œ์—๋„ ํœ  ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ํˆดํŒ์ด ๊ณ„์† ๋– ์žˆ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๊ทธ๋ž˜์„œ tooltip์ด ๋– ์•ผ ํ•˜๋Š” ํ…์ŠคํŠธ์— onMouseEnter, onMouseLeave, onWheel ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. onMouseEnter ์ด๋ฒคํŠธonMouseEnter ์ด๋ฒคํŠธ๋Š” ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ๊ฐ€ ํŠน์ • ์š”์†Œ์— ์ฒ˜์Œ์œผ๋กœ ๋“ค์–ด๊ฐ”์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ.์ด ์ด๋ฒคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์šฐ์Šค๋ฅผ ์š”์†Œ ์œ„๋กœ ์ด๋™์‹œํ‚ฌ ๋•Œ ํŠธ๋ฆฌ๊ฑฐ ๋œ๋‹ค.onMouseEnter๋Š” ํ•ด๋‹น ์š”์†Œ์˜ ์ž์‹ ์š”์†Œ์—๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ „ํŒŒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ .. 2024. 5. 20.
[JavaScript] ํŒ์—… ์ฐฝ ๊ตฌํ˜„ - window.open [JavaScript] ํŒ์—… ์ฐฝ ๊ตฌํ˜„ - window.openํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐํš ๋ช…์„ธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋…๋ฆฝ๋œ ํŒ์—… ์ฐฝ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค.JavaScript์˜ window.open ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒ์—…์ฐฝ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. window.open ๋ฉ”์„œ๋“œ์ƒˆ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์ด๋‚˜ ํƒญ์„ ์—ด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œwindow.open(url, windowName, [windowFeatures]);- url : ํŒ์—… ์ฐฝ์— ๋กœ๋“œํ•  ํŽ˜์ด์ง€ URL- windowName :  ํŒ์—… ์ฐฝ์˜ ์ด๋ฆ„. ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ฐฝ์ด ์ด๋ฏธ ์—ด๋ ค์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ฐฝ์„ ์žฌ์‚ฌ์šฉ.- windowFeatures : ํŒ์—… ์ฐฝ์˜ ํŠน์„ฑ์„ ์ •์˜ํ•˜๋Š” ๋ฌธ์ž์—ด. ์ฝ”๋“œ ์˜ˆ์‹œ์•ฝ๊ด€ ๋ณด๊ธฐ Reference Window: open() method - Web APIs | MDNThe open() m.. 2024. 5. 20.
SQLD(๊ตญ๊ฐ€ ๊ณต์ธ SQL ๊ฐœ๋ฐœ์ž) - ๋น„์ „๊ณต์ž ํ•ฉ๊ฒฉ ํ›„๊ธฐ SQLD(๊ตญ๊ฐ€ ๊ณต์ธ SQL ๊ฐœ๋ฐœ์ž) - ๋น„์ „๊ณต์ž ํ•ฉ๊ฒฉ ํ›„๊ธฐ ์•ฝ ํ•œ๋‹ฌ์ „์ธ 2023๋…„ 6์›” 10์ผ์— 49ํšŒ sqld๋ฅผ ์น˜๋ค˜๋‹ค. ์‹œํ—˜์€ ๋ง‰์ƒ ์‹ ์ฒญํ•ด๋‘์—ˆ์ง€๋งŒ ํšŒ์‚ฌ์ผ์ด ๊ฐ‘์ž๊ธฐ ๋ฐ”๋น ์ง€๋ฉด์„œ ์žฆ์€ ์•ผ๊ทผ์œผ๋กœ ๊ณต๋ถ€ํ•  ์‹œ๊ฐ„์ด ์ ˆ๋Œ€์ ์œผ๋กœ ๋ถ€์กฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ํ‡ด๊ทผํ›„ ๊ณต๋ถ€ํ•ด๋ณด๋ ค ํ–ˆ์œผ๋‚˜ ๊ฑฐ์˜ ํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ์‹œํ—˜ ์ „์ฃผ ํ† ์š”์ผ์— ํ•˜๋ฃจ ๊ณต๋ถ€ํ•˜๊ณ  ์‹œํ—˜ ์ „๋‚  ํšŒ์‚ฌ ์—…๋ฌด๋ฅผ ์‰ด ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๊ทธ ๋‚  ๋ฐค์ƒˆ์„œ ๋…ธ๋ž€์ฑ… 2ํšŒ๋…ํ•˜๊ณ  ๊ฐ€์„œ ์‹œํ—˜์„ ๋ณด์•˜๋‹ค. sqld ์‹œํ—˜ ์ •๋ณด SQLD 1๊ณผ๋ชฉ - ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์˜ ์ดํ•ด 10๋ฌธ์ œ 2๊ณผ๋ชฉ - SQL ๊ธฐ๋ณธ ๋ฐ ํ™œ์šฉ 40๋ฌธ์ œ ๋ฌธํ•ญ๋ณ„ ์ ์ˆ˜ - 2์  ๊ณผ๋ฝ ๊ธฐ์ค€ - ๊ณผ๋ชฉ๋ณ„ 40% ๋ฏธ๋งŒ ํ•ฉ๊ฒฉ ๊ธฐ์ค€ - 60์  ์ด์ƒ ์‹œํ—˜์‹œ๊ฐ„ - 90๋ถ„ ๊ธฐ๋ณธ ๋ฒ ์ด์Šค ๋น„์ „๊ณต์ž(์˜์ƒ๋ช…๊ณผํ•™์ „๊ณต), ์ž‘๋…„์— SSAFY๊ต์œก ๋ฐ›์œผ๋ฉฐ SQL๋ฌธ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ์ž‘์„ฑ.. 2023. 7. 1.
[Test Code] queryByText, findByText, getByText queryByText, findByText, getByText์˜ ์ฐจ์ด์  getByText, findByText, queryByText๋Š” ๋ชจ๋‘ react-testing-library ํŒจํ‚ค์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ํŠน์ • ํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ ํ•จ์ˆ˜๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘๊ณผ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. getByText: ๋™๊ธฐ์ ์œผ๋กœ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํŠน์ • ํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ์ฐพ์œผ๋ฉด ํ•ด๋‹น ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋œ ํ›„์— ํŠน์ • ์š”์†Œ๋ฅผ ์ฆ‰์‹œ ์ฐพ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์š”์†Œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. import { render, screen } from '@testing-library/react'.. 2023. 6. 29.
[Test Code] Error: Not implemented: HTMLCanvasElement.prototype.getContext (without installing the canvas npm package) ์›์ธ Error: Not implemented: HTMLCanvasElement.prototype.getContext ์˜ค๋ฅ˜๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ getContext ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ๋Œ€๊ฐœ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์บ”๋ฒ„์Šค์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์‹ค์ œ๋กœ ์บ”๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜’๊ถ๊ธˆ์ฆ context ๋ผ๋Š” ๊ฒƒ์ด react์˜ context๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€? HTMLCanvasElement.prototype.getContext ๋ฉ”์„œ๋“œ์˜ "context"๋ฅผ ์˜๋ฏธ HTMLCanvasElement.prototype.getContext ๋ฉ”์„œ๋“œ๋Š” HTML ์บ”๋ฒ„์Šค ์š”์†Œ์˜ ๊ทธ๋ฆฌ๊ธฐ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ ์ด ๋ฉ”์„œ๋“œ๋Š” ์บ”๋ฒ„.. 2023. 6. 29.