2025๋…„ 12์›” 13์ผยท5๋ถ„ ์ฝ๊ธฐ

๋‚ด๋ณด๋‚ธ Go ๋ฐฑ์—”๋“œ๋ฅผ ์•ˆ์ „ํ•œ ์ปค์Šคํ…€ ๋ฏธ๋“ค์›จ์–ด๋กœ ํ™•์žฅํ•˜๊ธฐ

๋‚ด๋ณด๋‚ธ Go ๋ฐฑ์—”๋“œ๋ฅผ ๋ณ€๊ฒฝ์„ ์žƒ์ง€ ์•Š๊ณ  ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•: ์ปค์Šคํ…€ ์ฝ”๋“œ๋ฅผ ์–ด๋””์— ๋‘๊ณ , ๋ฏธ๋“ค์›จ์–ด์™€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€ํ•˜๋ฉฐ, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„ํšํ• ์ง€.

๋‚ด๋ณด๋‚ธ Go ๋ฐฑ์—”๋“œ๋ฅผ ์•ˆ์ „ํ•œ ์ปค์Šคํ…€ ๋ฏธ๋“ค์›จ์–ด๋กœ ํ™•์žฅํ•˜๊ธฐ

๋‚ด๋ณด๋‚ธ ์ฝ”๋“œ๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ๋•Œ ๋ฌด์—‡์ด ์ž˜๋ชป๋˜๋Š”๊ฐ€

๋‚ด๋ณด๋‚ธ ์ฝ”๋“œ๋Š” ์ˆ˜์ž‘์—…์œผ๋กœ ์ž‘์„ฑํ•œ Go ์ €์žฅ์†Œ์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. AppMaster ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋Š” ๋ฐฑ์—”๋“œ๊ฐ€ ์‹œ๊ฐ์  ๋ชจ๋ธ(๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ, ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค, API ์„ค์ •)์—์„œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๋ฉด ์ƒ์„ฑ๊ธฐ๋Š” ์—…๋ฐ์ดํŠธ๋œ ๋ชจ๋ธ์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ์˜ ํฐ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ด ์ฃผ์ง€๋งŒ, ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ ธ์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

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

์•ˆ์ „ํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์€ ๋ณ€๊ฒฝ์„ ๋ฐ˜๋ณต ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฒ€ํ† ๊ฐ€ ์‰ฌ์šด ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋ฅผ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๊ณ  ์ปค์Šคํ…€ ๋ ˆ์ด์–ด๋ฅผ ์ ์šฉํ•œ ๋’ค ์–ด๋–ค ๊ฒƒ์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด ์ž˜ํ•œ ๊ฒ๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๊ณ ๊ณ ํ•™์  ์ž‘์—…์ฒ˜๋Ÿผ ๋А๊ปด์ง„๋‹ค๋ฉด ์ž˜๋ชป๋œ ์œ„์น˜์— ๋ณ€๊ฒฝ์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๊ณณ์— ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ๋•Œ ํ”ํžˆ ๋ณด๋Š” ๋ฌธ์ œ๋“ค:

  • ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„ ํŽธ์ง‘์ด ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ์ถฉ๋Œ ํ•ด๊ฒฐ์— ๋ช‡ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
  • ๋ผ์šฐํŠธ๊ฐ€ ์ด๋™ํ•ด ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๊ธฐ๋Œ€ํ•œ ์œ„์น˜์—์„œ ๋” ์ด์ƒ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋…ผ๋ฆฌ๊ฐ€ ๋…ธ์ฝ”๋“œ ๋ชจ๋ธ๊ณผ Go ์ฝ”๋“œ ์–‘์ชฝ์— ์ค‘๋ณต๋˜๋‹ค๊ฐ€ ์ ์  ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • "ํ•œ ์ค„ ๋ณ€๊ฒฝ"์ด ์•„๋ฌด๋„ ๋งŒ์ง€๊ธฐ ์‹ซ์€ ํฌํฌ๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ทœ์น™ ํ•˜๋‚˜๊ฐ€ ๋ณ€๊ฒฝ์˜ ์†Œ์†์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์ด ๋น„๊ฐœ๋ฐœ์ž๊ฐ€ ์กฐ์ •ํ•ด์•ผ ํ•  ๋น„์ฆˆ๋‹ˆ์Šค ๋™์ž‘(ํ•„๋“œ, ๊ฒ€์ฆ, ์›Œํฌํ”Œ๋กœ, ๊ถŒํ•œ)์˜ ์ผ๋ถ€๋ผ๋ฉด ๋…ธ์ฝ”๋“œ ๋ชจ๋ธ์— ๋‘์„ธ์š”. ์ธํ”„๋ผ ๋™์ž‘(์ปค์Šคํ…€ ์ธ์ฆ ํ†ตํ•ฉ, ์š”์ฒญ ๋กœ๊น…, ํŠน์ˆ˜ ํ—ค๋”, ์†๋„ ์ œํ•œ)์ด๋ผ๋ฉด ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ์—๋„ ์‚ด์•„๋‚จ๋Š” ์ปค์Šคํ…€ Go ๋ ˆ์ด์–ด์— ๋‘์„ธ์š”.

์˜ˆ: ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊น…์€ ๋ณดํ†ต ๋ฏธ๋“ค์›จ์–ด(์ปค์Šคํ…€ ์ฝ”๋“œ)์ž…๋‹ˆ๋‹ค. ์ฃผ๋ฌธ์˜ ์ƒˆ ํ•„๋“œ๋ฅผ ํ•„์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ณดํ†ต ๋ฐ์ดํ„ฐ ๋ชจ๋ธ(๋…ธ์ฝ”๋“œ)์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ถ„๋ฆฌ๋ฅผ ๋ถ„๋ช…ํžˆ ํ•˜๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ง€๋„ํ™”ํ•˜๊ธฐ: ์ƒ์„ฑ๋œ ๋ถ€๋ถ„ vs ๋‹น์‹ ์˜ ๋ถ€๋ถ„

๋ฐฑ์—”๋“œ๋ฅผ ํ™•์žฅํ•˜๊ธฐ ์ „์— ์žฌ๋‚ด๋ณด๋‚ด๊ธฐํ•  ๋•Œ ์–ด๋–ค ๋ถ€๋ถ„์ด ์žฌ์ƒ์„ฑ๋˜๊ณ  ์ง„์งœ๋กœ ๋‹น์‹ ์ด ์†Œ์œ ํ•œ ๋ถ€๋ถ„์ด ๋ฌด์—‡์ธ์ง€ 20๋ถ„๋งŒ์— ์ง€๋„ํ™”ํ•˜์„ธ์š”. ๊ทธ ์ง€๋„๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ง€๋ฃจํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์—ด์‡ ์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ์Šค์Šค๋กœ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค: "Code generated"๋‚˜ "DO NOT EDIT" ๊ฐ™์€ ํ—ค๋” ์ฃผ์„, ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ํŒจํ„ด, ์ธ๊ฐ„์ด ์“ด ์„ค๋ช…์ด ๊ฑฐ์˜ ์—†๋Š” ๋งค์šฐ ๊ท ์ผํ•œ ๊ตฌ์กฐ.

