๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๋ญ๋“ ์ง€ ๋ฌผ์–ด๋ณด๋Š” DUGE ๊ฐœ๋ฐœํ›„๊ธฐ

๋ชจ๋นˆ์ผˆยท2023๋…„ 1์›” 5์ผ
45
post-thumbnail

๐Ÿง DUGE? ๋ฌด์Šจ ์„œ๋น„์Šค๋ƒ?

AMA(Ask Me Anything)์€ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•˜์ž๋ฉด '๋ฌด์—‡์ด๋“  ๋ฌผ์–ด ๋ณด์„ธ์š”'์ •๋„ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ๊ตญ์—์„œ๋Š” ์ธ์Šคํƒ€๊ทธ๋žจ์—์„œ '๋ฌด๋ฌผ'์ด๋ผ๊ณ  ์ค„์—ฌ์„œ ์ธํ”Œ๋ฃจ์–ธ์„œ๋“ค์ด ์ง„ํ–‰ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. DUGE๋Š” ์ด๋Ÿฐ ์ต๋ช… Q&A๋ฅผ ๋„์™€์ฃผ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ ํฌ์ŠคํŠธ๋ฅผ ์“ฐ๊ธฐ ์ „์— ์ €์˜ DUGE ์ŠคํŽ˜์ด์Šค๋ฅผ ์ œ ํ”„๋กœํ•„ ๋งํฌ์— ๋„ฃ์–ด ๋‘์—ˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์•„์…จ๋Š”์ง€ ๋ช‡๋ช‡ ๋ถ„๋“ค์ด ๊ฐ€์ž…ํ•ด์„œ ์งˆ๋ฌธ๋„ ๋‚จ๊ฒจ ์ฃผ์‹œ๋”๊ตฐ์š”.

๋Œ€ํ‘œ์ ์œผ๋กœ ๋นŒ ๊ฒŒ์ด์ธ ๊ฐ€ ๋ ˆ๋”ง์—์„œ AMA๋ฅผ ์ง„ํ–‰ ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ์ •๋ง ํฐ ํ™”์ œ์˜€๋Š”๋ฐ ๋นŒ ๊ฒŒ์ด์ธ ๋Š” ์ตœ๊ทผ์—๋„ ๋ ˆ๋”ง์—์„œ ๊ฐ€๋”์”ฉ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‹ฌ์•„์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋นŒ ๊ฒŒ์ด์ธ ๋Š” ์ด๋Ÿฐ AMA ์„ธ์…˜์„ ๋ฒŒ์จ 10๋ฒˆ์งธ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ๐Ÿ“Ž ๋ ˆ๋”ง์œผ๋กœ ๊ฐ€์„œ ์‚ดํŽด๋ณด๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ AMA๋ฅผ ์ง„ํ–‰ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€ ์ค„ ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋Š” ์—†์„๊นŒ์š”? ๋น„์Šทํ•˜๊ฒŒ ํŠธ์œ„ํ„ฐ ์œ ์ €๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ณธ์˜ ๐Ÿ“Ž peing์ด๋ผ๋Š” ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฆ์€ ๊ด‘๊ณ ์™€ ๋‹ค์†Œ ์ง๊ด€์„ฑ์ด ๋–จ์–ด์ง€๋Š” UI๋กœ ์‚ฌ์šฉ์— ๋ถˆํŽธํ•จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฒŒ ๋”ฑ ๋งž๋Š” AMA ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด ์—ญ์‹œ ๊ฐœ๋ฐœ์ž๋Š” ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ์ฃ .

DUGE์—์„œ๋Š” ๋ˆ„๊ตฌ๋‚˜ ์ต๋ช…์œผ๋กœ ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์งˆ๋ฌธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜, DUGE๋Š” ์ œ ์ฒซ ํ”„๋ก ํŠธ ์—”๋“œ ๊ฐœ๋ฐœ์ž…๋‹ˆ๋‹ค. Nuxt3๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ ๋ฐฑ ์—”๋“œ ๊ฐœ๋ฐœ๋งŒ ํ•ด ์˜จ ๋ชจ๋นˆ์ผˆ์—๊ฒŒ๋Š” ์–ด๋ ค์šด ์ผ์ด์—ˆ์ง€๋งŒ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์—๊ฒŒ ๋„์›€์„ ๋ฐ›์•„๊ฐ€๋ฉฐ ์ด๋ ‡๊ฒŒ ์„œ๋น„์Šค๋ฅผ ๊ณต๊ฐœํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

๐ŸŒณ ๊ด‘๊ณ  ์—†์Œ

๋”์ง€์—๋Š” ๊ทธ ์–ด๋–ค ๊ด‘๊ณ ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ์ตœ๋Œ€ํ•œ ๊ด‘๊ณ ๋ฅผ ํ”ผํ•˜๊ณ  ์ˆ˜์ต์„ ๋„๋ชจ ํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ด‘๊ณ  ์—†์ด ์พŒ์ ํ•˜๊ฒŒ DUGE ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ ธ ๋ณด์„ธ์š”.

