๐Ÿ“•review/ํšŒ๊ณ 

[๋ฐ๋ธŒ์ฝ”์Šค] 8์ฃผ์ฐจ ํšŒ๊ณ 

ํ‚ํ‚์ž‰ 2025. 5. 28. 03:35

ํšŒ๊ณ : โญโญโญโญโญ

๊พธ์ค€ํžˆ ์„ฑ์‹คํ•˜์ง„ ์•Š์•˜์ง€๋งŒ ํ™•์‹คํ•˜๊ฒŒ ๋ถˆํƒœ์šฐ๊ณ  ํ•  ๊ฑด ๋‹คํ•ด๋‚ธ ํ•œ ์ฃผ 

 

๐Ÿ‘Liked

ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ๊ฐœ๋ฐœ์„ ์™„๋ฃŒํ–ˆ๋‹ค. ์„ค๊ณ„ + ํด๋” ๊ตฌ์กฐ ๊ณ ๋ฏผ, ํ”„๋ฆฌ์ฆˆ๋งˆ ์•Œ์•„๋ณด๊ธฐ ๋“ฑ์— ์‹œ๊ฐ„์„ ๋„ˆ๋ฌด ๋งŽ์ด ์Ÿ์•„์„œ(์‚ฌ์‹ค ๋ฏธ๋ฃฌ๊ฑฐ์ž„) ์‹ค ๊ฐœ๋ฐœ ์‹œ๊ฐ„์€ 4์ผ ์ •๋„ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

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

 

https://github.com/Monixc/devcoure_todolist

 

GitHub - Monixc/devcoure_todolist

Contribute to Monixc/devcoure_todolist development by creating an account on GitHub.

github.com

์–ด๋–ค ์ƒ๊ฐ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งฐ๋Š”์ง€, ๊ฐœ๋ฐœ ์ค‘ ์–ด๋–ค ๊ณ ๋ฏผ์„ ํ–ˆ๋Š”์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

 

ํด๋” ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

๊ณ„์ธต ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ• ์ง€, ๊ธฐ๋Šฅ ์ค‘์‹ฌ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ํด๋” ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๊ต‰์žฅํžˆ ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ๋‹ค. 

๋ฐฑ์—”๋“œ ์Šคํƒ์€ ๋ฐ๋ธŒ์ฝ”์Šค ์ปค๋ฆฌํ˜๋Ÿผ์— ๋งž๊ฒŒ express๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ, express์˜ "๊ฐ„๋‹จํ•จ" ํŠน์„ฑ์„ ์‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ณ„์ธต ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์กฐ๋ฅผ ์งœ๋Š”๊ฒŒ ๋งž์ง€ ์•Š๋‚˜ ์‹ถ๋‹ค๊ฐ€๋„, ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํŒŒ์•… ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ๋” ์ข‹์ง€ ์•Š์„๊นŒ ์ƒ๊ฐ์ด ๋“ค์–ด ๊ฐˆํŒก์งˆํŒก ํ•˜๋Š”์ค‘

 

๊ด€๋ จ๋œ ๊ธ€๋“ค๋„ ๊ต‰์žฅํžˆ ๋งŽ์ด ์ฝ์–ด๋ณด๊ณ , ํŒ€์›๋“ค๊ณผ ์ƒ์˜๋ฅผ ํ•ด๋ณธ ํ›„ ๋ฉ˜ํ† ๋‹˜๊ป˜ ์งˆ๋ฌธ๋„ ํ•ด๋ณด์•˜๋‹ค. 

 

๋‚ด ์˜๊ฒฌ: 

๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ๋” ์šฉ์ดํ•˜๊ณ , ๋‚˜์ค‘์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š”๋ฐ์—๋„ ์œ ๋ฆฌํ•˜์ง€ ์•Š์„๊นŒ. ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ธด ํ•˜๊ฒ ์ง€๋งŒ, ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋„ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ž‘์—…ํ•˜๋Š”๊ฒŒ ๋” ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

ํŒ€์› ์˜๊ฒฌ:

๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๊ด€์‹ฌ์‚ฌ์˜ ๊ธฐ์ค€์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•จ
๊ณ„์ธต ๊ธฐ๋ฐ˜์€ ๊ตฌ์กฐ์ ์œผ๋กœ๋Š” ์ง๊ด€์ ์ด์ง€๋งŒ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด src(root) ๋‹จ์œ„์—์„œ ํฉ์–ด์ ธ์„œ ์˜คํžˆ๋ ค ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ ๋„ ๋А๋‚Œ. feature-base๋Š” ์ข€ ๋” ํด๋”๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€์ง€๋งŒ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋ถ„๋ฆฌ๋˜๋Š” ๋А๋‚Œ์ด๊ธฐ๋„ ํ•จ

 

๋ฉ˜ํ† ๋‹˜:

์ž‘์€ ๋‹จ์œ„์—์„œ๋Š” layered๋„ ์ถฉ๋ถ„ํžˆ ์ข‹๋‹ค. ๊ทธ๋ฆฌ๊ณ  feature-based๋ผ๋Š” ๋ง๋ณด๋‹ค๋Š” domain, model based๋ผ๋Š”๊ฒŒ ๋” ์ ํ•ฉํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๋ชจ๋ธ์€ db ํ•œ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ๋œปํ•˜๊ณ , feature-based(model based ์•„๋ฌดํŠผ)์„ ์“ธ ๋• ํ•˜๋‚˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋ถ„๋ฆฌ๋ณด๋‹ค๋Š” ๋ชจ๋ธ์˜ ๊ตฐ์ง‘ ๊ฐœ๋…์ธ Aggregate(์–ด๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ) ๋‹จ์œ„๋กœ, ์—ฐ๊ด€ ๊ฐœ๋…์„ ํ†ตํ•ฉํ•˜์—ฌ ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๊ฒŒ ๋” ํšจ์œจ์ ์ด๋‹ค.

์‚ฌ์‹ค ์–ด๋–ค ๊ตฌ์กฐ๋ฅผ ์“ฐ๋“  ๋ณธ์งˆ์€ ํด๋” ์ •๋ฆฌ์ด๋‹ค. ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ , ๋˜ ํšŒ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ๊ฒŒ ํด๋” ๊ตฌ์กฐ์ด๋‹ˆ ์ •๋‹ต์€ ์—†๋‹ค. ๊ฐ์ž์˜ ๊ทœ์น™์ด ์žˆ์„ ๋ฟ์ด๊ณ , ๊ทธ๋ƒฅ ์™œ ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•œ ๊ทผ๊ฑฐ๋งŒ ์žˆ์œผ๋ฉด ๋  ๋“ฏ. ๊ทธ๋ž˜๋„ ๊ตณ์ด ์ •๋‹ต์„ ์ฐพ์ž๋ฉด ๋Œ€๊ธฐ์—… ๋ธ”๋กœ๊ทธ ์ฐธ๊ณ 

 

๊ณ ๋ฏผ์ด ์ปธ๋Š”๋ฐ, ๋ฉ˜ํ† ๋‹˜ ์˜๊ฒฌ์„ ๋“ค์œผ๋‹ˆ ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ํฌ๊ฒŒ ๊ณ ๋ฏผํ•  ํ•„์š”๋Š” ์—†๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์ข€ ๋” ๋งˆ์Œ์— ๋“œ๋Š” ๋ฐฉ์‹์ธ feature-based ๋ฐฉ์‹์œผ๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. ํ”„๋ก ํŠธ๋ฅผ ๋งŒ๋“ค๋•Œ๋„ ํŽ˜์ด์ง€ ํ•˜์œ„ ์ข…์† ์ปดํฌ๋„ŒํŠธ, ์œ ํ‹ธ ๋“ฑ์„ ๋„ฃ๋Š” ๊ตฌ์กฐ๋ฅผ ์ž์ฃผ ์“ฐ๊ธฐ๋„ ํ•ด์„œ ๋” ์ต์ˆ™ํ•œ ๋ฐฉ์‹์ด๊ธฐ๋„ ํ•˜๊ณ .

 