๋ ˆํฌ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๊ฒƒ์„ ์„ธ ๊ฐœ์˜ ๋ฒ„ํ‚ท์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ์ƒ์„ฑ๋œ(์ฝ๊ธฐ ์ „์šฉ): ์ƒ์„ฑ๊ธฐ ๋งˆ์ปค๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋ฐ˜๋ณต ํŒจํ„ด์ด ์žˆ๊ฑฐ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ๊ณจ๊ฒฉ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํด๋”.
  • ๋‹น์‹ ์ด ์†Œ์œ : ๋‹น์‹ ์ด ๋งŒ๋“  ํŒจํ‚ค์ง€, ๋ž˜ํผ, ์ œ์–ดํ•˜๋Š” ์„ค์ •.
  • ๊ณต์œ  ์ ‘์ : ๋“ฑ๋ก์„ ์œ„ํ•œ ๋ฐฐ์„  ์ง€์ (๋ผ์šฐํŠธ, ๋ฏธ๋“ค์›จ์–ด, ํ›…)์œผ๋กœ ์ž‘์€ ํŽธ์ง‘์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ณณ.

์ฒซ ๋ฒˆ์งธ ๋ฒ„ํ‚ท์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์„ธ์š”. ๊ธฐ์ˆ ์ ์œผ๋กœ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋”๋ผ๋„ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋‚˜์ค‘์— ๋ฎ์–ด์“ธ ๊ฑฐ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ฑฐ๋‚˜ ์˜์›ํžˆ ๋จธ์ง€ ๋ถ€๋‹ด์„ ๋– ์•ˆ๊ฒŒ ๋  ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์„ธ์š”.

ํŒ€์„ ์œ„ํ•ด ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๋ ค๋ฉด ๋ฃจํŠธ README ๊ฐ™์€ ๊ณณ์— ์งง์€ ๋ฉ”๋ชจ๋ฅผ ๋‚จ๊ธฐ์„ธ์š”. ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”:

"Generator-owned files: anything with a DO NOT EDIT header and folders X/Y. Our code lives under internal/custom (or similar). Only touch wiring points A/B, and keep changes there small. Any wiring edit needs a comment explaining why it can't live in our own package."

๊ทธ ํ•œ ์ค„์˜ ๋…ธํŠธ๊ฐ€ ๋น ๋ฅธ ์ˆ˜์ •์ด ์˜๊ตฌ์ ์ธ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ณ ํ†ต์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค๋‹ˆ๋‹ค.

์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ปค์Šคํ…€ ์ฝ”๋“œ๋ฅผ ์–ด๋””์— ๋‘˜๊นŒ

๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๊ทœ์น™์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค: ๋‚ด๋ณด๋‚ธ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ๋ณ€๊ฒฝ์€ ๋ช…ํ™•ํžˆ ์†Œ์œ ๋˜๋Š” ์ปค์Šคํ…€ ์˜์—ญ์— ๋„ฃ์œผ์„ธ์š”. ๋‚˜์ค‘์— ๋‹ค์‹œ ๋‚ด๋ณด๋‚ผ ๋•Œ(์˜ˆ: AppMaster์—์„œ) ๋ณ‘ํ•ฉ์ด ๋Œ€๋ถ€๋ถ„ "์ƒ์„ฑ ์ฝ”๋“œ ๊ต์ฒด, ์ปค์Šคํ…€ ์ฝ”๋“œ ์œ ์ง€"๊ฐ€ ๋˜๊ธธ ์›ํ•ฉ๋‹ˆ๋‹ค.

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

์‹ค์šฉ์ ์ธ ๋ ˆ์ด์•„์›ƒ ์˜ˆ:

  • internal/custom/ โ€” ๋ฏธ๋“ค์›จ์–ด, ํ•ธ๋“ค๋Ÿฌ, ์ž‘์€ ํ—ฌํผ๋“ค
  • internal/custom/routes.go โ€” ์ปค์Šคํ…€ ๋ผ์šฐํŠธ๋ฅผ ํ•œ ๊ณณ์— ๋“ฑ๋ก
  • internal/custom/middleware/ โ€” ์š”์ฒญ/์‘๋‹ต ๊ด€๋ จ ๋กœ์ง
  • internal/custom/README.md โ€” ํ–ฅํ›„ ํŽธ์ง‘์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๊ทœ์น™

์„œ๋ฒ„ ๋ฐฐ์„ ์„ ๋‹ค์„ฏ ๊ตฐ๋ฐ์—์„œ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜์„ธ์š”. ํ•˜๋‚˜์˜ ์–‡์€ "ํ›„ํฌ ํฌ์ธํŠธ"์—์„œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์ถ”๊ฐ€ ๋ผ์šฐํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์„ธ์š”. ์ƒ์„ฑ๋œ ์„œ๋ฒ„๊ฐ€ ๋ผ์šฐํ„ฐ๋‚˜ ํ•ธ๋“ค๋Ÿฌ ์ฒด์ธ์„ ๋…ธ์ถœํ•˜๋ฉด ๊ฑฐ๊ธฐ์— ํ”Œ๋Ÿฌ๊ทธ์ธํ•˜์„ธ์š”. ๋…ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์—”ํŠธ๋ฆฌํฌ์ธํŠธ ๊ทผ์ฒ˜์— ๋‹จ์ผ ํ†ตํ•ฉ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ด custom.Register(router) ๊ฐ™์€ ํ˜ธ์ถœ์„ ํ•˜์„ธ์š”.

์ปค์Šคํ…€ ์ฝ”๋“œ๋ฅผ ๋งˆ์น˜ ๋‚ด์ผ ์ƒˆ ๋‚ด๋ณด๋‚ด๊ธฐ์— ๊ทธ๋Œ€๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜์„ธ์š”. ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ƒ์„ฑ๋œ ํƒ€์ž…์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ฉฐ ์ž‘์€ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋‹จ๊ณ„๋ณ„: ์•ˆ์ „ํ•˜๊ฒŒ ์ปค์Šคํ…€ ๋ฏธ๋“ค์›จ์–ด ์ถ”๊ฐ€ํ•˜๊ธฐ

๋ชฉํ‘œ๋Š” ๋กœ์ง์„ ๋‹น์‹ ์˜ ํŒจํ‚ค์ง€์— ๋‘๊ณ  ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ํ•˜๋‚˜์˜ ์ง€์ ๋งŒ ๊ฑด๋“œ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋จผ์ € ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ข๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”: ์š”์ฒญ ๋กœ๊น…, ๊ฐ„๋‹จํ•œ ์ธ์ฆ ์ฒดํฌ, ์†๋„ ์ œํ•œ, ์š”์ฒญ ID ๋“ฑ. ์„ธ ๊ฐ€์ง€ ์—ญํ• ์„ ํ•˜๋ ค ๋“ค๋ฉด ๋‚˜์ค‘์— ๋” ๋งŽ์€ ํŒŒ์ผ์„ ๊ฑด๋“œ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ: internal/custom/middleware ๊ฐ™์€ ์ž‘์€ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์•ฑ ์ „์ฒด๋ฅผ ์•Œ ํ•„์š” ์—†๊ฒŒ ํ•˜์„ธ์š”. ๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ‘œ์ค€ Go ํ•ธ๋“ค๋Ÿฌ ๋ž˜ํผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•˜๋‚˜์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ •๋„๋กœ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.

