๋ด๋ณด๋ธ 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, ํ๋์ ๋ฐฐ์ ์ง์ , ์ฌ์ด ์ฌ๋ด๋ณด๋ด๊ธฐ.
๋จ๊ณ๋ณ: ๋ชจ๋ ๊ฒ์ ํฌํฌํ์ง ์๊ณ ์ ์๋ํฌ์ธํธ ์ถ๊ฐํ๊ธฐ
์์ฑ๋ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ทจ๊ธํ๊ณ ์๋ํฌ์ธํธ๋ ์ฑ์ด ์ํฌํธํ๋ ์์ ์ปค์คํ ํจํค์ง์ ์ถ๊ฐํ์ธ์. ๊ทธ๋์ผ ์ ๊ทธ๋ ์ด๋๊ฐ ํฉ๋ฆฌ์ ์ผ๋ก ์ ์ง๋ฉ๋๋ค.
๋จผ์ ๊ณ์ฝ์ ๋ฌธ์ํํ์ธ์. ์๋ํฌ์ธํธ๊ฐ ๋ฌด์์ ๋ฐ๋๊ฐ(์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, 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์์ 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์๊ฐ ์ด๋ด์ ์ป์ ์ ์๋ค๋ฉด ์ํฌํ๋ก๋ ์ ์ง ๊ฐ๋ฅํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
์์ฑ๊ธฐ ์์ ํ์ผ์ ์ง์ ์์ ํ์ง ๋ง์ธ์. ๋ณ๊ฒฝ ์ฌํญ์ ๋ช
ํํ ์์ ๋๋ ํจํค์ง(์: internal/custom/)์ ๋๊ณ ์๋ฒ ์์ ๊ทผ์ฒ์ ํ ๊ตฐ๋ฐ ํตํฉ ํฌ์ธํธ์์ ์ฐ๊ฒฐํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ด๋ณด๋ด๊ธฐ๊ฐ ์์ฑ ์ฝ๋๋ฅผ ๋๋ถ๋ถ ๊ต์ฒดํ๋๋ผ๋ ์ปค์คํ
๋ ์ด์ด๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
โCode generatedโ๋ โDO NOT EDITโ ๊ฐ์ ์ฃผ์์ด ์๋ ํ์ผ์ ๋ค์ ์จ์ง ๊ฑฐ๋ผ๊ณ ๊ฐ์ ํ์ธ์. ๋ํ ๋งค์ฐ ๊ท ์ผํ ํด๋ ๊ตฌ์กฐ, ๋ฐ๋ณต๋๋ ๋ค์ด๋ฐ, ์ฌ๋์ด ์ด ์ค๋ช ์ด ๊ฑฐ์ ์๋ ๊ณณ๋ ์์ฑ๊ธฐ ํ์ ์ ๋๋ค. ์์ ํ ๊ท์น์ ๊ทธ๋ฐ ๋ถ๋ถ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ทจ๊ธํ๋ ๊ฒ์ ๋๋ค.
ํ๋์ โํํฌโ ํ์ผ์ ์ ์งํด ์ปค์คํ ํจํค์ง๋ฅผ ์ํฌํธํ๊ณ ๋ชจ๋ ๊ฒ์ ๋ฑ๋กํ์ธ์: ๋ฏธ๋ค์จ์ด, ์ถ๊ฐ ๋ผ์ฐํธ, ์์ ์ฐ๊ฒฐ ์ฝ๋ ๋ฑ. ๋ค์ฏ ๊ฐ์ ๋ผ์ฐํ ํ์ผ์ด๋ ์ฌ๋ฌ ์์ฑ ํธ๋ค๋ฌ๋ฅผ ๊ฑด๋๋ฆฌ๊ฒ ๋๋ฉด ์ ๊ทธ๋ ์ด๋๊ฐ ๊ณ ํต์ค๋ฌ์์ง๋๋ค.
๋ฏธ๋ค์จ์ด๋ฅผ ์์ฒด ํจํค์ง์ ์๊ฒ ์์ฑํ๊ณ ์์ฒญ ID, ๊ฐ์ฌ ๋ก๊น
, ์๋ ์ ํ, ํน์ ํค๋ ๊ฐ์ ์ข์ ์ฑ
์๋ง ๋์ธ์. ๊ทธ๋ฐ ๋ค์ ๋ผ์ฐํฐ๋ HTTP ์คํ ์์ฑ ์ง์ ์์ ํ ๋ฒ๋ง ๋ฑ๋กํ์ธ์. ๊ฒฝ๋ก๋ณ๋ก ์์ฑ๋ ํธ๋ค๋ฌ ์์ ํผ๋จ๋ฆฌ๋ฉด ์ฌ๋ด๋ณด๋ด๊ธฐ ํ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ ์ฝ์ต๋๋ค. ๊ฐ๋จํ httptest๋ก ๊ธฐ๋๋๋ ํค๋๋ ์ํ ์ฝ๋๋ฅผ ํ์ธํ๋ฉด ์ฌ๋ด๋ณด๋ด๊ธฐ ํ ํ๊ท๋ฅผ ์ก๊ธฐ ์ข์ต๋๋ค.
์๋ํฌ์ธํธ ๊ณ์ฝ์ ๋จผ์ ์ ์ํ ๋ค ํธ๋ค๋ฌ๋ฅผ ์ปค์คํ ํจํค์ง์ ๊ตฌํํ๊ณ , ๋ฏธ๋ค์จ์ด์ ๊ฐ์ ํตํฉ ํฌ์ธํธ์์ ๋ผ์ฐํธ๋ฅผ ๋ฑ๋กํ์ธ์. ํธ๋ค๋ฌ๋ ๋จ์ํ๊ฒ: ์ ๋ ฅ ๊ฒ์ฆ, ๊ธฐ์กด ์๋น์ค ํธ์ถ, ์ผ๊ด๋ ์๋ฌ ํํ ๋ฐํ. ์์ฑ๋ ํธ๋ค๋ฌ ๋ก์ง์ ๋ณต์ฌํ๋ ๊ฒ์ ํผํ๋ฉด ์ ๋ด๋ณด๋ด๊ธฐ๋ก ์ฎ๊ธฐ๊ธฐ ์ฌ์์ง๋๋ค.
์์ฑ๊ธฐ๊ฐ ๋ผ์ฐํธ ๋ฑ๋ก ์์๋ ๊ทธ๋ฃนํ, ๋ฏธ๋ค์จ์ด ์ฒด์ธ์ ๋ฐ๊พธ๋ฉด ๋ผ์ฐํธ๊ฐ ์ด๋ํ ์ ์์ต๋๋ค. ์์ ์ ๋ณดํธํ๋ ค๋ฉด ์์ ์ ์ธ ๋ฑ๋ก ์์ ์ ์ด์ฉํ๊ณ , ๋ฏธ๋ค์จ์ด ์์๋ ๋ฑ๋ก ๋ผ์ธ ์์ ๋ฌธ์ํํด ๋์ธ์. ์์๊ฐ ์ค์ํ๋ฉด(์: ์ธ์ฆ์ด ๊ฐ์ฌ๋ณด๋ค ๋จผ์ ) ์๋์ ์ผ๋ก ์ฝ๋๋ก ๋ฐ์ํ๊ณ ๊ฐ๋จํ ํ ์คํธ๋ก ๊ฒ์ฆํ์ธ์.
๊ฐ์ ๊ท์น์ ๋ ๊ณณ์ ๊ตฌํํ๋ฉด ์๊ฐ์ด ์ง๋๋ฉด์ ์๋ก ๋ฌ๋ผ์ง๋๋ค. ๋น๊ฐ๋ฐ์๊ฐ ์กฐ์ ํด์ผ ํ๋ ๋น์ฆ๋์ค ๊ท์น(ํ๋, ๊ฒ์ฆ, ์ํฌํ๋ก, ๊ถํ)์ ๋ ธ์ฝ๋ ๋ชจ๋ธ์ ๋ฃ๊ณ , ๋ก๊น , ์ธ์ฆ ํตํฉ, ์๋ ์ ํ, ํค๋ ๊ฐ์ ์ธํ๋ผ concern์ ์ปค์คํ Go ๋ ์ด์ด์ ๋์ธ์. ์ ์ฅ์๋ฅผ ๋ณด๋ ์ฌ๋์๊ฒ ๋ถ๋ฆฌ๊ฐ ๋ช ํํด์ผ ํฉ๋๋ค.
์์ฑ๋ DTO๋ ๋ด๋ถ ๊ตฌ์กฐ์ฒด๋ ๋ด๋ณด๋ผ ๋ ๋ฐ๋ ์ ์์ผ๋ ๊ฒฝ๊ณ์์ ์ด๋ฅผ ๊ฒฉ๋ฆฌํ์ธ์. ์ ๋ ฅ์ ์์ ์ ๋ด๋ถ ๊ตฌ์กฐ์ฒด๋ก ๋ณํํ๊ณ ๋๋ฉ์ธ ๋ก์ง์ ๊ทธ ๊ตฌ์กฐ์ฒด๋ก ์คํํ ๋ค, ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์์ฑ๋ ์๋ต ํ์ ์ผ๋ก ๋ณํํ์ธ์. ํ์ ์ด ๋ฐ๋๋ฉด ์ด๋ํฐ ํ ๊ณณ๋ง ๊ณ ์น๋ฉด ๋ฉ๋๋ค.
์์ฑ๋ ์ ๋ฐ์ดํธ์ ์ปค์คํ ์์ ์ Git์์ ๋ถ๋ฆฌํด ๋ณ๊ฒฝ ์ด์ ๋ฅผ ๋ช ํํ ํ์ธ์. ์ค๋ฌด ํ๋ก์ฐ ์์๋: ์ฌ๋ด๋ณด๋ด๊ธฐํ ์์ฑ ๋ณ๊ฒฝ์ ๋จผ์ ์ปค๋ฐํ๊ณ , ๊ทธ๋ค์ ์ต์ํ์ ์์ด์ด๋ง๊ณผ ์ปค์คํ ์์ ์ ์ปค๋ฐํ๋ ๊ฒ์ ๋๋ค. ๋ํ ๊ฐ ์ปค์คํฐ๋ง์ด์ง์ด ์ด๋์ ์๊ณ ์ ์กด์ฌํ๋์ง ์ ์ ์์ ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ์ ์งํ๋ฉด ๋ค์ ์ ๊ทธ๋ ์ด๋๊ฐ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
๋ถ๋ฆฌ๋ ๋ธ๋์น์์ ๋๋ผ์ด๋ฐ ์ฌ๋ด๋ณด๋ด๊ธฐ๋ฅผ ํ๊ณ , ์๋ก ๋ด๋ณด๋ธ ๋ฒ์ ์ ๋จผ์ ๋น๋ํ์ฌ ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํ ๋ค ์ปค์คํ ๋ ์ด์ด๋ฅผ ๋ค์ ์ ์ฉํ์ธ์. ๊ทธ ํ ํต์ฌ ์๋ํฌ์ธํธ ๋ช ๊ฐ์ ๊ฐ ์๋ํฌ์ธํธ์ ์คํจ ๊ฒฝ๋ก ํ๋์ฉ์ ๊ฒ์ฆํ์ธ์. ๋ง์ฝ ์ด๋ค ๋ณ๊ฒฝ์ด ํตํฉ ํฌ์ธํธ๋ก ํํ๋์ง ์์ผ๋ฉด, ํ ๋ฒ ์ ์์(ํตํฉ ํฌ์ธํธ)์ ์ถ๊ฐํ๊ณ ์ดํ์๋ ๊ทธ๊ณณ์ ํตํด ๋ณ๊ฒฝํ์ธ์.