๐Ÿ‘ป ์™„์ „ํ•œ ์ต๋ช…

DUGE์—์„  ์ต๋ช…์œผ๋กœ ์งˆ๋ฌธํ•˜๋ฉด ์•„๋ฌด๋„ ๋‚ด๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. DUGE์˜ ์งˆ๋ฌธ/๋‹ต๋ณ€ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ํ•ด์™ธ(๋ฌป์ง€๋งˆ) ์„œ๋ฒ„์— ์ €์žฅ ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Ÿฐ ์ต๋ช… AMA ์„œ๋น„์Šค๋“ค์ด ๊ทธ๊ฐ„ ์ˆฑํ•˜๊ฒŒ ๊ฒช์–ด์˜จ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋งŒํผ ์ต๋ช…์„ ์•…์šฉํ•œ ์งˆ๋ฌธ์€ ์ŠคํŽ˜์ด์Šค ์ฃผ์ธ์ด ์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒš ๋ฉ‹์ง„ UI

์ œ DUGE๊ฐ€ ๋‹ค๋ฅธ AMA ์„œ๋น„์Šค๋ณด๋‹ค ํ™•์‹คํžˆ ๋” ์˜ˆ์ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋Œ€ ์†Œ์…œ ์„œ๋น„์Šค์˜ ๋””์ž์ธ์„ ๋งŽ์ด ์ฐธ๊ณ ํ•˜๊ณ  ์Šค์ผ€์น˜ ์—…์„ ์ง„ํ–‰ ํ•œ ๋’ค์— Tailwind CSS๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Tailwind CSS๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ˆœ์ˆ˜ํ•œ CSS ์ž…๋‹ˆ๋‹ค. ๋‹ค์ด์–ผ๋กœ๊ทธ๋‚˜ ํŒ์—… ๋ฉ”๋‰ด๋Š” ๊ฐ™์€ Tailwind ํŒ€์ด ๋งŒ๋“  HeadlessUI๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๊ฑฐ๋‚˜ ์ € ์ฒ˜๋Ÿผ ์ฒ˜์Œ ํ”„๋ก ํŠธ ์—”๋“œ ๊ธฐ์ˆ ์„ ์ ‘ํ•ด๋ณธ ๊ฐœ๋ฐœ์ž๋„ ์ด๋ ‡๊ฒŒ ๋นจ๋ฆฌ ๊ตฌํ˜„ ํ•ด ๋‚ธ๊ฑธ ๋ณด๋ฉด ์ข‹์€ ๊ธฐ์ˆ ์ž„์— ํ‹€๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค.

๐ŸŒŸ Mr.๋‘๋”์ง€

Mr.๋‘๋”์ง€๋ฅผ ๊ตฌ๋…ํ•˜๋ฉด ๊ฐ€๋”์”ฉ ๋‘๋”์ง€์”จ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์งˆ๋ฌธ์„ ๋‚จ๊น๋‹ˆ๋‹ค. ๋‘๋”์ง€์™€ ๊ต๊ฐ ํ•ด ๋ณด์„ธ์š”.

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์ด์•ผ๊ธฐ

์ด์ œ ํ™๋ณด๋Š” ๋๊ณ  ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ข‹์•„ํ•˜๋Š” ๊ธฐ์ˆ  ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์€ ์ด ์‹œ์ ์—์„œ ๋” ์•ˆ ๋ณด์…”๋„ ๋ฉ๋‹ˆ๋‹ค. ๐ŸŒš

๐Ÿค Vercel, Fly.io

DUGE์˜ ํ”„๋ก ํŠธ์—”๋“œ๋Š” Vercel์—์„œ ์ข‹์€ ๊ฒฝํ—˜์„ ๋ง›๋ณด๊ณ  ๊ณ„์† ์šด์˜์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— velog์— ์†Œ๊ฐœ๋˜๋Š” ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋“ค๋„ Vercel์„ ์‚ฌ์šฉํ•ด ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์„ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ € ์—ญ์‹œ Vercel ๋ฐฐํฌ ๊ฒฝํ—˜์€ ๊ณผ๊ฑฐ Heroku๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. Vercel์€ AWS์˜ ๋ณต์žกํ•œ ์ธํ”„๋ผ ๊ด€๋ฆฌ๋ณด๋‹ค ๊ทธ๋ƒฅ ๋ˆˆ ๊ฐ๊ณ  ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ๊ฐ„๋‹จ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Vercel์ด ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ๊น”๋”ํ–ˆ๋˜ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Nuxt3 ํ™˜๊ฒฝ์—์„œ 504 FUNCTION_INVOCATION_TIMEOUT์ด ์ง€์†์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Next3์—์„œ๋„ ๋™์ผํ•œ ์ฆ์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ๋ก€๋ฅผ ๋งŽ์ด ์ฐพ์•„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ํ˜„์žฌ๊นŒ์ง€ ๋พฐ์กฑํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ์ด๋Ÿฐ ๊ฐ„ํ—์ ์ธ GATEWAY TIMEOUT์„ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ ค ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ์ธ Hobby Plan ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ๋ฃŒ ํ”Œ๋žœ์—์„œ๋„ ๋ฐœ์ƒํ•˜๋ฉฐ Region์— ๊ด€๊ณ„ ์—†์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