package middleware

import "net/http"

func RequestID(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// Add header, log, or attach to context here.
		next.ServeHTTP(w, r)
	})
}

์ด์ œ ํ†ตํ•ฉ ์ง€์ ์„ ํ•˜๋‚˜ ๊ณ ๋ฅด์„ธ์š”: ๋ผ์šฐํ„ฐ๋‚˜ HTTP ์„œ๋ฒ„๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์„œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ•œ ๋ฒˆ ๋“ฑ๋กํ•˜๊ณ  ๊ฐœ๋ณ„ ๋ผ์šฐํŠธ์— ํฉ๋ฟŒ๋ฆฌ๋Š” ๊ฒƒ์„ ํ”ผํ•˜์„ธ์š”.

๊ฒ€์ฆ ๋ฃจํ”„๋Š” ์ž‘๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”:

  • httptest๋ฅผ ์‚ฌ์šฉํ•ด ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ(์ƒํƒœ ์ฝ”๋“œ๋‚˜ ํ—ค๋”)๋ฅผ ํ™•์ธํ•˜๋Š” ์ง‘์ค‘๋œ ํ…Œ์ŠคํŠธ ํ•˜๋‚˜ ์ถ”๊ฐ€
  • ์ˆ˜๋™ ์š”์ฒญ์œผ๋กœ ๋™์ž‘ ํ™•์ธ
  • ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์—๋Ÿฌ ์ƒํ™ฉ์—์„œ๋„ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ
  • ๋“ฑ๋ก ๋ผ์ธ ๊ทผ์ฒ˜์— ์™œ ํ•„์š”ํ•œ์ง€ ํ•œ ์ค„ ์„ค๋ช… ์ฃผ์„ ์ถ”๊ฐ€

์ž‘์€ diff, ํ•˜๋‚˜์˜ ๋ฐฐ์„  ์ง€์ , ์‰ฌ์šด ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ.

๋‹จ๊ณ„๋ณ„: ๋ชจ๋“  ๊ฒƒ์„ ํฌํฌํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ

๋‚ด๋ถ€ ๋„๊ตฌ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋นŒ๋“œํ•˜๊ธฐ
๋‚ด๋ถ€ ๋„๊ตฌ๋‚˜ ๊ด€๋ฆฌ ํฌํ„ธ์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ , ์ดํ›„ ์ปค์Šคํ…€ Go ๋ฏธ๋“ค์›จ์–ด๋กœ ํ™•์žฅํ•˜์„ธ์š”.
๋ฌด๋ฃŒ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ

์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ์—”๋“œํฌ์ธํŠธ๋Š” ์•ฑ์ด ์ž„ํฌํŠธํ•˜๋Š” ์ž‘์€ ์ปค์Šคํ…€ ํŒจํ‚ค์ง€์— ์ถ”๊ฐ€ํ•˜์„ธ์š”. ๊ทธ๋ž˜์•ผ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๊ณ„์•ฝ์„ ๋ฌธ์„œํ™”ํ•˜์„ธ์š”. ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋ฌด์—‡์„ ๋ฐ›๋Š”๊ฐ€(์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, JSON ๋ฐ”๋””, ํ—ค๋”)? ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฐ€(JSON ํ˜•ํƒœ)? ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•˜์„ธ์š”.

์ปค์Šคํ…€ ํŒจํ‚ค์ง€์— ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“œ์„ธ์š”. ์ง€๋ฃจํ•˜๊ฒŒ ๋งŒ๋“œ์„ธ์š”: ์ž…๋ ฅ ์ฝ๊ธฐ, ๊ฒ€์ฆ, ๊ธฐ์กด ์„œ๋น„์Šค๋‚˜ DB ํ—ฌํผ ํ˜ธ์ถœ, ์‘๋‹ต ์ž‘์„ฑ.

๋ผ์šฐํŠธ ๋“ฑ๋ก์€ ๋ฏธ๋“ค์›จ์–ด์™€ ๊ฐ™์€ ๋‹จ์ผ ํ†ตํ•ฉ ์ง€์ ์—์„œ ํ•˜์„ธ์š”. ์‹œ์ž‘ ์‹œ ๋ผ์šฐํ„ฐ๊ฐ€ ์กฐ๋ฆฝ๋˜๋Š” ๊ณณ์„ ์ฐพ์•„ ๊ฑฐ๊ธฐ์— ๋งˆ์šดํŠธํ•˜์„ธ์š”. ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ์ž ํ›…์ด๋‚˜ ์ปค์Šคํ…€ ๋“ฑ๋ก์„ ์ง€์›ํ•˜๋ฉด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์งง์€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:

  • ์ž…๋ ฅ์„ ์ผ์ฐ ๊ฒ€์ฆ(ํ•„์ˆ˜ ํ•„๋“œ, ํ˜•์‹, ์ตœ์†Œ/์ตœ๋Œ€)
  • ๋ชจ๋“  ๊ณณ์—์„œ ํ•˜๋‚˜์˜ ์—๋Ÿฌ ํ˜•ํƒœ ๋ฐ˜ํ™˜(๋ฉ”์‹œ์ง€, ์ฝ”๋“œ, ์„ธ๋ถ€)
  • ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…(DB, ๋„คํŠธ์›Œํฌ)์—๋Š” ์ปจํ…์ŠคํŠธ ํƒ€์ž„์•„์›ƒ ์‚ฌ์šฉ
  • ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๋Š” ํ•œ ๋ฒˆ๋งŒ ๋กœ๊น…ํ•œ ๋’ค ๊น”๋”ํ•œ 500 ๋ฐ˜ํ™˜
  • ์‹ ๊ทœ ๋ผ์šฐํŠธ๋ฅผ ํ˜ธ์ถœํ•ด ์ƒํƒœ์™€ JSON์„ ํ™•์ธํ•˜๋Š” ์ž‘์€ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

๋˜ํ•œ ๋ผ์šฐํ„ฐ๊ฐ€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋“ฑ๋กํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ค‘๋ณต ๋“ฑ๋ก์€ ๋ณ‘ํ•ฉ ํ›„ ํ”ํ•œ ํ•จ์ •์ž…๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ์„ ํ•œ์ •์‹œํ‚ค๋Š” ํ†ตํ•ฉ ํŒจํ„ด

๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์—…๊ทธ๋ ˆ์ด๋“œ ์นœํ™”์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ
์‹ค์ œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฐ›๊ณ  ํด๋ฆฐํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฒฝ๊ณ„๋กœ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์œ ์ง€ํ•˜์„ธ์š”.
์†Œ์Šค ๋‚ด๋ณด๋‚ด๊ธฐ