๊ฐœ๋ฐœ

๋ฐฑ์—”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‹ ๊ฒฝ ์“ด ๊ฑด ์—๋Ÿฌ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ ‡๊ฒŒ ์‹ ๊ฒฝ์“ด ๊ฒƒ ์น˜๊ณ ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ฉ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ๋ชปํ•˜์ง€๋งŒ, ์—๋Ÿฌ๋ฉ”์‹œ์ง€ ์„ธ๋ถ„ํ™” ๋ฐ ์ƒ์ˆ˜ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ตœ๋Œ€ํ•œ ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Œ

 

 

๐Ÿ‘ŽLacked

ํƒœ๋„์ ์ธ ๋ถ€๋ถ„ ๋ง๊ณ  ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์•„์‰ฌ์šด ์ ์„ ์ข€ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•จ

  • ์—๋Ÿฌ ๋ฐ˜ํ™˜ ์‹œ ์ƒํƒœ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค. ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ƒํƒœ์ฝ”๋“œ + ์—๋Ÿฌ๋ฉ”์‹œ์ง€ ๋™์‹œ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜์ง€ ์•Š์•˜๋‚˜ ์•„์‰ฌ์›€์ด ๋‚จ์Œ
  • ESM๊ณผ CommonJS๋Š” ์•„์ง๋„ ์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค. ESM์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ๋‚˜์„œ, CommonJS์—์„œ import/export ํ—ˆ์šฉํ•˜๋„๋ก ์„ค์ • ์ ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜์˜€๋‹ค. ์˜ค๋ฅ˜๋Š” ํƒˆ์ถœํ–ˆ์ง€๋งŒ, ๊ฐ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ์ดํ•ด ์—†์ด ํ•ด๊ฒฐ์—๋งŒ ๋„ˆ๋ฌด ๊ธ‰๊ธ‰ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์„œ ์•„์‰ฌ์›€
  • any๋ฅผ ์€๊ทผ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ ๋ฉด์—์„œ ๋งŽ์ด ๋ถ€์กฑํ•จ์ด ์žˆ์—ˆ์Œ
  • ์„ค๊ณ„์˜ ๋ฏธํก. api ์„ค๊ณ„๋ฅผ ์ž˜ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋ง‰์ƒ ํ”„๋ก ํŠธ ์ž‘์—…์„ ํ•˜๋‹ค ๋ณด๋‹ˆ ๋ถ€์กฑํ•œ API๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค. ํ”„๋ก ํŠธ ์ž‘์—…์„ ํ•˜๋ฉด์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ API๋ฅผ ์ถ”๊ฐ€ ๊ฐœ๋ฐœํ–ˆ๋Š”๋ฐ, ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์œ ์ € ํ”Œ๋กœ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์„œ api ์„ค๊ณ„๋ฅผ ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋А๋‚Œ
  • ์‹œ๊ฐ„์ด ์ข€ ๋‚จ์•˜์œผ๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜์„ํ…๋ฐ ํ•˜๋Š” ์•„์‰ฌ์›€

 

๐ŸฅธLearned

  • ๋ฐฑ๋‚  Service๋ฉฐ controller๋ฉฐ ์ฝ์–ด๋ด๋„ ๊ทธ๋ž˜์„œ ๋ญ” ์ฐจ์ด์ง€ ์•„๋ฆฌ์†กํ•œ ๋А๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ service, controller๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์จ๋ณด๋ฉด์„œ ํ™•์‹คํžˆ ๊ตฌ์กฐ์™€ ์ฝ”๋“œ ํ๋ฆ„์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.
  • Prisma๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค. SQL๋กœ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Œ. 

 

๐ŸนLonged for

๊ธ‰ํ•œ ๋ถˆ ๋‹ค ๊ป์œผ๋‹ˆ ๋ธ”๋กœ๊ทธ ์ •๋ฆฌํ•˜๊ธฐ