DUGE์˜ ๋ฐฑ์—”๋“œ๋Š” Fly.io์— ๋ฐฐํฌ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Fly.io๋Š” ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ ๋„˜์–ด ์•„์˜ˆ DB์™€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉ์ž์™€ ๊ฐ€๊นŒ์šด region์— ๋ชจ๋‘ ๋ฐฐํฌ ํ•ด ๋‘๋Š” Edge Cloud Computing์„ ์ œ์‹œํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๊ณผ์—ฐ ์–ด๋–จ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์•„์‰ฝ๊ฒŒ๋„ Fly.io๋Š” ์•„์ง ์„œ์šธ ๋ฆฌ์ „์„ ์ง€์›ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

fly.io๋Š” Vercel ๋ณด๋‹ค ๋” ๋ถˆ์•ˆ์ • ํ•ด ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ด ๋‹จ์ ์ž…๋‹ˆ๋‹ค. https://status.flyio.net ์—์„œ ํ™•์ธ ํ•ด ๋ณด๋ฉด ๊ทธ ๋™์•ˆ fly.io์˜ ์žฅ์•  ์ผ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DUGE๋ฅผ ๊ฐœ๋ฐœ ํ•˜๋Š” ์ค‘์—๋„ ์ •๋ง ์ค‘์š”ํ•œ ์ˆœ๊ฐ„์— ํŠน์ • ๋ฆฌ์ „์˜ Deployment ์žฅ์• ๊ฐ€ ๋‚˜์„œ ๊ธธ๊ฒŒ๋Š” 12์‹œ๊ฐ„ ๋™์•ˆ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ๋˜ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Heroku๊ฐ€ ๋ฌด๋ฃŒ ์ธ์Šคํ„ด์Šค๋“ค์„ ์ข…๋ฃŒํ•˜๋ฉด์„œ ๋Œ€์•ˆ์œผ๋กœ ๋– ์˜ค๋ฅธ๊ฒƒ์ด fly.io ์˜€์Šต๋‹ˆ๋‹ค. ๊ต‰์žฅํžˆ ์ฃผ๋ชฉ ๋ฐ›๋Š” ํด๋ผ์šฐ๋“œ ์Šคํƒ€ํŠธ์—…์ด์ง€๋งŒ ์—ฌ๋Ÿฌ ๋ฆฌ์ „์—์„œ ๋™์‹œ ๋‹ค๋ฐœ์ ์œผ๋กœ ์žฅ์• ๊ฐ€ ๋Š์ด์งˆ ์•Š๊ณ  ์žˆ์–ด ์‹ค์ œ ์„œ๋น„์Šค ์šด์˜์—๋Š” ์ฐธ๊ณ  ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” BoltDB ๊ฐœ๋ฐœ์ž ๋ฒค ์กด์Šจ์ด Fly.io์—์„œ ์ด์ œ Full-time์œผ๋กœ SQLite์˜ ํด๋ผ์šฐ๋“œํ™” ๊ฐœ๋ฐœ์— ๋ฐ•์ฐจ๋ฅผ ๊ฐ€ํ–ˆ๋‹ค๋Š” ์†Œ์‹์„ ๋ณด๋ฉด ์•ž์œผ๋กœ๊ฐ€ ๊ธฐ๋Œ€๋˜๋Š” ์Šคํƒ€ํŠธ์—…์ž…๋‹ˆ๋‹ค.

๐Ÿ“Ž I'm All-In on Server-Side SQLite.

๋•Œ๋ฌธ์— DUGE๋„ ์ด๊ฑธ ๋ฏฟ๊ณ  ํ•œ ๋ฒˆ ์ธํ”„๋ผ๋ฅผ Fly.io์— ๊ฑธ์–ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŒš ๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” Vercel๋„ Fly.io๋„ ์•„์ง์€ ์šด์˜ ์žฅ์• ๋ฅผ ๋งŽ์ด ๊ฒช๊ณ  ์žˆ์–ด ์‹ค์ œ ์„œ๋น„์Šค ์šด์˜์—๋Š” ํฐ ์–ด๋ ค์›€๋“ค์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋„ˆ๋ฌด๋‚˜๋„ ํŽธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋‘ ์„œ๋น„์Šค๊ฐ€ ์ œ๋ฐœ ์„ฑ๊ณต ํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๋„ค์š”.

๐Ÿ“˜ Vercel FUNCTION_INVOCATION_TIMEOUT ๊ด€๋ จํ•ด์„œ ๋” ์ฝ์–ด ๋ณผ ๊ฑฐ๋ฆฌ

https://velog.io/@dishate/Vercel-504-timeout-์—๋Ÿฌ
https://www.reddit.com/r/nextjs/comments/zfjwck/all_my_nextjs_api_handlers_return_504_timeout/
https://medium.com/@scott82anderson/avoid-cold-starts-on-vercel-with-next-ssr-7b28fbc38bcc
https://github.com/orgs/vercel/discussions/334