์ƒ์„ฑ๋œ ๋ฐฑ์—”๋“œ๋ฅผ ์˜์กด์„ฑ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์„ธ์š”. ํŽธ์ง‘๋ณด๋‹ค ์กฐํ•ฉ์„ ์„ ํ˜ธํ•˜์„ธ์š”: ์ƒ์„ฑ๋œ ์•ฑ์˜ ํ•ต์‹ฌ ๋กœ์ง์„ ํŽธ์ง‘ํ•˜๊ธฐ๋ณด๋‹ค ๊ทธ ์ฃผ์œ„์— ๊ธฐ๋Šฅ์„ ๋ฐฐ์„ ํ•˜์„ธ์š”.

๊ตฌ์„ฑ๊ณผ ์กฐํ•ฉ์„ ์šฐ์„ ํ•˜์„ธ์š”

์ฝ”๋“œ๋ฅผ ์“ฐ๊ธฐ ์ „์— ๋™์ž‘์„ ๊ตฌ์„ฑ, ํ›…, ํ‘œ์ค€ ์กฐํ•ฉ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋ฏธ๋“ค์›จ์–ด๋Š” ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค: ๊ธฐ๊ณ„ ๊ฐ€์žฅ์ž๋ฆฌ(๋ผ์šฐํ„ฐ/HTTP ์Šคํƒ)์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ƒ์„ฑ๋œ ํƒ€์ž… ๋ˆ„์ˆ˜๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋Œ‘ํ„ฐ ์‚ฌ์šฉ

์ƒ์„ฑ๋œ ๋ชจ๋ธ๊ณผ DTO๋Š” ๋‚ด๋ณด๋‚ผ ๋•Œ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ ๊ณ ํ†ต์„ ์ค„์ด๋ ค๋ฉด ๊ฒฝ๊ณ„์—์„œ ๋ณ€ํ™˜ํ•˜์„ธ์š”:

  • ์ƒ์„ฑ๋œ ์š”์ฒญ ํƒ€์ž…์„ ์ž์ฒด ๋‚ด๋ถ€ ๊ตฌ์กฐ์ฒด๋กœ ๋ณ€ํ™˜
  • ๋„๋ฉ”์ธ ๋กœ์ง์€ ๋‚ด๋ถ€ ๊ตฌ์กฐ์ฒด๋กœ๋งŒ ์‹คํ–‰
  • ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑ๋œ ์‘๋‹ต ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

์ •๋ง ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ ค์•ผ ํ•  ๋•Œ๋Š” ๊ทธ๊ฑธ ๋‹จ์ผ ๋ฐฐ์„  ํŒŒ์ผ๋กœ ๊ฒฉ๋ฆฌํ•˜์„ธ์š”. ๋งŽ์€ ์ƒ์„ฑ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฌ๊ธฐ์ €๊ธฐ ํŽธ์ง‘ํ•˜์ง€ ๋งˆ์„ธ์š”.

// internal/integrations/http.go
func RegisterCustom(r *mux.Router) {
    r.Use(RequestIDMiddleware)
    r.Use(AuditLogMiddleware)
}

์‹ค์šฉ์ ์ธ ๊ทœ์น™: ๋ณ€๊ฒฝ์„ 2~3๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์•„๋งˆ ๋„ˆ๋ฌด ์–ฝํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ diff๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ชฉํ‘œ๋Š” ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ๋ฉฐ์น ๊ฐ„์˜ ์ถฉ๋Œ๋กœ ๋ณ€ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŽธ์ง‘์„ ์ž‘๊ณ  ์ฐพ๊ธฐ ์‰ฌ์šฐ๋ฉฐ ์„ค๋ช…ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.

์ฒ˜์Œ๋ถ€ํ„ฐ Git์„ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์„ฑ๋œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ปค์Šคํ…€ ์ž‘์—…๊ณผ ๋ถ„๋ฆฌํ•˜์„ธ์š”. ์„ž์–ด๋ฒ„๋ฆฌ๋ฉด ๋‚˜์ค‘์— ๋ฌด์—‡์ด ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ์•Œ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ฝ๊ธฐ ์‰ฌ์šด ์ปค๋ฐ‹ ๋ฃจํ‹ด:

  • ๋ชฉ์  ํ•˜๋‚˜๋‹น ์ปค๋ฐ‹ ํ•˜๋‚˜("Add request ID middleware"์ฒ˜๋Ÿผ)
  • ํ˜•์‹๋งŒ ๋ฐ”๋€ ๊ฒƒ๊ณผ ๋กœ์ง ๋ณ€๊ฒฝ์„ ์„ž์ง€ ์•Š๊ธฐ
  • ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„์—๋Š” ์ƒ์„ฑ๋œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋จผ์ € ์ปค๋ฐ‹ํ•˜๊ณ , ๊ทธ ๋‹ค์Œ ์ปค์Šคํ…€ ์กฐ์ •์„ ์ปค๋ฐ‹
  • ๊ฑด๋“œ๋ฆฐ ํŒจํ‚ค์ง€๋‚˜ ํŒŒ์ผ์„ ์–ธ๊ธ‰ํ•˜๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€

๊ฐ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์™œ ์กด์žฌํ•˜๋Š”์ง€, ์–ด๋””์— ์žˆ๋Š”์ง€ ์ ์€ ๊ฐ„๋‹จํ•œ CHANGELOG_CUSTOM.md๋ฅผ ์œ ์ง€ํ•˜์„ธ์š”. AppMaster ๋‚ด๋ณด๋‚ด๊ธฐ์ฒ˜๋Ÿผ ํ”Œ๋žซํผ์ด ์ฝ”๋“œ๋ฅผ ์™„์ „ํžˆ ์žฌ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ผ๊ด€๋œ ํฌ๋งทํŒ…๊ณผ ๋ฆฐํŠธ ๊ทœ์น™์œผ๋กœ diff ์†Œ์Œ์„ ์ค„์ด์„ธ์š”. ์ปค๋ฐ‹๋งˆ๋‹ค gofmt๋ฅผ ์‹คํ–‰ํ•˜๊ณ  CI์—์„œ๋„ ๊ฐ™์€ ๊ฒ€์‚ฌ๋ฅผ ํ•˜์„ธ์š”. ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ํŠน์ • ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ๋žŒ์ด ์†์œผ๋กœ "์ •๋ฆฌ"ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋งค๋ฒˆ ์žฌ๋‚ด๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ๊ทธ ์ •๋ฆฌ๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒ€์ด ๋งค๋ฒˆ ๊ฐ™์€ ์ˆ˜๋™ ํŽธ์ง‘์„ ๋ฐ˜๋ณตํ•œ๋‹ค๋ฉด ํŒจ์น˜ ์›Œํฌํ”Œ๋กœ(๋‚ด๋ณด๋‚ด๊ธฐ, ํŒจ์น˜ ์ ์šฉ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ)๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”.