๐Ÿค” ๋Œ€์ฒด ์™œ TIMEOUT์ธ๊ฐ€
AWA Lambda์˜ Cold Start ์˜ํ–ฅ์ด ์žˆ๋‹ค๊ฑฐ๋‚˜ Region ๊ฑฐ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋ฉ€์–ด์„œ ๊ทธ๋ ‡๋‹ค๋Š” ๋“ฑ์˜ ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Vercel์€ 10์ดˆ ์˜ ํƒ€์ž„์•„์›ƒ์„ ์ฃผ๊ณ  ์žˆ๊ณ  ์•„๋ฌด๋ฆฌ Region ๊ฑฐ๋ฆฌ ์ฐจ์ด์™€ DB ์‘๋‹ต ์‹œ๊ฐ„์ด ๋Š๋ฆฌ๋‹ค๊ณ  ํ•ด๋„ 10์ดˆ ์ด์ƒ์˜ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์ง„ ์•Š์€๋ฐ ์ด ๋ฌธ์ œ๋Š” ์•ž์œผ๋กœ ๊ณ„์† ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์ง€์ผœ๋ด์•ผ ํ• ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ” SQLite

DUGE์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ SQLite๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. MySQL์ด๋‚˜ PostGres๋Š” ์‚ฌ์น˜๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„ ์กŒ์„ ๋•Œ ํŠœ๋‹ํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๋Š๋ฆฌ์ง€ ์•Š๊ฒ ๋ƒ๋Š” ๋ฐ˜๋ฌธ์„ ๋งค์šฐ ๋งŽ์ด ๋ฐ›์•„ ์™”์—ˆ๋Š”๋ฐ ๊ทธ '๋Š๋ฆฌ๋‹ค'๋Š” ํŽธ๊ฒฌ์„ ๊นจ ๋ณด๊ณ  ์‹ถ๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ JOIN์€ '๋Š๋ฆฌ๋‹ค'๋ผ๊ณ  ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ ์‹ค์€ ๊ทธ๋ ‡์ง€๊ฐ€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  JOIN์ด ์—†๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋” ๋น ๋ฅด๊ธฐ์•ผ ํ•˜๊ฒ ์ง€๋งŒ ์ƒ๊ฐ๋งŒํผ JOIN์ด ๋Š๋ฆฌ์ง€๊ฐ€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ์กฐ์ง์—์„œ ์ผ ํ•  ๋•Œ JOIN์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๋งค์šฐ ์‹ซ์–ดํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ํ•œ ๊ฐ€์ง€ ์‹คํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. 2~3์–ต๊ฑด ์ •๋„ ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์ œ๋กœ ์„œ๋น„์Šค ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ณด๋‹ค 20๋ฐฐ๋‚˜ ๋งŽ์€ ์–‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ดˆ๋‹น 10๊ฑด์˜ JOIN, COUNT ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š” ์‹คํ—˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” 10ms ๋‚ด์™ธ์˜ ์‘๋‹ต ์†๋„๋ฅผ ๋ณด์—ฌ ์คฌ์Šต๋‹ˆ๋‹ค. Hash JOIN์€ ์ด๋ก ์ƒ ๋ณต์žก๋„๊ฐ€ O(1)์ด๋ฏ€๋กœ ์–ด์ฉŒ๋ฉด ๋‹น์—ฐํ•œ ๊ฒฐ๊ณผ์˜€์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค JOIN ๋ณด๋‹ค๋Š” COUNT๊ฐ€ ๋ฌธ์ œ์˜€๋Š”๋ฐ์š” row๋ฅผ ์„ธ๋Š” ๊ฒƒ์€ ์ •์งํ•˜๊ฒŒ Fetch๋ฅผ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์„ธ์–ด์•ผ ํ•  row๊ฐ€ ์•ฝ 1๋งŒ๊ฐœ๋งŒ ๋„˜์–ด๊ฐ€๋„ 1000ms ๊ฐ€๊นŒ์ด ๋Š๋ ค์กŒ์Šต๋‹ˆ๋‹ค.