์—…๊ทธ๋ ˆ์ด๋“œ ๊ณ„ํš: ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ, ๋ณ‘ํ•ฉ, ๊ฒ€์ฆ

์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ํฌํฌํ•˜์ง€ ๋งˆ์„ธ์š”
์ฝ”์–ด ์•ฑ์€ ์ƒ์„ฑ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ , ํ•„์š”ํ•œ ํ†ตํ•ฉ๋งŒ ์ˆ˜์ž‘์—…์œผ๋กœ ๊ตฌํ˜„ํ•ด ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜์„ธ์š”.
๋…ธ์ฝ”๋“œ๋กœ ๋นŒ๋“œํ•˜๊ธฐ

๋ฐฑ์—”๋“œ๋ฅผ ์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ: ๊นจ๋—ํ•œ ์ฝ”๋“œ๋ฅผ ์žฌ๋‚ด๋ณด๋‚ด๊ณ  ๋งค๋ฒˆ ๊ฐ™์€ ํ†ตํ•ฉ ์ง€์ ์„ ํ†ตํ•ด ์ปค์Šคํ…€ ๋™์ž‘์„ ์žฌ์ ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฆฌ์Šคํฌ ํ—ˆ์šฉ ๋ฒ”์œ„์™€ ์•ฑ ๋ณ€๊ฒฝ ๋นˆ๋„์— ๋งž๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ์ฃผ๊ธฐ๋ฅผ ์„ ํƒํ•˜์„ธ์š”:

  • ๋น ๋ฅธ ๋ณด์•ˆ ํŒจ์น˜๋‚˜ ์ƒˆ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋ฉด ํ”Œ๋žซํผ ๋ฆด๋ฆฌ์Šค๋งˆ๋‹ค
  • ์•ฑ์ด ์•ˆ์ •์ ์ด๊ณ  ๋ณ€๊ฒฝ์ด ์ ์œผ๋ฉด ๋ถ„๊ธฐ๋ณ„
  • ๋ฐฑ์—”๋“œ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๊ณ  ํŒ€์ด ์ž‘์œผ๋ฉด ํ•„์š”ํ•  ๋•Œ๋งŒ

์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ์—๋Š” ๋ณ„๋„ ๋ธŒ๋žœ์น˜์—์„œ ๋“œ๋ผ์ด๋Ÿฐ ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ•˜์„ธ์š”. ์ƒˆ๋กœ ๋‚ด๋ณด๋‚ธ ๋ฒ„์ „๋งŒ ๋จผ์ € ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•ด์„œ ์ปค์Šคํ…€ ๋ ˆ์ด์–ด๊ฐ€ ๊ฐœ์ž…ํ•˜๊ธฐ ์ „์— ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์„ธ์š”.

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

๋™์ž‘ ๊ฒ€์ฆ์„ ์œ„ํ•œ ์งง์€ ํšŒ๊ท€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:

  • ์ธ์ฆ ํ๋ฆ„(๋กœ๊ทธ์ธ, ํ† ํฐ ๊ฐฑ์‹ , ๋กœ๊ทธ์•„์›ƒ) ๋™์ž‘ ํ™•์ธ
  • ํ•ต์‹ฌ API ์—”๋“œํฌ์ธํŠธ 3~5๊ฐœ๊ฐ€ ๋™์ผํ•œ ์ƒํƒœ ์ฝ”๋“œ์™€ ํ˜•ํƒœ๋ฅผ ๋ฐ˜ํ™˜
  • ์—”๋“œํฌ์ธํŠธ๋‹น ํ•˜๋‚˜์˜ ๋น„์ •์ƒ ๊ฒฝ๋กœ(์ž˜๋ชป๋œ ์ž…๋ ฅ, ์ธ์ฆ ๋ˆ„๋ฝ) ํ™•์ธ
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด๋‚˜ ์Šค์ผ€์ค„ ์ž‘์—…์ด ์—ฌ์ „ํžˆ ์‹คํ–‰๋˜๋Š”์ง€
  • ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ํ—ฌ์Šค/๋ ˆ๋””๋‹ˆ์Šค ์—”๋“œํฌ์ธํŠธ๊ฐ€ OK๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€

๊ฐ์‚ฌ ๋กœ๊น… ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋ฉด, ๊ฐ ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ์™€ ๋ณ‘ํ•ฉ ํ›„ ํ•œ ๋ฒˆ์˜ ์“ฐ๊ธฐ ์ž‘์—…์— ๋Œ€ํ•ด ๋กœ๊ทธ์— ์‚ฌ์šฉ์ž ID์™€ ๋ผ์šฐํŠธ ์ด๋ฆ„์ด ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํž˜๋“ค๊ฒŒ ๋งŒ๋“œ๋Š” ํ”ํ•œ ์‹ค์ˆ˜

์ƒ์„ฑ๋œ ํŒŒ์ผ์„ "์ด๋ฒˆ๋งŒ" ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์Œ ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋ง์น˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ž‘์€ ๋ฒ„๊ทธ๋ฅผ ๊ณ ์น˜๊ฑฐ๋‚˜ ํ—ค๋” ์ฒดํฌ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋ฌดํ•ดํ•ด ๋ณด์—ฌ๋„ ๋ช‡ ๋‹ฌ ํ›„์—๋Š” ๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ์™œ ๋ฐ”๊ฟจ๋Š”์ง€ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ํ•จ์ •์€ ์ปค์Šคํ…€ ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์ €๊ธฐ ํฉ์–ด๋†“๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ํ•œ ํŒจํ‚ค์ง€์— ํ—ฌํผ, ๋‹ค๋ฅธ ๊ณณ์— ์ธ์ฆ ์ฒดํฌ, ๋ผ์šฐํŒ… ๊ทผ์ฒ˜์— ๋ฏธ๋“ค์›จ์–ด ํŠธ์œ…, ์ž„์˜ ํด๋”์— ์›์˜คํ”„ ํ•ธ๋“ค๋Ÿฌ. ์•„๋ฌด๋„ ์†Œ์œ ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๊ณ  ๋ชจ๋“  ๋ณ‘ํ•ฉ์ด ๋ณด๋ฌผ์ฐพ๊ธฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์€ ๋ช‡ ๊ฐœ์˜ ๋ช…ํ™•ํ•œ ์žฅ์†Œ์— ๋ชจ์œผ์„ธ์š”.

์ƒ์„ฑ๋œ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ

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

์•ˆ์ „ํ•œ ๊ฒฝ๊ณ„:

  • ์ปค์Šคํ…€ ์—”๋“œํฌ์ธํŠธ์—๋Š” ์ž์ฒด ์š”์ฒญ/์‘๋‹ต DTO ์‚ฌ์šฉ
  • ์ƒ์„ฑ๋œ ๋ ˆ์ด์–ด์™€๋Š” ๋‚ด๋ณด๋‚ธ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํ•จ์ˆ˜๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ๋‚ด๋ถ€ ํƒ€์ž…์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ
  • ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฏธ๋“ค์›จ์–ด ๊ฒฐ์ •์€ HTTP ๊ธฐ๋ณธ(ํ—ค๋”, ๋ฉ”์„œ๋“œ, ๊ฒฝ๋กœ)์— ๊ธฐ๋ฐ˜ํ•˜๊ธฐ

ํ•„์š”ํ•œ ๊ณณ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๋ฏธ๋“ค์›จ์–ด์™€ ๋ผ์šฐํŒ… ๋ฒ„๊ทธ๋Š” ์›์ธ ํŒŒ์•…์— ๋งŽ์€ ์‹œ๊ฐ„์„ ์žก์•„๋จน์Šต๋‹ˆ๋‹ค. ์ž‘์€ ์ง‘์ค‘๋œ ํ…Œ์ŠคํŠธ ๋ช‡ ๊ฐœ๊ฐ€ ๋ช‡ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•ด ์ค๋‹ˆ๋‹ค.

ํ˜„์‹ค์ ์ธ ์˜ˆ: ์š”์ฒญ ๋ฐ”๋””๋ฅผ ๋กœ๊ทธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์‚ฌ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋ฐ”๋””๋ฅผ ์ฝ๋„๋ก ์ถ”๊ฐ€ํ–ˆ๋”๋‹ˆ ์ผ๋ถ€ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋นˆ ๋ฐ”๋””๋ฅผ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํ„ฐ๋ฅผ ํ†ตํ•ด POST๋ฅผ ๋ณด๋‚ด ๊ฐ์‚ฌ ๋ถ€์ž‘์šฉ๊ณผ ํ•ธ๋“ค๋Ÿฌ ๋™์ž‘์„ ๋ชจ๋‘ ํ™•์ธํ•˜๋Š” ์ž‘์€ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ทธ ํšŒ๊ท€๋ฅผ ์žก์•„์ฃผ๊ณ  ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„ ์‹ ๋ขฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‚ฌ์ „ ๋ฆด๋ฆฌ์Šค ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ๋ชจ๋ธ์— ๋‘์„ธ์š”
ํ•„๋“œ, ๊ฒ€์ฆ, ๊ถŒํ•œ์„ ์‹œ๊ฐ์  ๋„๊ตฌ๋กœ ๊ด€๋ฆฌํ•ด ๊ทœ์น™์ด ํ๋ ค์ง€์ง€ ์•Š๊ฒŒ ํ•˜์„ธ์š”.
์‹œ์ž‘ํ•˜๊ธฐ

์ปค์Šคํ…€ ๋ณ€๊ฒฝ์„ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ํ™•์ธํ•˜๋ฉด ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ๋•Œ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ๋‹ค์‹œ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, ์–ด๋””์— ์žˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ• ์ง€ ์ •ํ™•ํžˆ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์ปค์Šคํ…€ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋ช…ํ™•ํ•œ ํŒจํ‚ค์ง€๋‚˜ ํด๋”(์˜ˆ: internal/custom/)์— ๋‘๊ธฐ
  • ์ƒ์„ฑ๋œ ๋ฐฐ์„ ๊ณผ์˜ ์ ‘์ ์„ ํ•œ๋‘ ํŒŒ์ผ๋กœ ์ œํ•œ. ๊ทธ๊ฒƒ๋“ค์„ ๋‹ค๋ฆฌ์ฒ˜๋Ÿผ ์ทจ๊ธ‰: ๋ผ์šฐํŠธ ํ•œ ๋ฒˆ ๋“ฑ๋ก, ๋ฏธ๋“ค์›จ์–ด ํ•œ ๋ฒˆ ๋“ฑ๋ก
  • ๋ฏธ๋“ค์›จ์–ด ์ˆœ์„œ์™€ ์ด์œ  ๋ฌธ์„œํ™”(์˜ˆ: "Auth before rate limiting")
  • ๊ฐ ์ปค์Šคํ…€ ์—”๋“œํฌ์ธํŠธ์— ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๋™์ž‘ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
  • ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ ์ ˆ์ฐจ ์ž‘์„ฑ: ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ, ์ปค์Šคํ…€ ๋ ˆ์ด์–ด ์žฌ์ ์šฉ, ํ…Œ์ŠคํŠธ ์‹คํ–‰, ๋ฐฐํฌ

ํ•˜๋‚˜๋งŒ ํ•œ๋‹ค๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”. "๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค"๋ฅผ "์šฐ๋ฆฌ๊ฐ€ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค"๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

์˜ˆ์‹œ: ๊ฐ์‚ฌ ๋กœ๊น…๊ณผ ํ—ฌ์Šค ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ปค์Šคํ…€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋ฐฐํฌํ•˜๊ธฐ
AppMaster์—์„œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ”„๋กœํ† ํƒ€์ž…ํ•˜๊ณ , ์ ์ ˆํ•œ ์œ„์น˜์— ์ž‘์€ ์ปค์Šคํ…€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ™์ด์„ธ์š”.
์ง€๊ธˆ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์˜ˆ๋ฅผ ๋“ค์–ด AppMaster์—์„œ Go ๋ฐฑ์—”๋“œ๋ฅผ ๋‚ด๋ณด๋ƒˆ๊ณ  ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค: ์š”์ฒญ ID์™€ ๊ด€๋ฆฌ์ž ์•ก์…˜์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊น…, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง์šฉ ๋‹จ์ˆœ /health ์—”๋“œํฌ์ธํŠธ. ๋ชฉํ‘œ๋Š” ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„์—๋„ ๋ณ€๊ฒฝ์„ ์‰ฝ๊ฒŒ ์žฌ์ ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ๋กœ๊น…์€ internal/custom/middleware/ ๊ฐ™์€ ๋ช…ํ™•ํžˆ ์†Œ์œ ๋œ ์œ„์น˜์— ์ฝ”๋“œ๋ฅผ ๋‘์„ธ์š”. ๋ฏธ๋“ค์›จ์–ด๊ฐ€ (1) X-Request-Id๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๊ณ , (2) ์ด๋ฅผ ์š”์ฒญ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•˜๋ฉฐ, (3) ๊ด€๋ฆฌ์ž ๋ผ์šฐํŠธ์— ๋Œ€ํ•ด ํ•œ ์ค„์งœ๋ฆฌ ๊ฐ์‚ฌ ๋กœ๊ทธ(๋ฉ”์„œ๋“œ, ๊ฒฝ๋กœ, ๊ฐ€๋Šฅํ•˜๋ฉด ์‚ฌ์šฉ์ž ID, ๊ฒฐ๊ณผ)๋ฅผ ๋‚จ๊ธฐ๊ฒŒ ํ•˜์„ธ์š”. ์š”์ฒญ ๋ฐ”๋”” ๊ฐ™์€ ํฐ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋คํ”„ํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•˜์„ธ์š”.

๋ผ์šฐํŠธ๊ฐ€ ๋“ฑ๋ก๋˜๋Š” ๊ฐ€์žฅ์ž๋ฆฌ์— ์™€์ด์–ดํ•˜์„ธ์š”. ์ƒ์„ฑ๋œ ๋ผ์šฐํ„ฐ์— ๋‹จ์ผ ์„ค์ • ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ๊ทธ๊ณณ์— ์ž‘์€ ํ›…์„ ์ถ”๊ฐ€ํ•ด ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ด€๋ฆฌ์ž ๊ทธ๋ฃน์—๋งŒ ์ ์šฉํ•˜์„ธ์š”.