โš ๏ธ ์œ„ ์‹คํ—˜์€ AWS R ์‹œ๋ฆฌ์ฆˆ ์ธ์Šคํ„ด์Šค ์ค‘์—์„œ ์ œ์ผ ์‹ผ ๊ฑธ๋กœ ์ง„ํ–‰ ๋์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ๊ตฌ์ฒด์ ์ธ ์‹คํ—˜ ๋ฐฉ๋ฒ•๊ณผ ๋ฐ์ดํ„ฐ, ๊ทธ๋ฆฌ๊ณ  ๋””์Šคํฌ I/O๋Š” ๋” ์ด์ƒ Bottleneck์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ทผ๊ฑฐ๋กœ ๊ธ€์„ ๋”ฐ๋กœ ์จ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ƒ๊ฐ ์ด์ƒ์œผ๋กœ ํ˜„์žฌ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ค์€ ์ตœ์ ํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๊ณ  ์ฟผ๋ฆฌ๋งŒ ์ž˜ ์ž‘์„ฑํ•œ๋‹ค๋ฉด JOIN ํ•˜๋”๋ผ๋„ ์ˆ˜ ์–ต๊ฑด ์ด์ƒ์˜, ์–ด์ง€๊ฐ„ํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋Š” ์†Œํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜ ๋งŽ์€ ๊ธฐ์—…๋“ค์ด ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ์— '๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฒฝํ—˜'์„ ์š”๊ฑด์œผ๋กœ ๋‚ด์„ธ์šฐ์ง€๋งŒ ์‹ค์ œ๋กœ ๊ทธ๋Ÿฐ ๊ฒฝํ—˜์„ ํ•˜๊ธฐ๋Š” ๋งค์šฐ ์–ด๋ ค์šด ์ด์œ  ์ค‘ ํ•˜๋‚˜ ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์ˆ˜์–ต ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ๊ณ„์—์„œ ์„ฑ๋Šฅ ํŠœ๋‹์ด ํ•„์š”ํ•œ ์ˆœ๊ฐ„์„ ๋งˆ์ฃผํ•˜๋ ค๋ฉด ํ•œ ํ…Œ์ด๋ธ”์˜ row๋งŒ ์ˆ˜์‹ญ์–ต, ์ˆ˜๋ฐฑ์–ต ๋‹จ์œ„๊ฐ€ ๋ผ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋นต๋นตํ•œ AWS ์ธ์Šคํ„ด์Šค๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ๋’ค ๋ˆˆ ๊ฐ๊ณ  ์žŠ์–ด ๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์œผ๋‹ˆ๊นŒ์š”.

๊ทธ๋ž˜์„œ ์ €๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์Šคํƒ€ํŠธ์—…๋“ค์€ ์‹ฑ๊ธ€ ์ธ์Šคํ„ด์Šค์˜ DB๋กœ๋„ ๋ชจ๋“  ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ ํ•  ์ˆ˜ ์žˆ์œผ๋ฆฌ๋ผ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์ด๋ ‡๊ฒŒ ํŠผํŠผํ•œ SQLite๋ฅผ DUGE๋„ ์“ฐ๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณผ์—ฐ ์ œ ์ƒ๊ฐ์ด ๋งž์„์ง€๋Š” DUGE ์‚ฌ์šฉ์ž๊ฐ€ 1์–ต๋ช…์ด ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋ฐํ˜€ ์งˆ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๐ŸŒš ์•„๋‹ˆ๋ฉด ๊ทธ ๋•Œ ๊ฐ€์„œ ์ƒ๊ฐ ํ•ด ๋ณด๊ณ ์š”.

SQLite๋ฅผ ์ฃผ๋ ฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•œ ์ด์•ผ๊ธฐ๋“ค์€ ์•„๋ž˜์—์„œ ์ข€ ๋” ๋งŒ๋‚˜ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ“Ž Ask HN: Have you used SQLite as a primary database?

โ˜๏ธ Vultr, Cloudflare

Vultr๋Š” Vercel๊ณผ ์ด๋ฆ„์ด ๋น„์Šทํ•ด ์ฒ˜์Œ์—๋Š” ํ—ท๊ฐˆ๋ ท๋Š”๋ฐ Vultr๋Š” ๊ด€๋ฆฌํ˜•์ด ์•„๋‹ˆ๋ผ Digital Ocean ์ฒ˜๋Ÿผ ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ฌ๋ฆฌ๋Š” ํ˜•ํƒœ์˜ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๊ตญ๋‚ด์—๋Š” ์•„์ง ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์€๋ฐ ์„œ์šธ ๋ฆฌ์ „๋„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ฌ๋ ค์„œ ์‚ฌ์šฉ ํ•ด์•ผ ํ•  ์ผ์ด ์žˆ์„ ๋•Œ๋Š” AWS EC2 ๋ณด๋‹ค๋Š” Digital Ocean์„ ์จ ์™”์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” Vultr๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ํ•œ ๋ฒˆ ๊ฐ€์„œ ๊ตฌ๊ฒฝ ํ•ด ๋ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ“Ž https://www.vultr.com

Cloudflare๋Š” ์‚ฌ์‹ค์ƒ์˜ ๋ฌด๋ฃŒ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋…„์— R2๋ผ๋Š” ์ƒˆ๋กœ์šด ์Šคํ† ๋ฆฌ์ง€ R2 ๊ณต๊ฐœ ํ–ˆ๋Š”๋ฐ ์ด๊ฒƒ์€ AWS์˜ S3 API์™€ ํ˜ธํ™˜๋˜๋Š” ์Šคํ† ๋ฆฌ์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ R2๋Š” Egress ๋น„์šฉ ๋ฌด๋ฃŒ ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋œป์€ ๊ทธ๋ƒฅ ์ˆ˜์‹ญ๋งŒ๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด๋„ ๋•ก์ „ ํ•œ ํ‘ผ ๋‚ด์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒ๋‹ˆ๋‹ค. ๋Œ€์ฒด ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅ ํ•œ ๊ฑธ๊นŒ.