/health๋Š” internal/custom/handlers/health.go์— ์•„์ฃผ ์ž‘์€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. 200 OK์™€ ์งง์€ ๋ณธ๋ฌธ ok๋ฅผ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”. ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ์ธ์ฆ์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด ์ธ์ฆ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•˜์„ธ์š”.

๋ณ€๊ฒฝ์„ ์žฌ์ ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ปค๋ฐ‹ ๊ตฌ์กฐ ์˜ˆ:

  • ์ปค๋ฐ‹ 1: internal/custom/middleware/audit.go์™€ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
  • ์ปค๋ฐ‹ 2: ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ด€๋ฆฌ์ž ๋ผ์šฐํŠธ์— ์™€์ด์–ด(๊ฐ€์žฅ ์ž‘์€ diff)
  • ์ปค๋ฐ‹ 3: internal/custom/handlers/health.go ์ถ”๊ฐ€ ๋ฐ /health ๋“ฑ๋ก

์—…๊ทธ๋ ˆ์ด๋“œ๋‚˜ ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„์— ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜์„ธ์š”: ๊ด€๋ฆฌ์ž ๋ผ์šฐํŠธ๊ฐ€ ์—ฌ์ „ํžˆ ์ธ์ฆ์„ ์š”๊ตฌํ•˜๋Š”์ง€, ๊ด€๋ฆฌ์ž ๋กœ๊ทธ์— ์š”์ฒญ ID๊ฐ€ ๋ณด์ด๋Š”์ง€, /health๊ฐ€ ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•˜๋Š”์ง€, ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๊ฐ€๋ฒผ์šด ๋ถ€ํ•˜์—์„œ ๋ˆˆ์— ๋„๋Š” ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”์ง€ ๋“ฑ.

๋‹ค์Œ ๋‹จ๊ณ„: ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์›Œํฌํ”Œ๋กœ ์ •ํ•˜๊ธฐ

๊ฐ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ๋กœ ๋‹ค๋ฃจ์„ธ์š”. ์ปค์Šคํ…€ ์ฝ”๋“œ๋Š” ๋ฎ์–ด์“ฐ๋Š” ๋ฆฌ๋ผ์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ถ”๊ฐ€ ๋ ˆ์ด์–ด์ฒ˜๋Ÿผ ๋А๊ปด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๋ฒˆ์—๋Š” ๋ฌด์—‡์„ ์ฝ”๋“œ๋กœ ๋‘๊ณ  ๋ฌด์—‡์„ ๋…ธ์ฝ”๋“œ ๋ชจ๋ธ์— ๋‘˜์ง€ ๊ฒฐ์ •ํ•˜์„ธ์š”. ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™, ๋ฐ์ดํ„ฐ ํ˜•ํƒœ, ํ‘œ์ค€ CRUD ๋กœ์ง์€ ๋ณดํ†ต ๋ชจ๋ธ์— ๋‘๊ณ , ์ผํšŒ์„ฑ ํ†ตํ•ฉ๊ณผ ํšŒ์‚ฌ๋ณ„ ๋ฏธ๋“ค์›จ์–ด๋Š” ์ปค์Šคํ…€ Go ์ฝ”๋“œ์— ๋‘์„ธ์š”.

AppMaster(appmaster.io)๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์ž‘์—…์„ ์ƒ์„ฑ๋œ Go ๋ฐฑ์—”๋“œ ์ฃผ์œ„์˜ ๊น”๋”ํ•œ ํ™•์žฅ ๋ ˆ์ด์–ด๋กœ ์„ค๊ณ„ํ•˜์„ธ์š”: ๋ฏธ๋“ค์›จ์–ด, ๋ผ์šฐํŠธ, ํ—ฌํผ๋ฅผ ๋ช‡ ๊ฐœ์˜ ํด๋”์— ๋ชจ์•„ ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ„์—๋„ ์˜ฎ๊ฒจ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  ์ƒ์„ฑ๊ธฐ ์†Œ์œ  ํŒŒ์ผ์€ ๊ฑด๋“œ๋ฆฌ์ง€ ๋งˆ์„ธ์š”.

์‹ค์šฉ์ ์ธ ์ตœ์ข… ํ™•์ธ: ๋™๋ฃŒ๊ฐ€ ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ, ์—ฌ๋Ÿฌ๋ถ„์ด ์ ์–ด๋‘” ์ ˆ์ฐจ ์ ์šฉ, ๊ทธ๋ฆฌ๊ณ  ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ 1์‹œ๊ฐ„ ์ด๋‚ด์— ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์›Œํฌํ”Œ๋กœ๋Š” ์œ ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

๋‚ด๋ณด๋‚ธ Go ํŒŒ์ผ์„ ๊ทธ๋ƒฅ ์ง์ ‘ ํŽธ์ง‘ํ•ด๋„ ๋ ๊นŒ์š”?

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

๋‚ด๋ณด๋‚ธ ๋ฆฌํฌ์ง€ํ† ์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์ด ์žฌ์ƒ์„ฑ๋ ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‚˜์š”?

โ€œCode generatedโ€๋‚˜ โ€œDO NOT EDITโ€ ๊ฐ™์€ ์ฃผ์„์ด ์žˆ๋Š” ํŒŒ์ผ์€ ๋‹ค์‹œ ์จ์งˆ ๊ฑฐ๋ผ๊ณ  ๊ฐ€์ •ํ•˜์„ธ์š”. ๋˜ํ•œ ๋งค์šฐ ๊ท ์ผํ•œ ํด๋” ๊ตฌ์กฐ, ๋ฐ˜๋ณต๋˜๋Š” ๋„ค์ด๋ฐ, ์‚ฌ๋žŒ์ด ์“ด ์„ค๋ช…์ด ๊ฑฐ์˜ ์—†๋Š” ๊ณณ๋„ ์ƒ์„ฑ๊ธฐ ํ”์ ์ž…๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ๊ทœ์น™์€ ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข‹์€ โ€œ๋‹จ์ผ ํ†ตํ•ฉ ํฌ์ธํŠธโ€๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋‚˜์š”?

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

์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๊นจ์ง€ ์•Š์œผ๋ฉด์„œ ์ปค์Šคํ…€ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€ํ•˜๋‚˜์š”?

๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ž์ฒด ํŒจํ‚ค์ง€์— ์ž‘๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์š”์ฒญ ID, ๊ฐ์‚ฌ ๋กœ๊น…, ์†๋„ ์ œํ•œ, ํŠน์ˆ˜ ํ—ค๋” ๊ฐ™์€ ์ข์€ ์ฑ…์ž„๋งŒ ๋‘์„ธ์š”. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ผ์šฐํ„ฐ๋‚˜ HTTP ์Šคํƒ ์ƒ์„ฑ ์ง€์ ์—์„œ ํ•œ ๋ฒˆ๋งŒ ๋“ฑ๋กํ•˜์„ธ์š”. ๊ฒฝ๋กœ๋ณ„๋กœ ์ƒ์„ฑ๋œ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์— ํผ๋œจ๋ฆฌ๋ฉด ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ httptest๋กœ ๊ธฐ๋Œ€๋˜๋Š” ํ—ค๋”๋‚˜ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋ฉด ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„ ํšŒ๊ท€๋ฅผ ์žก๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ๋ฐฑ์—”๋“œ๋ฅผ ํฌํฌํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด?

์—”๋“œํฌ์ธํŠธ ๊ณ„์•ฝ์„ ๋จผ์ € ์ •์˜ํ•œ ๋’ค ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ปค์Šคํ…€ ํŒจํ‚ค์ง€์— ๊ตฌํ˜„ํ•˜๊ณ , ๋ฏธ๋“ค์›จ์–ด์™€ ๊ฐ™์€ ํ†ตํ•ฉ ํฌ์ธํŠธ์—์„œ ๋ผ์šฐํŠธ๋ฅผ ๋“ฑ๋กํ•˜์„ธ์š”. ํ•ธ๋“ค๋Ÿฌ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ: ์ž…๋ ฅ ๊ฒ€์ฆ, ๊ธฐ์กด ์„œ๋น„์Šค ํ˜ธ์ถœ, ์ผ๊ด€๋œ ์—๋Ÿฌ ํ˜•ํƒœ ๋ฐ˜ํ™˜. ์ƒ์„ฑ๋œ ํ•ธ๋“ค๋Ÿฌ ๋กœ์ง์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ฉด ์ƒˆ ๋‚ด๋ณด๋‚ด๊ธฐ๋กœ ์˜ฎ๊ธฐ๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

์žฌ๋‚ด๋ณด๋‚ด๊ธฐ ํ›„์— ๋ผ์šฐํŠธ๋‚˜ ๋ฏธ๋“ค์›จ์–ด ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ผ์šฐํŠธ ๋“ฑ๋ก ์ˆœ์„œ๋‚˜ ๊ทธ๋ฃนํ™”, ๋ฏธ๋“ค์›จ์–ด ์ฒด์ธ์„ ๋ฐ”๊พธ๋ฉด ๋ผ์šฐํŠธ๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ์„ ๋ณดํ˜ธํ•˜๋ ค๋ฉด ์•ˆ์ •์ ์ธ ๋“ฑ๋ก ์‹œ์ ์„ ์ด์šฉํ•˜๊ณ , ๋ฏธ๋“ค์›จ์–ด ์ˆœ์„œ๋Š” ๋“ฑ๋ก ๋ผ์ธ ์˜†์— ๋ฌธ์„œํ™”ํ•ด ๋‘์„ธ์š”. ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋ฉด(์˜ˆ: ์ธ์ฆ์ด ๊ฐ์‚ฌ๋ณด๋‹ค ๋จผ์ €) ์˜๋„์ ์œผ๋กœ ์ฝ”๋“œ๋กœ ๋ฐ˜์˜ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆํ•˜์„ธ์š”.

๋…ธ์ฝ”๋“œ ๋ชจ๋ธ๊ณผ ์ปค์Šคํ…€ Go ์ฝ”๋“œ ์‚ฌ์ด์— ๋กœ์ง์ด ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ”ผํ•˜๋‚˜์š”?

๊ฐ™์€ ๊ทœ์น™์„ ๋‘ ๊ณณ์— ๊ตฌํ˜„ํ•˜๋ฉด ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์„œ๋กœ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋น„๊ฐœ๋ฐœ์ž๊ฐ€ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™(ํ•„๋“œ, ๊ฒ€์ฆ, ์›Œํฌํ”Œ๋กœ, ๊ถŒํ•œ)์€ ๋…ธ์ฝ”๋“œ ๋ชจ๋ธ์— ๋„ฃ๊ณ , ๋กœ๊น…, ์ธ์ฆ ํ†ตํ•ฉ, ์†๋„ ์ œํ•œ, ํ—ค๋” ๊ฐ™์€ ์ธํ”„๋ผ concern์€ ์ปค์Šคํ…€ Go ๋ ˆ์ด์–ด์— ๋‘์„ธ์š”. ์ €์žฅ์†Œ๋ฅผ ๋ณด๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋ถ„๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋œ ๋‚ด๋ถ€ ํƒ€์ž…์— ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด?

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

์žฌ๋‚ด๋ณด๋‚ด๊ธฐ์™€ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ข‹์€ Git ์›Œํฌํ”Œ๋กœ๋Š”?

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

์žฌ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ๋ช‡์ผ์น˜ ์ถฉ๋Œ๋กœ ๋ณ€ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„ํšํ•ด์•ผ ํ•˜๋‚˜์š”?

๋ถ„๋ฆฌ๋œ ๋ธŒ๋žœ์น˜์—์„œ ๋“œ๋ผ์ด๋Ÿฐ ์žฌ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ•˜๊ณ , ์ƒˆ๋กœ ๋‚ด๋ณด๋‚ธ ๋ฒ„์ „์„ ๋จผ์ € ๋นŒ๋“œํ•˜์—ฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ธํ•œ ๋’ค ์ปค์Šคํ…€ ๋ ˆ์ด์–ด๋ฅผ ๋‹ค์‹œ ์ ์šฉํ•˜์„ธ์š”. ๊ทธ ํ›„ ํ•ต์‹ฌ ์—”๋“œํฌ์ธํŠธ ๋ช‡ ๊ฐœ์™€ ๊ฐ ์—”๋“œํฌ์ธํŠธ์˜ ์‹คํŒจ ๊ฒฝ๋กœ ํ•˜๋‚˜์”ฉ์„ ๊ฒ€์ฆํ•˜์„ธ์š”. ๋งŒ์•ฝ ์–ด๋–ค ๋ณ€๊ฒฝ์ด ํ†ตํ•ฉ ํฌ์ธํŠธ๋กœ ํ‘œํ˜„๋˜์ง€ ์•Š์œผ๋ฉด, ํ•œ ๋ฒˆ ์ƒˆ ์‹œ์ž„(ํ†ตํ•ฉ ํฌ์ธํŠธ)์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ดํ›„์—๋Š” ๊ทธ๊ณณ์„ ํ†ตํ•ด ๋ณ€๊ฒฝํ•˜์„ธ์š”.

์‰ฌ์šด ์‹œ์ž‘
๋ฉ‹์ง„๋งŒ๋“ค๊ธฐ

๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋กœ AppMaster๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ ์ ˆํ•œ ๊ตฌ๋…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋‹ค
๋‚ด๋ณด๋‚ธ Go ๋ฐฑ์—”๋“œ๋ฅผ ์•ˆ์ „ํ•œ ์ปค์Šคํ…€ ๋ฏธ๋“ค์›จ์–ด๋กœ ํ™•์žฅํ•˜๊ธฐ | AppMaster