๐Ÿ“Ž Cloudflare R2 ์ถœ์‹œ โ€” ์†ก์‹  ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ์—†๋Š” ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ๊ฐœ์ฒด ์Šคํ† ๋ฆฌ์ง€

Cloudflare๋Š” AWS๊ฐ€ Egress ๋น„์šฉ์„ ๋„ˆ๋ฌด ๊ณผ๋‹ค ์ฒญ๊ตฌ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ƒ๋Š” ํฌ์ŠคํŒ…์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค. AWS์˜ ๋น„์šฉ์€ '์–ด์ฒ˜๊ตฌ๋‹ˆ ์—†๋‹ค (Egregious)'๋ผ๊ณ  ๋‹ค์†Œ ๊ฐ•ํ•˜๊ฒŒ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ ๋ชจ๋นˆ์ผˆ ์ฒ˜๋Ÿผ์š”. ๐Ÿ“Ž AWSโ€™s Egregious Egress

๊ทธ๋ž˜์„œ ์ž์‹ ๋“ค์˜ ๋ง‰๊ฐ•ํ•œ ์ธํ”„๋ผ์™€ AWS์˜ ๋ง‰๊ฐ•ํ•œ ์Šคํ† ๋ฆฌ์ง€ ๊ทœ๋ชจ๋ผ๋Š” ์žฅ์ ์„ ๊ฒฐํ•ฉํ•ด์„œ R2๋ผ๋Š” ์ œํ’ˆ์„ ๋งŒ๋“ค์–ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. R2 ๋งŒํผ์€ ์Šคํƒ€ํŠธ์—…์—๊ฒŒ ์ •๋ง ํ•„์š”ํ•œ ์ œํ’ˆ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์›ฌ๋งŒํผ ์„ฑ์žฅํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์Šคํ† ๋ฆฌ์ง€์™€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ธฐ์— DUGE ์—ญ์‹œ R2๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒช๏ธ TailwindCSS

์–ด๋–ค ๋ธ”๋กœ๊ฑฐ๋Š” Tailwind์˜ ๋‹จ์ ์œผ๋กœ ๋ชป์ƒ๊ธด ์ฝ”๋“œ๋‚˜ JS๋ฅผ ์“ธ ์ˆ˜ ์—†๋‹ค๊ฑฐ๋‚˜ CSS์ฝ”๋“œ์™€ HTML์ด ๋ถ„๋ฆฌ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ ์„ ๊ผฝ์ง€๋งŒ Tailwind์˜ ์ฒ ํ•™์„ ์ž˜ ์ฝ์–ด๋ณด๋ฉด ์™œ ์ด๋Ÿฐ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ Tailwind๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” CSS๋ฅผ ํŽธํ•˜๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๊ณ  ์‹ถ์–ด ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธด CSS ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค HTML ํ•˜๋‚˜๋งŒ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ๋” ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Tailwind encourages a utility-first workflow

๐Ÿ“Ž reusing-styles

ํ•˜์ง€๋งŒ ๊ฐ™์€ CSS ์Šคํƒ€์ผ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์ ์šฉ ํ•  ์ผ์ด ๋งŽ์•„์ง€๋ฉด ๊ฒฐ๊ตญ ์•„๋ž˜์™€ ๊ฐ™์€ ์ผ์ด ๋ฒŒ์–ด์ง‘๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ฒฝํ—˜์„ ํ•˜์‹  ๊ฐœ๋ฐœ์ž๋“ค์€ HTML์—์„œ ๋ฐ”๋กœ ์ ์šฉํ•˜๊ธฐ๋Š” ํŽธํ•˜์ง€๋งŒ TailwindCSS๊ฐ€ ์ •๋ง ์ข‹์€๊ฑฐ๋ƒ๋Š” ์˜๋ฌธ์„ ๋˜์ง€๊ณค ํ•ฉ๋‹ˆ๋‹ค.

<div class="mt-3 flex -space-x-2 overflow-hidden">
    <img class="inline-block h-12 w-12 rounded-full ring-2 ring-white" src="https://images.unsplash.com/photo-1491528323818-fdd1faba62cc?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" alt=""/>
    <img class="inline-block h-12 w-12 rounded-full ring-2 ring-white" src="https://images.unsplash.com/photo-1550525811-e5869dd03032?ixlib=rb-1.2.1&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" alt=""/>
    <img class="inline-block h-12 w-12 rounded-full ring-2 ring-white" src="https://images.unsplash.com/photo-1500648767791-00dcc994a43e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2.25&w=256&h=256&q=80" alt=""/>
    <img class="inline-block h-12 w-12 rounded-full ring-2 ring-white" src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" alt=""/>
    <img class="inline-block h-12 w-12 rounded-full ring-2 ring-white" src="https://images.unsplash.com/photo-1517365830460-955ce3ccd263?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" alt=""/>
</div>

Tailwind๋Š” ์–ด์ฐจํ”ผ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ Œ๋”๋ง ๋  ๊ฒƒ์ด๋‹ˆ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•  ์ผ์ด ์—†๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

<div class="mt-3 flex -space-x-2 overflow-hidden">
    {#each contributors as user}
      <img class="inline-block h-12 w-12 rounded-full ring-2 ring-white" src="{user.avatarUrl}" alt="{user.handle}"/>
    {/each}
</div>

When elements are rendered in a loop like this, the actual class list is only written once so thereโ€™s no actual duplication problem to solve.

The biggest maintainability concern when using a utility-first approach is managing commonly repeated utility combinations.

๐Ÿ“Ž maintainability-concerns

์ด๋ ‡๊ฒŒ Utility-First๋ผ๋Š” ๊ด€์ ์œผ๋กœ ํ”„๋ก ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์— ์ ‘๊ทผํ•ด ๋ณด๋‹ˆ ์ข‹์•˜๋‹ค๋Š” ํฌ์ŠคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœํžˆ CSS ์Šคํƒ€์ผ์„ ์ธ๋ผ์ธ์œผ๋กœ ์ ์šฉ ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋ก ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์—์„œ ์–ด๋–ค ํ•˜๋‚˜์˜ '์•„ํ‚คํ…์ณ'๋ผ๊ณ  ์„ค๋ช…ํ•˜๋Š” ํฌ์ŠคํŠธ๋ฅผ ์ฝ์–ด๋ณด๋ฉด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๐Ÿ“Ž No, Utility Classes Arenโ€™t the Same As Inline Styles
๐Ÿ“Ž Building a Scalable CSS Architecture

๐Ÿซฅ ๋

์ €๋Š” ํ”„๋ก ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์„ ํ•ด ๋ณธ ๊ฒฝํ—˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธ€์€ ์—ฌ๊ธฐ๊นŒ์ง€ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐ŸŒš DUGE๋ผ๋Š” ์ฒซ ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๊ฒช์€ ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์— ๊ด€ํ•œ ๊ธ€์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ๋„ ๋„์›€์ด ๋์œผ๋ฉด ์ข‹๊ฒ ๋„ค์š”. ์–ด์„œ ์–ด์„œ ๊ฐ€์ž…ํ•ด์„œ ํ”„๋กœํ•„์— ์ฃผ์†Œ๋ฅผ ๊ฑธ์–ด์ฃผ์„ธ์š”.

๐Ÿ˜ฎ ๋ชจ๋นˆ์ผˆ AMA

๋ชจ๋นˆ์ผˆ ์—ญ์‹œ ๋”์ง€ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“Ž https://duge.space/DOZYHExYNz ์—ฌ๊ธฐ์—์„œ ๋ชจ๋นˆ์ผˆ์—๊ฒŒ ๋ฌด์—‡์ด๋“ ์ง€ ๋ฌผ์–ด ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

๋˜, ํ•œ๊ตญ์˜ ๐Ÿ“Ž producthunt๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ๋””์Šค์ฝฐ์ด์—‡์—๋„ DUGE๋ฅผ ๊ณต์œ  ํ•ด ๋‘์—ˆ์–ด์š”. ๋งŽ์€ ๊ด€์‹ฌ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ“Ž DUGE | Disquiet*

๐Ÿ’ฐ toss๋กœ ์„œํฌํŠธํ•˜๊ธฐ

DUGE์˜ ์ง€์†์  ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์ง€์›ํ•˜๊ณ  ์‹ถ์€ ๋ถ„๋“ค์€ ์ž์œ ๋กญ๊ฒŒ ๋„๋„ค์ด์…˜ ํ•ด ์ฃผ์„ธ์š”. ๊ธฐ๋ถ€ํ•˜์‹  ๋ˆ์€ DUGE ์„œ๋ฒ„๋น„๋กœ ์‚ฌ์šฉ ๋ฉ๋‹ˆ๋‹ค.

profile
๐ŸŒš ๋ฐฉ๋ž‘ ๊ฐœ๋ฐœ์ž, https://duge.space/DOZYHExYNz

33๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 1์›” 5์ผ

๋Œ€ํ‘œ์ ์œผ๋กœ JOIN์€ '๋Š๋ฆฌ๋‹ค'๋ผ๊ณ  ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ ์‹ค์€ ๊ทธ๋ ‡์ง€๊ฐ€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  JOIN์ด ์—†๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋” ๋น ๋ฅด๊ธฐ์•ผ ํ•˜๊ฒ ์ง€๋งŒ ์ƒ๊ฐ๋งŒํผ JOIN์ด ๋Š๋ฆฌ์ง€๊ฐ€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™๊ฐํ•ฉ๋‹ˆ๋‹ค. DB๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ์ƒ๊ฐ๋ณด๋‹จ ๋Š๋ฆฝ๋‹ˆ๋‹ค(?)

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 1์›” 5์ผ

SQLite๊ฐ€ ํŠœ๋‹ํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๋Š๋ฆฌ์ง€ ์•Š๊ฒ ๋ƒ๋Š” ๋ฐ˜๋ฌธํ•˜๋Š” ๋ถ„๋“ค ์ค‘, ์‹ค์ œ๋กœ SQLite๋ฅผ ์“ฐ๋‹ค๊ฐ€ ํŠœ๋‹ํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๋Š๋ ค์„œ MySQL์ด๋‚˜ Postgres๋กœ ๋„˜์–ด๊ฐ„ ๋ถ„์€ ์•„์ง ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. (DBMS์™€๋Š” ๋ณ„๊ฐœ๋กœ) ๊ฒ€์ƒ‰์—”์ง„ํ•˜๋ฉด ๋ฌด์กฐ๊ฑด Elastic Search๋กœ๋งŒ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 1์›” 5์ผ

์žฌ๋ฐŒ๊ฒŒ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค :)
์ด ์„œ๋น„์Šค๊ฐ€ peing์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ธธ ๋ฐ”๋ผ์š”!

๋ฒจ๋กœํผํŠธ์˜ ๋”์ง€ ๋งŒ๋“ค์—ˆ์–ด์š”.
๋ฐฑ์—”๋“œ๋Š” ์–ด๋–ค ์–ธ์–ด๋กœ ๋งŒ๋“œ์‹ ๊ฑด๊ฐ€์š”?

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 1์›” 5์ผ

๋งค์šด๋ง› 6๋‹จ๊ณ„๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ˆœํ•œ๋ง› 15๋‹จ๊ณ„๊ฐ€ ๋˜์—ˆ๋„ค์š”. ์ทจ์ค€ํ•˜์‹œ๋‚˜์š”? ๐Ÿง

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 1์›” 6์ผ

django + sqlite๋Š” ๋ฌด์ ์ด๋‹ค?

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 1์›” 7์ผ

์ž ๊น ์จ๋ณด์•˜๋Š”๋ฐ ์ •๋ง ์†Œ๊ฐœ์ฒ˜๋Ÿผ ๊น”๋” ์Œˆ๋ฐ• ํ•˜๋„ค์š”. ์šฐ์™€.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 1์›” 7์ผ

Q. Tailwind ๊ฐ€ loop ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค๋Š” ๋ฌธ์žฅ์˜ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

6๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 1์›” 11์ผ

์†Œ๊ฐœ๊ธ€์ด ์˜ฌ๋ผ์™”๊ตฐ์š”ใ…‹ใ…‹ ์š”์ƒˆ Mr.๋‘๋”์ง€๋ž‘ ๋Œ€ํ™”ํ•˜๋Š” ์žฌ๋ฏธ์— ๋น ์ ธ์žˆ์Šต๋‹ˆ๋‹ค ์žฌ๋ฐŒ๋Š” ์„œ๋น„์Šค ๋งŒ๋“ค์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ด์š”

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 1์›” 13์ผ

๊ต‰์žฅํžˆ ๊ณต๊ฐ์ด ๋˜๋Š” ๊ธ€์ด๊ตฐ์š”.

์‚ฌ์‹ค DB๋Š” ์ ˆ๋Œ€ ๋Š๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์“ฐ๋Š” ์‚ฌ๋žŒ์ด ๊ดด์ƒํ•˜๊ณ  ์ด์ƒํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์“ฐ๋‹ˆ ๋Š๋ฆฐ ๊ฒƒ์ด์ง€์š”.
DB๋ฅผ ์กฐ๊ธˆ ๋” ์ดํ•ดํ•˜๊ณ  ๊ณต๊ฐ?ํ•œ๋‹ค๋ฉด ์ ˆ๋Œ€ ๋Š๋ฆฌ์ง€ ์•Š์€ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๊ดด์ƒํ•˜๊ฒŒ ์“ฐ์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ๋งŽ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด์ฃ ..

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 1์›” 19์ผ

fly.io๋กœ ๋ฐฐํฌํ•˜์‹ค ๋•Œ ์ง€๊ธˆ๋„ ๋ฌด๋ฃŒ๋กœ ์ด์šฉ์ค‘์ด์‹ ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ์ผ์ • ํŠธ๋ž˜ํ”ฝ ์ด์ƒ ๋ฐœ์ƒํ•˜๋ฉด ๊ธˆ์•ก์ด ์ฒญ๊ตฌ๋˜๋‚˜์š”?

3๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 2์›” 19์ผ

๊ธ€ ์ž˜๋ณด๊ณ  ์žˆ์Šต๋‹ˆ

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2023๋…„ 12์›” 19์ผ

์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2024๋…„ 9์›” 18์ผ

The first time I sat down at a blackjack table in a live casino, the atmosphere was electric. It was completely different from the online games Iโ€™d been playing. The sounds, the tension in the air, the excitement of other players around me โ€“ it all added a layer of intensity I wasnโ€™t expecting. I quickly realized that playing in person https://lucky31casino-fr.com brings a different set of challenges and opportunities. For one, I could read the reactions of other players and the dealer, which made the game more interactive. It wasnโ€™t just me against the cards anymore; it was a social experience where everyoneโ€™s energy influenced the game.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