CRUD ์ค์ฌ ๋ฐฑ์๋์ API๋ฅผ ์ํ ์ต์ ๊ด์ธก ์ค์
CRUD ์ค์ฌ ๋ฐฑ์๋๋ฅผ ์ํ ์ต์ ๊ด์ธก ์ค์ : ๊ตฌ์กฐํ๋ ๋ก๊ทธ, ํต์ฌ ๋ฉํธ๋ฆญ, ๋๋ฆฐ ์ฟผ๋ฆฌยท์ค๋ฅยท์ฅ์ ๋ฅผ ์กฐ๊ธฐ์ ํฌ์ฐฉํ๋ ์ค์ฉ์ ๊ฒฝ๋ณด.

CRUD ์ค์ฌ ์ฑ์์ ๊ด์ธก์ด ํด๊ฒฐํ๋ ๋ฌธ์
CRUD ์ค์ฌ์ ๋น์ฆ๋์ค ์ฑ์ ๋ณดํต ์ง๋ฃจํ์ง๋ง ๋น์ฉ์ด ํฐ ๋ฐฉ์์ผ๋ก ์คํจํฉ๋๋ค. ๋ชฉ๋ก ํ์ด์ง๊ฐ ๋งค์ฃผ ๋๋ ค์ง๊ณ , ์ ์ฅ ๋ฒํผ์ด ๊ฐ๋ ํ์์์๋๋ฉฐ, ๊ณ ๊ฐ์ง์์๋ ์ฌํ๋์ง ์๋ "๋ฌด์์ 500"์ด ๋ณด๊ณ ๋ฉ๋๋ค. ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ด์ง๋ง ํ๋ก๋์ ์ ๋ฏฟ์์ง์ค๋ฝ์ง ์๊ฒ ๋๊ปด์ง๋๋ค.
์ง์ง ๋น์ฉ์ ๋จ์ํ ์ฌ๊ณ ์์ฒด๊ฐ ์๋๋๋ค. ์ถ์ธกํ๋๋ผ ๋ญ๋น๋๋ ์๊ฐ์ ๋๋ค. ๋ช ํํ ์ ํธ๊ฐ ์์ผ๋ฉด ํ์ "๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ ๊ฑฐ์ผ", "๋คํธ์ํฌ ๋ฌธ์ ์ผ ๊ฑฐ์ผ", "์ ์๋ํฌ์ธํธ ๋๋ฌธ์ผ ๊ฑฐ์ผ"๋ฅผ ์ค๊ฐ๋ฉฐ ์ฌ์ฉ์๋ ๊ธฐ๋ค๋ฆฌ๊ณ ์ ๋ขฐ๋ ๋จ์ด์ง๋๋ค.
๊ด์ธก์ ๊ทธ ์ถ์ธก์ ๋ต์ผ๋ก ๋ฐ๊ฟ๋๋ค. ๊ฐ๋จํ ๋งํด: ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ๋ณด๊ณ ์ ์ผ์ด๋ฌ๋์ง ์ดํดํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ์ํด ์ธ ๊ฐ์ง ์ ํธ ์ ํ์ด ํ์ํฉ๋๋ค:
- ๋ก๊ทธ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฌด์์ ๊ฒฐ์ ํ๋์ง(์ ์ฉํ ์ปจํ ์คํธ์ ํจ๊ป)
- ๋ฉํธ๋ฆญ: ์์คํ ์ด ์๊ฐ์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๋์ํ๋์ง(์ง์ฐ, ์ค๋ฅ์จ, ํฌํ๋)
- ํธ๋ ์ด์ค(์ ํ์ ): ์๋น์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ฐ์์ ์๊ฐ์ด ์ด๋์ ์๋น๋์๋์ง
CRUD ์ฑ๊ณผ API ์๋น์ค์์๋ ํ๋ คํ ๋์๋ณด๋๋ณด๋ค๋ ๋น ๋ฅธ ์ง๋จ์ด ๋ ์ค์ํฉ๋๋ค. "์ฒญ๊ตฌ์ ์์ฑ" ํธ์ถ์ด ๋๋ ค์ง ๋ ๊ทธ ์ง์ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ๋๋ฌธ์ธ์ง, ์ธ๋ถ API ๋๋ฌธ์ธ์ง, ๊ณผ๋ถํ๋ ์์ปค ๋๋ฌธ์ธ์ง ๋ช ์๊ฐ ์๋ ๋ช ๋ถ ์์ ์ ์ ์์ด์ผ ํฉ๋๋ค.
์ต์ํ์ ์ค์ ์ ๋์ ๋ ์ ์ค์ ๋ก ๋ตํด์ผ ํ๋ ์ง๋ฌธ๋ค์์ ์์ํฉ๋๋ค:
- ์ด๋ค ์๋ํฌ์ธํธ๊ฐ ๋๊ตฌ์๊ฒ ์คํจํ๊ฑฐ๋ ๋๋ฆฐ๊ฐ?
- ์ด๊ฒ์ด ํธ๋ํฝ ๊ธ์ฆ์ธ๊ฐ ์๋๋ฉด ํ๊ท(์ ๋ฆด๋ฆฌ์ค)์ธ๊ฐ?
- ๋ณ๋ชฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ๊ฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ธ๊ฐ?
- ์ง๊ธ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ์ฃผ๊ณ ์๋๊ฐ, ์๋๋ฉด ๋จ์ง ๋ก๊ทธ๋ง ์ฑ์ฐ๊ณ ์๋๊ฐ?
์๋ฅผ ๋ค์ด AppMaster๊ฐ Go ์๋น์ค๋ฅผ ์์ฑํ๋ ๋ฑ ์์ฑ๋ ์คํ์ผ๋ก ๋ฐฑ์๋๋ฅผ ๋น๋ํ๋ค๋ฉด ๊ฐ์ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค: ์๊ฒ ์์ํ๊ณ , ์ ํธ๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ๋ฉฐ, ์ค์ ์ฌ๊ณ ๊ฐ ๋ฐ์ํด ์ถ๊ฐ ๋ฉํธ๋ฆญ์ด๋ ๊ฒฝ๋ณด๊ฐ ์๊ฐ์ ์ ์ฝํ์ ๊ฒ์ด๋ผ ์ฆ๋ช ๋๊ธฐ ์ ๊น์ง๋ ์ ์ ํธ๋ฅผ ์ถ๊ฐํ์ง ๋ง์ธ์.
์ต์ํ์ ์ค์ : ํ์ํ ๊ฒ๊ณผ ๊ฑด๋๋ธ ์ ์๋ ๊ฒ
์ต์ ๊ด์ธก ๊ตฌ์ฑ์ ๋ก๊ทธ, ๋ฉํธ๋ฆญ, ์๋ฆผ ์ธ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํธ๋ ์ด์ค๋ ์ ์ฉํ์ง๋ง ๋๋ถ๋ถ์ CRUD ์ค์ฌ ๋น์ฆ๋์ค ์ฑ์๋ ๋ณด๋์ค ์์ค์ ๋๋ค.
๋ชฉํ๋ ๋จ์ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ธ์ ์คํจํ๋์ง(1), ์ ์คํจํ๋์ง(2), ์์คํ ์ ์ด๋์์ ๋ฐ์ํ๋์ง(3)๋ฅผ ์์์ผ ํฉ๋๋ค. ์ด ์ง๋ฌธ๋ค์ ๋น ๋ฅด๊ฒ ๋ตํ์ง ๋ชปํ๋ฉด ์ธ๋ฐ์๋ ์ถ์ธก๊ณผ ๋ ผ์์ ์๊ฐ์ ๋ญ๋นํ๊ฒ ๋ฉ๋๋ค.
๋ณดํต ์ด ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ํ์ํ ์ต์ ์ ํธ ์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ชจ๋ ์์ฒญ๊ณผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ ๋ํ ๊ตฌ์กฐํ๋ ๋ก๊ทธ(๊ฒ์์ ์ํด
request_id, ์ฌ์ฉ์, ์๋ํฌ์ธํธ, ์ค๋ฅ ํฌํจ) - ๋ช ๊ฐ์ง ํต์ฌ ๋ฉํธ๋ฆญ: ์์ฒญ๋ฅ , ์ค๋ฅ์จ, ์ง์ฐ, DB ์๊ฐ
- ์ฌ์ฉ์ ์ํฅ์ ์ฐ๋๋ ๊ฒฝ๋ณด(๋ด๋ถ ๊ฒฝ๊ณ ์ ๋ถ๊ฐ ์๋๋ผ ์ค๋ฅ ๊ธ์ฆ ๋๋ ์ง์์ ๋๋ฆฐ ์๋ต์ ์ค์ )
์ฆ์๊ณผ ์์ธ์ ๋ถ๋ฆฌํ๋ฉด ์กฐ์ฌํ๊ธฐ ์์ํฉ๋๋ค. ์ฆ์์ ์ฌ์ฉ์๊ฐ ๋๋ผ๋ ๊ฒ์ ๋๋ค: 500, ํ์์์, ๋๋ฆฐ ํ์ด์ง. ์์ธ์ ์ด๋ฅผ ๋ง๋๋ ์ค์ ์์ธ์ ๋๋ค: ๋ฝ ๊ฒฝ์, ํฌํ๋ ์ปค๋ฅ์ ํ, ์ ํํฐ ์ถ๊ฐ ํ ๋๋ ค์ง ์ฟผ๋ฆฌ. ์ฆ์์ ๋ํด ๊ฒฝ๋ณด๋ฅผ ์ค์ ํ๊ณ ์์ธ ์ ํธ๋ก ์กฐ์ฌํ์ธ์.
์ค์ฉ์ ์ธ ๊ท์น ํ๋: ์ค์ํ ์ ํธ๋ฅผ ๋ณผ ๋จ์ผ ์์น๋ฅผ ์ ํํ์ธ์. ๋ก๊ทธ ๋๊ตฌ, ๋ฉํธ๋ฆญ ๋๊ตฌ, ๋ณ๋ ์๋ฆผ ์ธ๋ฐ์ค๋ฅผ ๊ณ์ ์๋ค๊ฐ๋ค ํ๋ฉด ๊ฐ์ฅ ๊ธํ ๋ ์๋๊ฐ ๋๋ ค์ง๋๋ค.
์๋ฐ ์ํฉ์์๋ ์ฝ๊ธฐ ์ฌ์ด ๊ตฌ์กฐํ๋ ๋ก๊ทธ
๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๊ฐ์ฅ ๋น ๋ฅธ ๋ต์ ๊ฒฝ๋ก๋ ๋ณดํต: "์ด ์ฌ์ฉ์๊ฐ ์ ํํ ์ด๋ค ์์ฒญ์ ํ๋?" ์ ๋๋ค. ๊ทธ๋์ ์์ ์ ์ธ ์๊ด ID๋ ๊ฑฐ์ ๋ชจ๋ ๋ค๋ฅธ ๋ก๊ทธ ๊ฐ์ ๋ณด๋ค ๋ ์ค์ํฉ๋๋ค.
ํ๋์ ํ๋ ์ด๋ฆ(์ผ๋ฐ์ ์ผ๋ก request_id)์ ์ ํํ๊ณ ํ์๋ก ์ทจ๊ธํ์ธ์. ์ฃ์ง(API ๊ฒ์ดํธ์จ์ด๋ ์ฒซ ํธ๋ค๋ฌ)์์ ์์ฑํ๊ณ ๋ด๋ถ ํธ์ถ๋ก ์ ๋ฌํ๋ฉฐ ๋ชจ๋ ๋ก๊ทธ ๋ผ์ธ์ ํฌํจํ์ธ์. ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์๋ ์์
์คํ๋ง๋ค ์๋ก์ด request_id๋ฅผ ๋ง๋ค๊ณ API ํธ์ถ์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ ๊ฒฝ์ฐ parent_request_id๋ฅผ ์ ์ฅํ์ธ์.
๋ก๊ทธ๋ ์์ ํ ์คํธ๊ฐ ์๋๋ผ JSON์ผ๋ก ๋จ๊ธฐ์ธ์. ํผ๊ณคํ๊ณ ์คํธ๋ ์ค๋ฅผ ๋ฐ๋ ์ํฉ์์ ๋ก๊ทธ๋ฅผ ๊ฒ์ํ๊ณ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ํจ์ฌ ์ ๋ฆฌํฉ๋๋ค.
CRUD ์ค์ฌ API ์๋น์ค์๋ ๊ฐ๋จํ ํ๋ ์ธํธ๊ฐ ๋๋ถ๋ถ ์ถฉ๋ถํฉ๋๋ค:
timestamp,level,service,envrequest_id,route,method,statusduration_ms,db_query_counttenant_id๋๋account_id(๊ฐ์ธ ๋ฐ์ดํฐ๊ฐ ์๋ ์์ ํ ์๋ณ์)
๋ก๊ทธ๋ "์ด๋ค ๊ณ ๊ฐ์ ์ด๋ค ํ๋ฉด์ธ์ง"๋ฅผ ์ขํ๋๋ก ๋์์ผ ํ๋ฉฐ ๋ฐ์ดํฐ ์ ์ถ๋ก ์ด์ด์ ธ์๋ ์ ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฆ, ์ด๋ฉ์ผ, ์ ํ๋ฒํธ, ์ฃผ์, ํ ํฐ ๋๋ ์ ์ฒด ์์ฒญ ๋ณธ๋ฌธ์ ๊ธฐ๋กํ์ง ๋ง์ธ์. ๋ ๊น์ ์ธ๋ถ๊ฐ ํ์ํ๋ฉด ํ์ํ ๋์๋ง ๋ง์คํน๊ณผ ํจ๊ป ๊ธฐ๋กํ์ธ์.
CRUD ์์คํ
์์ ๋น ๋ฅด๊ฒ ํจ๊ณผ๋ฅผ ๋ณด๋ ๋ ํ๋๋ duration_ms์ db_query_count์
๋๋ค. ์ด๋ค์ ํธ๋ ์ด์ฑ์ ์ถ๊ฐํ๊ธฐ ์ ์๋ ๋๋ฆฐ ํธ๋ค๋ฌ์ ์ค์๋ก ๋ฐ์ํ N+1 ํจํด์ ์ก์๋
๋๋ค.
๋ก๊ทธ ๋ ๋ฒจ์ ์ ์ํด ๋ชจ๋๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋๋ก ํ์ธ์:
info: ์์๋๋ ์ด๋ฒคํธ(์์ฒญ ์๋ฃ, ์์ ์์)warn: ๋น์ ์์ ์ด์ง๋ง ๋ณต๊ตฌ ๊ฐ๋ฅํ ์ํฉ(๋๋ฆฐ ์์ฒญ, ์ฌ์๋ ์ฑ๊ณต)error: ์คํจํ ์์ฒญ ๋๋ ์์ (์์ธ, ํ์์์, ์์กด์ฑ ์คํจ)
AppMaster ๊ฐ์ ํ๋ซํผ์ผ๋ก ๋ฐฑ์๋๋ฅผ ์์ฑํ๋ค๋ฉด ์์ฑ๋ ์๋น์ค ์ ๋ฐ์์ ๊ฐ์ ํ๋๋ช
์ ์ ์งํด request_id๋ก ๊ฒ์ํ๋ฉด ์ด๋์๋ ์๋ํ๊ฒ ํ์ธ์.
CRUD ๋ฐฑ์๋์ API์ ๊ฐ์ฅ ์ค์ํ ํต์ฌ ๋ฉํธ๋ฆญ
CRUD ์ค์ฌ ์ฑ์ ๋๋ถ๋ถ ์ฌ๊ณ ๋ ์ต์ํ ๋ชจ์์ ๊ฐ์ง๋๋ค: ํ๋ ๊ฐ ์๋ํฌ์ธํธ๊ฐ ๋๋ ค์ง๊ณ DB๊ฐ ์คํธ๋ ์ค๋ฅผ ๋ฐ์ผ๋ฉฐ ์ฌ์ฉ์๋ ์คํผ๋๋ ํ์์์์ ๋ด ๋๋ค. ๋ฉํธ๋ฆญ์ ์ด ์ด์ผ๊ธฐ๋ฅผ ๋ช ๋ถ ๋ด์ ๋ช ํํ ๋ณด์ฌ์ค์ผ ํฉ๋๋ค.
์ต์ ์ธํธ๋ ๋ณดํต ๋ค์ฏ ์์ญ์ ์ปค๋ฒํฉ๋๋ค:
- ํธ๋ํฝ: ์ด๋น ์์ฒญ ์(๋ผ์ฐํธ๋ณ ๋๋ ์๋น์ค๋ณ ์ต์), ์ํ ์ฝ๋ ํด๋์ค๋ณ ์์ฒญ๋ฅ (2xx, 4xx, 5xx)
- ์ค๋ฅ: 5xx ๋น์จ, ํ์์์ ์, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ค์๋ก ๋ฐ์ํ๋ ๋น์ฆ๋์ค ์ค๋ฅ(4xx)๋ฅผ ๋ณ๋๋ก ๊ธฐ๋ก
- ์ง์ฐ(ํผ์ผํ์ผ): ์ผ๋ฐ ๊ฒฝํ์ ์ํ p50๊ณผ ๋ฌธ์ ๊ฐ ์๋ค๋ ์ ํธ๋ก p95(๋๋ก๋ p99)
- ํฌํ๋: CPU์ ๋ฉ๋ชจ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ฑ ํน์ ์ ํฌํ๋(์์ปค ํ์ฉ๋ฅ , ๋ ธ์ถ ๊ฐ๋ฅํ ์ค๋ ๋/๊ณ ๋ฃจํด ์๋ ฅ ๋ฑ)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ ฅ: ์ฟผ๋ฆฌ ์ง์ฐ p95, ์ปค๋ฅ์ ํ ์ฌ์ฉ๋(์ฌ์ฉ ์ค vs ์ต๋), ๋ฝ ๋๊ธฐ ์๊ฐ(๋๋ ๋ฝ ๋๊ธฐ ์ฟผ๋ฆฌ ์นด์ดํธ)
๋ ๊ฐ์ง ์ธ๋ถ๊ฐ ๋ฉํธ๋ฆญ์ ํจ์ฌ ๋ ์ค์ฉ์ ์ผ๋ก ๋ง๋ญ๋๋ค.
์ฒซ์งธ, ๋ํํ API ์์ฒญ๊ณผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ๋ถ๋ฆฌํ์ธ์. ๋๋ฆฐ ์ด๋ฉ์ผ ๋ฐ์ก์๋ ์นํ ์ฌ์๋ ๋ฃจํ๊ฐ CPU, DB ์ปค๋ฅ์ ๋๋ ์์๋ฐ์ด๋ ๋คํธ์ํฌ๋ฅผ ์ ์ํด API๋ฅผ "๋ฌด์์๋ก ๋๋ฆฌ๊ฒ" ๋ง๋ค ์ ์์ต๋๋ค. ํ, ์ฌ์๋, ์์ ์ง์ ์๊ฐ์ ๋ณ๋์ ์๊ณ์ด๋ก ์ถ์ ํ์ธ์.
๋์งธ, ๋์๋ณด๋์ ์๋ฆผ์ ํญ์ ๋ฒ์ /๋น๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ถ์ด์ธ์. ์์ฑ๋ ๋ฐฑ์๋๋ฅผ ๋ฐฐํฌํ์ ๋(์: AppMaster๋ก ์ฝ๋๋ฅผ ์ฌ์์ฑํ ํ) ์ค๋ฅ์จ์ด๋ p95 ์ง์ฐ์ด ๋ฐฐํฌ ์งํ ๊ธ์ฆํ๋์ง ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์์ด์ผ ํฉ๋๋ค.
๋จ์ํ ๊ท์น: ๋ฉํธ๋ฆญ์ด ๋ค์ ์กฐ์น(๋กค๋ฐฑ, ์ค์ผ์ผ๋ง, ์ฟผ๋ฆฌ ์์ , ์์ ์ ์ง)๋ฅผ ์๋ ค์ฃผ์ง ๋ชปํ๋ค๋ฉด ์ต์ ์ธํธ์ ํฌํจ๋์ง ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ํธ: CRUD ๊ณ ํต์ ํํ ๊ทผ๋ณธ ์์ธ
CRUD ์ค์ฌ ์ฑ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ "๋๋ฆฌ๊ฒ ๋๊ปด์ง๋" ์ํ๊ฐ ์ค์ ์ฌ์ฉ์ ๊ณ ํต์ผ๋ก ์ด์ด์ง๋ ๊ณณ์ ๋๋ค. ์ต์ํ์ ์ค์ ์ ๋ณ๋ชฉ์ด PostgreSQL์ธ์ง(์ฑ ์ฝ๋๊ฐ ์๋) ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ข ๋ฅ์ DB ๋ฌธ์ ์ธ์ง ๋ถ๋ช ํ ์๋ ค์ค์ผ ํฉ๋๋ค.
PostgreSQL์์ ๋จผ์ ์ธก์ ํ ๊ฒ
์์ญ ๊ฐ์ ๋์๋ณด๋๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ฌ๊ณ ๋ฅผ ์ค๋ช ํ๋ ์ ํธ๋ถํฐ ์์ํ์ธ์:
- ๋๋ฆฐ ์ฟผ๋ฆฌ ๋น์จ๊ณผ p95/p99 ์ฟผ๋ฆฌ ์๊ฐ(์์ ๋๋ฆฐ ์ฟผ๋ฆฌ ํฌํจ)
- ๋ฝ ๋๊ธฐ์ ๋ฐ๋๋ฝ(๋๊ฐ ๋๊ตฌ๋ฅผ ๋ธ๋กํนํ๋์ง)
- ์ปค๋ฅ์ ์ฌ์ฉ๋(ํ์ฑ ์ปค๋ฅ์ vs ํ ํ๊ณ, ์คํจํ ์ปค๋ฅ์ )
- ๋์คํฌ ๋ฐ I/O ์๋ ฅ(์ง์ฐ, ํฌํ๋, ์ฌ์ ๊ณต๊ฐ)
- ๋ณต์ ์ง์ฐ(์ฝ๊ธฐ ๋ ํ๋ฆฌ์นด๋ฅผ ์ด์ ์ค์ด๋ผ๋ฉด)
์ฑ ์๊ฐ๊ณผ DB ์๊ฐ์ ๋ถ๋ฆฌํ์ธ์
API ๋ ์ด์ด์ ์ฟผ๋ฆฌ ํ์ด๋ฐ ํ์คํ ๊ทธ๋จ์ ์ถ๊ฐํ๊ณ ์๋ํฌ์ธํธ๋ ์ ์ค์ผ์ด์ค๋ก ํ๊ทธํ์ธ์(์: GET /customers, "search orders", "update ticket status"). ์ด๋ ๊ฒ ํ๋ฉด ์๋ํฌ์ธํธ๊ฐ ๋ง์ ์์ ์ฟผ๋ฆฌ ๋๋ฌธ์ ๋๋ฆฐ์ง, ํ๋์ ํฐ ์ฟผ๋ฆฌ ๋๋ฌธ์ธ์ง ์ ์ ์์ต๋๋ค.
N+1 ํจํด์ ์กฐ๊ธฐ์ ํฌ์ฐฉํ์ธ์
CRUD ํ๋ฉด์ ์ข ์ข N+1 ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฐํฉ๋๋ค: ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ ํ๋, ๊ทธ ๋ค์ ๊ฐ ํ๋ง๋ค ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ. ์์ฒญ ์๋ ์ผ์ ํ๋ฐ ์์ฒญ๋น DB ์ฟผ๋ฆฌ ์๊ฐ ๋์ด๋๋ ์๋ํฌ์ธํธ๋ฅผ ๊ด์ฐฐํ์ธ์. ๋ชจ๋ธ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ํ์น ํจํด์ ํ๋ํด์ผ ํ๋ ์์ญ์ด ํํ๊ฒ ์ฌ๊ธฐ์์ ๋์ต๋๋ค.
์ด๋ฏธ ์บ์๊ฐ ์๋ค๋ฉด ํํธ์จ์ ์ถ์ ํ์ธ์. ๋ ์ข์ ์ฐจํธ๋ฅผ ์ํด ์บ์๋ฅผ ์ถ๊ฐํ์ง๋ ๋ง์ธ์.
์คํค๋ง ๋ณ๊ฒฝ๊ณผ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํ ์ฐฝ์ผ๋ก ์ทจ๊ธํ์ธ์. ์์ยท์ข ๋ฃ ์๊ฐ์ ๊ธฐ๋กํ๊ณ ํด๋น ์ฐฝ ๋์ ๋ฝ, ์ฟผ๋ฆฌ ์๊ฐ, ์ปค๋ฅ์ ์ค๋ฅ์ ๊ธ์ฆ์ ๊ด์ฐฐํ์ธ์.
์ ์ ํ ์ฌ๋์ ๊นจ์ฐ๋ ์๋ฆผ ์ค๊ณ
์๋ฆผ์ ์ฐจํธ๊ฐ ๋ฐ์๋ค๋ ์ฌ์ค์ด ์๋๋ผ ์ค์ ์ฌ์ฉ์ ๋ฌธ์ ๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํฉ๋๋ค. CRUD ์ค์ฌ ์ฑ์์๋ ์ฌ์ฉ์๊ฐ ๋๋ผ๋ ๊ฒ(์ค๋ฅ์ ๋๋ฆผ)์ ๊ฐ์ํ๋ ๊ฒ๋ถํฐ ์์ํ์ธ์.
์ฒ์์ ์ธ ๊ฐ๋ง ์ถ๊ฐํ๋ค๋ฉด ๋ค์์ ๊ถํฉ๋๋ค:
- 5xx ๋น์จ ์์น
- ์ง์์ ์ธ p95 ์ง์ฐ
- ์ฑ๊ณต ์์ฒญ์ ๊ฐ์์ค๋ฐ ๊ฐ์
๊ทธ๋ค์์ "๊ฐ๋ฅ์ฑ ๋์ ์์ธ" ์๋ฆผ์ ๋ช ๊ฐ ์ถ๊ฐํ์ธ์. CRUD ๋ฐฑ์๋๋ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์คํจํฉ๋๋ค: DB ์ปค๋ฅ์ ๊ณ ๊ฐ, ๋ฐฑ๊ทธ๋ผ์ด๋ ํ ์์, ๋จ์ผ ์๋ํฌ์ธํธ์ ํ์์์์ผ๋ก ์ ์ฒด API๊ฐ ๋๋ ค๊ฐ๋ ๊ฒฝ์ฐ ๋ฑ์ ๋๋ค.
์๊ณ๊ฐ: ๊ธฐ์ค์ + ์ฌ์ , ์ถ์ธก ์๋
"p95 > 200ms" ๊ฐ์ ํ๋์ฝ๋ฉ ์์น๋ ํ๊ฒฝ๋ง๋ค ์ ๋ง์ง ์์ต๋๋ค. ์ ์ ์ฃผ๊ฐ์ ์ธก์ ํ ๋ค ์ ์ ๋ฒ์ ๋ฐ๋ก ์์ ์ฌ์ ๋ฅผ ๋๊ณ ์๋ฆผ์ ์ค์ ํ์ธ์. ์: p95๊ฐ ํต์ ์ ๋ฌด์๊ฐ์ 350โ450ms๋ผ๋ฉด 10๋ถ ๋์ 700ms๋ฅผ ๋์ผ๋ฉด ์๋ฆผ์ ์ธ๋ฆฌ์ธ์. 5xx๊ฐ ๋ณดํต 0.1โ0.3%๋ผ๋ฉด 5๋ถ ๋์ 2%์ผ ๋ ํ์ด์ง๋ฅผ ์ธ๋ฆฌ๋ ์์ ๋๋ค.
์๊ณ๊ฐ์ ์์ ์ ์ผ๋ก ์ ์งํ์ธ์. ๋งค์ผ ์กฐ์ ํ์ง ๋ง๊ณ ์ฌ๊ณ ์ดํ ์ค์ ๊ฒฐ๊ณผ์ ์ฐ๊ฒฐํ ์ ์์ ๋ ์กฐ์ ํ์ธ์.
ํ์ด์ง ๋ฐ์ vs ํฐ์ผ: ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ์ธ์
๋ ๋จ๊ณ ์ฌ๊ฐ๋๋ฅผ ์ฌ์ฉํด ์ ํธ์ ๋ํ ์ ๋ขฐ๋ฅผ ์ ์งํ์ธ์:
- ํ์ด์ง: ์ฌ์ฉ์๊ฐ ์ฐจ๋จ๋๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์ํํ ๋(๋์ 5xx, API ํ์์์, DB ์ปค๋ฅ์ ํ ๊ฑฐ์ ๊ณ ๊ฐ)
- ํฐ์ผ ์์ฑ: ์ ํ๋๊ณ ์์ผ๋ ๊ธด๊ธํ์ง ์์ ๋(์์ํ ์์นํ๋ p95, ํ ๋ฐฑ๋ก๊ทธ ์ฆ๊ฐ, ๋์คํฌ ์ฌ์ฉ๋ ์ถ์ธ ์์น)
๋ฐฐํฌ ์ฐฝ์ด๋ ๊ณํ๋ ์ ์ง๋ณด์ ๋์์ ์๋ฆผ์ ์ผ์ ์ค๋จํ์ธ์.
์๋ฆผ์ ์คํ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. "๋จผ์ ํ์ธํ ๊ฒ"(์์ ์๋ํฌ์ธํธ, DB ์ปค๋ฅ์ , ์ต๊ทผ ๋ฐฐํฌ)๊ณผ "๋ฌด์์ด ๋ณ๊ฒฝ๋์๋๊ฐ"(์ ๋ฆด๋ฆฌ์ค, ์คํค๋ง ์ ๋ฐ์ดํธ)๋ฅผ ํฌํจํ์ธ์. AppMaster๋ก ๋น๋ํ๋ค๋ฉด ์ต๊ทผ์ ์ฌ์์ฑยท๋ฐฐํฌ๋ ๋ฐฑ์๋๋ ๋ชจ๋์ ๊ธฐ๋กํด ๋๋ฉด ๋น ๋ฅธ ๋จ์๊ฐ ๋ฉ๋๋ค.
๋น์ฆ๋์ค ์ฑ์ ์ํ ๊ฐ๋จํ SLO(๋ฐ ๊ฒฝ๋ณด์ ๋ฏธ์น๋ ์ํฅ)
๋ฌด์์ด "์ถฉ๋ถํ ์ข์์ง"๋ฅผ ์ ํ๋ฉด ์ต์ ์ค์ ์ด ๋ ์ฌ์์ง๋๋ค. ์ด๊ฒ์ด SLO์ ๋ชฉ์ ์ ๋๋ค: ๋ง์ฐํ ๋ชจ๋ํฐ๋ง์ ๊ตฌ์ฒด์ ๊ฒฝ๋ณด๋ก ๋ฐ๊ฟ ์ค๋๋ค.
์ฌ์ฉ์๊ฐ ๋๋ผ๋ ๊ฒ๊ณผ ์ง์ ์ฐ๊ฒฐ๋๋ SLI๋ถํฐ ์์ํ์ธ์: ๊ฐ์ฉ์ฑ(์ฌ์ฉ์๊ฐ ์์ฒญ์ ์๋ฃํ ์ ์๋๊ฐ), ์ง์ฐ(๋์์ด ์ผ๋ง๋ ๋นจ๋ฆฌ ์๋ฃ๋๋๊ฐ), ์ค๋ฅ์จ(์์ฒญ์ด ์ผ๋ง๋ ์์ฃผ ์คํจํ๋๊ฐ).
SLO๋ ๋ผ์ฐํธ๋ณ์ด ์๋๋ผ ์๋ํฌ์ธํธ ๊ทธ๋ฃน๋ณ๋ก ์ค์ ํ์ธ์. CRUD ์ค์ฌ ์ฑ์์๋ ์ฝ๊ธฐ(GET/๋ชฉ๋ก/๊ฒ์), ์ฐ๊ธฐ(์์ฑ/์์ /์ญ์ ), ์ธ์ฆ(login/token refresh)์ฒ๋ผ ๊ทธ๋ฃนํํ๋ฉด ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด SLO๊ฐ ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์์ SLO:
- ๋ด๋ถ CRUD ์ฑ(๊ด๋ฆฌ ํฌํธ): ์๋ณ ๊ฐ์ฉ์ฑ 99.5%, ์ฝ๊ธฐ ์์ฒญ์ 95%๊ฐ 800ms ๋ฏธ๋ง, ์ฐ๊ธฐ ์์ฒญ์ 95%๊ฐ 1.5s ๋ฏธ๋ง, ์ค๋ฅ์จ 0.5% ๋ฏธ๋ง
- ๊ณต๊ฐ API: ์๋ณ ๊ฐ์ฉ์ฑ 99.9%, ์ฝ๊ธฐ ์์ฒญ์ 99%๊ฐ 400ms ๋ฏธ๋ง, ์ฐ๊ธฐ ์์ฒญ์ 99%๊ฐ 800ms ๋ฏธ๋ง, ์ค๋ฅ์จ 0.1% ๋ฏธ๋ง
์๋ฌ ๋ฒ์ง์ SLO์์ ํ์ฉ๋๋ "๋์ ์๊ฐ"์ ๋๋ค. ์: ์ 99.9% ๊ฐ์ฉ์ฑ์ ํ ๋ฌ์ ์ฝ 43๋ถ์ ๋ค์ดํ์์ ํ์ฉํฉ๋๋ค. ๋ฒ์ง์ ์ผ์ฐ ๋ค ์จ๋ฒ๋ ธ๋ค๋ฉด ์์ ์ฑ์ด ํ๋ณต๋ ๋๊น์ง ์ํํ ๋ณ๊ฒฝ์ ๋ฉ์ถ์ธ์.
SLO๋ ๋ฌด์์ด ๊ฒฝ๋ณด๋ฅผ ๋ฐ์์ง(์ฆ์ ํ์ด์ง), ๋ฌด์์ด ๋์๋ณด๋ ํธ๋ ๋์ธ์ง ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ ์ค๋๋ค. ์๋ฌ ๋ฒ์ง์ ๋น ๋ฅด๊ฒ ์์งํ ๋(์ฌ์ฉ์๊ฐ ์ค์ ๋ก ์คํจํ ๋) ๊ฒฝ๋ณด๋ฅผ ์ธ๋ฆฌ์ธ์, ๋จ์ํ ์งํ๊ฐ ์ฝ๊ฐ ๋๋น ์ก๋ค๊ณ ๊ฒฝ๋ณด๋ฅผ ์ธ๋ฆฌ์ง๋ ๋ง์ธ์.
AppMaster๋ก ๋น ๋ฅด๊ฒ ๋ฐฑ์๋๋ฅผ ๊ตฌ์ถํ๋ค๋ฉด ๊ตฌํ์ด ๋ฐ๋์ด๋ SLO์ ์ฌ์ฉ์ ์ํฅ์ ์ง์คํ๋๋ก ๋์์ค๋๋ค.
๋จ๊ณ๋ณ: ํ๋ฃจ ๋ง์ ์ต์ ๊ด์ธก ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ
์ฌ์ฉ์๊ฐ ๊ฐ์ฅ ์์ฃผ ์ ํ๋ ์์คํ ์กฐ๊ฐ๋ถํฐ ์์ํ์ธ์. ๋๋ฆฌ๊ฑฐ๋ ๊ณ ์ฅ ๋๋ฉด ์ ์ฒด ์ฑ์ด ๋ค์ด๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋ API ํธ์ถ๊ณผ ์์ ์ ์ ํํ์ธ์.
์์ ์๋ํฌ์ธํธ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ ์ผ์ธ์. CRUD ๋น์ฆ๋์ค ์ฑ์์๋ ๋ณดํต ๋ก๊ทธ์ธ, ๋ชฉ๋ก/๊ฒ์, ์์ฑ/์์ , ํ๋์ ๋ด๋ณด๋ด๊ธฐ/๊ฐ์ ธ์ค๊ธฐ ์์ ์ด ํด๋นํฉ๋๋ค. AppMaster๋ก ๋ฐฑ์๋๋ฅผ ๋น๋ํ๋ค๋ฉด ์์ฑ๋ ์๋ํฌ์ธํธ์ ์ค์ผ์ค์ด๋ ์นํ ์ผ๋ก ์คํ๋๋ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ํ๋ฆ๋ ํฌํจํ์ธ์.
ํ๋ฃจ ๊ณํ ์์
- 1์๊ฐ: ์์ 5๊ฐ ์๋ํฌ์ธํธ์ 1โ2๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ ํํ์ธ์. "์ข์ ์ํ"์ ๊ธฐ์ค(ํ๊ท ์ง์ฐ, ๊ธฐ๋ ์ค๋ฅ์จ, ์ ์ DB ์๊ฐ)์ ์ ์ผ์ธ์.
- 2โ3์๊ฐ: ์ผ๊ด๋ ํ๋(
request_id,user_id(๊ฐ๋ฅํ๋ฉด),endpoint,status_code,latency_ms,db_time_ms, ์งง์error_code)๋ก ๊ตฌ์กฐํ๋ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ์ธ์. - 3โ4์๊ฐ: ํต์ฌ ๋ฉํธ๋ฆญ ์ถ๊ฐ: ์ด๋น ์์ฒญ, p95 ์ง์ฐ, 4xx/5xx ๋น์จ, DB ํ์ด๋ฐ(๊ฐ๋ฅํ๋ฉด ์ฟผ๋ฆฌ ์ง์์๊ฐ๊ณผ ํ ํฌํ).
- 4โ6์๊ฐ: ์ธ ๊ฐ์ ๋์๋ณด๋ ์์ฑ: ๊ฐ์(ํ๋์ ๋ณด๋ ์ํ), API ์์ธ(์๋ํฌ์ธํธ ๋ถํด), DB ๋ทฐ(๋๋ฆฐ ์ฟผ๋ฆฌ, ๋ฝ, ์ปค๋ฅ์ ์ฌ์ฉ).
- 6โ8์๊ฐ: ์๋ฆผ ์ถ๊ฐ, ํต์ ๋ ์คํจ๋ฅผ ํธ๋ฆฌ๊ฑฐํด ์๋ฆผ์ด ์ค๋ฌด์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํ์ธ์.
๊ฒฝ๋ณด๋ ์ ๊ณ ์ง์ค์ ์ผ๋ก ์ ์งํ์ธ์. ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ์ํฅ ๋ฐ๋ ๊ฒ๋ค์ ๊ฐ๋ฆฌํค๋ ์๋ฆผ์ ์ํฉ๋๋ค.
์์์ฉ ์๋ฆผ(5โ8๊ฐ)
์ข์ ์คํํฐ ์ธํธ๋: API p95 ์ง์ฐ ๊ณผ๋ค, ์ง์์ 5xx ๋น์จ, 4xx ๊ธ์ฆ(์ฃผ๋ก ์ธ์ฆ/์ ํจ์ฑ ๊ฒ์ฌ ๋ณ๊ฒฝ), ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์คํจ, DB ๋๋ฆฐ ์ฟผ๋ฆฌ, DB ์ปค๋ฅ์ ํ ๊ฑฐ์ ํ๊ณ, ๋์คํฌ ์ฌ์ ๊ณต๊ฐ ๋ถ์กฑ(์ ํ ํธ์คํ ์ธ ๊ฒฝ์ฐ)์ ๋๋ค.
๊ฐ ๊ฒฝ๋ณด์ ๋ํด ์์ ๋ฐ๋ถ์ ์์ฑํ์ธ์. ํ ํ์ด์ง๋ฉด ์ถฉ๋ถํฉ๋๋ค: ๋จผ์ ํ์ธํ ๊ฒ(๋์๋ณด๋ ํจ๋๊ณผ ํต์ฌ ๋ก๊ทธ ํ๋), ๊ฐ๋ฅ์ฑ ๋์ ์์ธ(DB ๋ฝ, ์ธ๋ฑ์ค ๋ถ์กฑ, ๋ค์ด์คํธ๋ฆผ ์ฅ์ ), ๊ทธ๋ฆฌ๊ณ ์ฒซ ๋ฒ์งธ ์์ ํ ์กฐ์น(๋ฉ์ถ ์์ปค ์ฌ์์, ๋ณ๊ฒฝ ๋กค๋ฐฑ, ๋ฌด๊ฑฐ์ด ์์ ์ผ์ ์ค๋จ).
๋ชจ๋ํฐ๋ง์ ์๋๋ฝ๊ฒ ํ๊ฑฐ๋ ๋ฌด์ฉ์ง๋ฌผ๋ก ๋ง๋๋ ํํ ์ค์
๊ด์ธก์ ์ฒดํฌ๋ฆฌ์คํธ์ฒ๋ผ ๋ค๋ฃจ๋ ๊ฒ์ด ์ต์ ๊ด์ธก ๊ตฌ์ฑ์ ๊ฐ์ฅ ๋นจ๋ฆฌ ๋ง์น๋ ๋ฐฉ๋ฒ์ ๋๋ค. CRUD ์ค์ฌ ์ฑ์ ๋ณดํต ๋ช ๊ฐ์ง ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์คํจํ๋ฏ๋ก ์ ํธ๋ฅผ ๊ทธ์ชฝ์ ์ง์คํ์ธ์.
๊ฐ์ฅ ํํ ์คํจ๋ ์๋ฆผ ํผ๋ก์ ๋๋ค: ์๋ฆผ์ด ๋๋ฌด ๋ง๊ณ ์คํ ๊ฐ๋ฅํ ๊ฒ์ด ์ ์ต๋๋ค. ๋ชจ๋ ๊ธ์ฆ๋ง๋ค ํ์ด์ง๋ฅผ ์ธ๋ฆฌ๋ฉด 2์ฃผ ๋ด๋ก ์ฌ๋๋ค์ด ์๋ฆผ์ ์ ๋ขฐํ์ง ์๊ฒ ๋ฉ๋๋ค. ์ข์ ๊ท์น: ์๋ฆผ์ ๊ฐ๋ฅํ ์์ ์ ๊ฐ๋ฆฌ์ผ์ผ์ง ๋จ์ํ "๋ฌด์ธ๊ฐ ๋ณ๊ฒฝ๋๋ค"๋ฅผ ์๋ ค์๋ ์ ๋ฉ๋๋ค.
๋ ๋ค๋ฅธ ๊ณ ์ ์ ์ค์๋ ์๊ด ID ๋๋ฝ์
๋๋ค. ์ค๋ฅ ๋ก๊ทธ, ๋๋ฆฐ ์์ฒญ, DB ์ฟผ๋ฆฌ๋ฅผ ํ ์์ฒญ์ ์ฐ๊ฒฐํ์ง ๋ชปํ๋ฉด ์์๊ฐ์ ์์ต๋๋ค. ๋ชจ๋ ์์ฒญ์ request_id๋ฅผ ๋ถ์ฌํ๊ณ (๋ก๊ทธ, ํธ๋ ์ด์ค๊ฐ ์์ผ๋ฉด ํธ๋ ์ด์ค์๋), ์๋ต์ ์์ ํ ๋ ํฌํจํ์ธ์.
๋ ธ์ด์ฆ๋ฅผ ์ ๋ฐํ๋ ํํ ์์ธ
์๋๋ฌ์ด ์์คํ ์ ๋ณดํต ๊ณตํต ๋ฌธ์ ๋ฅผ ๊ณต์ ํฉ๋๋ค:
- ํ๋์ ์๋ฆผ์ด 4xx์ 5xx๋ฅผ ์์ด ํด๋ผ์ด์ธํธ ์ค์์ ์๋ฒ ์ค๋ฅ๋ฅผ ๊ตฌ๋ถํ์ง ๋ชปํจ
- ๋ฉํธ๋ฆญ์ด ํ๊ท ๋ง ์ถ์ ํด ๊ผฌ๋ฆฌ ์ง์ฐ(p95/p99)์ ์จ๊น
- ๋ก๊ทธ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ(๋น๋ฐ๋ฒํธ, ํ ํฐ, ์ ์ฒด ์์ฒญ ๋ณธ๋ฌธ)๊ฐ ํฌํจ๋จ
- ์๋ฆผ์ด ์ฆ์์๋ง ๋ฐ์(์: CPU ๋์)ํ๊ณ ์ฌ์ฉ์ ์ํฅ(์ค๋ฅ์จ, ์ง์ฐ)์ ๋ณด์ง ๋ชปํจ
- ๋ฐฐํฌ๊ฐ ๋ณด์ด์ง ์์ ํ๊ท๊ฐ ๋ฌด์์ ์คํจ์ฒ๋ผ ๋ณด์
CRUD ์ฑ์ ํนํ "ํ๊ท ์ ํจ์ "์ ์ทจ์ฝํฉ๋๋ค. ๋จ ํ๋์ ๋๋ฆฐ ์ฟผ๋ฆฌ๊ฐ 5% ์์ฒญ์ ๊ดด๋กญ๊ฒ ๋ง๋๋ ๋์ ํ๊ท ์ ๊ด์ฐฎ์ ๋ณด์ผ ์ ์์ต๋๋ค. ๊ผฌ๋ฆฌ ์ง์ฐ๊ณผ ์ค๋ฅ์จ์ ํจ๊ป ๋ณด๋ฉด ๋ ๋ช ํํฉ๋๋ค.
๋ฐฐํฌ ๋ง์ปค๋ฅผ ์ถ๊ฐํ์ธ์. CI๋ก ๋ฐฐํฌํ๋ AppMaster์ฒ๋ผ ์ฝ๋๋ฅผ ์ฌ์์ฑํ๋ ๋ฒ์ ๊ณผ ๋ฐฐํฌ ์๊ฐ์ ์ด๋ฒคํธ์ ๋ก๊ทธ์ ๊ธฐ๋กํ์ธ์.
๋น ๋ฅธ ์ ๊ฒ: ์ต์ ๊ด์ธก ์ฒดํฌ๋ฆฌ์คํธ
์ฌ๊ฑด ์ค ๋์๋ณด๋๋ฅผ 20๋ถ ๋ค์ง์ง ์๊ณ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ๋น ๋ฅด๊ฒ ๋ตํ ์ ์์ผ๋ฉด ์ค์ ์ด ์๋ํ๋ ๊ฒ์ ๋๋ค. "์/์๋์ค"๋ก ๋น ๋ฅด๊ฒ ๋ตํ์ง ๋ชปํ๋ฉด ํต์ฌ ์ ํธ๊ฐ ๋น ์ก๊ฑฐ๋ ๋ทฐ๊ฐ ํฉ์ด์ ธ ์๋ ๊ฒ์ ๋๋ค.
์ฌ๊ฑด ์ค ๋น ๋ฅธ ์ ๊ฒ ํญ๋ชฉ
๋ค์ ์์ ๋๋ถ๋ถ์ 1๋ถ ์ด๋ด์ ํ ์ ์์ด์ผ ํฉ๋๋ค:
- ๋จ์ผ ์ค๋ฅ ๋ทฐ(5xx, ํ์์์, ์คํจํ ์์ )์์ ์ง๊ธ ์ฌ์ฉ์๊ฐ ์คํจํ๊ณ ์๋์ง(์/์๋์ค) ์ ์ ์๋๊ฐ?
- ๊ฐ์ฅ ๋๋ฆฐ ์๋ํฌ์ธํธ ๊ทธ๋ฃน๊ณผ ๊ทธ p95 ์ง์ฐ์ ์ฐพ๊ณ ์ ํ ์ค์ธ์ง ๋ณผ ์ ์๋๊ฐ?
- ์์ฒญ์ ๋ํด ์ฑ ์๊ฐ๊ณผ DB ์๊ฐ์ ๋ถ๋ฆฌํ ์ ์๋๊ฐ(ํธ๋ค๋ฌ ์๊ฐ, DB ์ฟผ๋ฆฌ ์๊ฐ, ์ธ๋ถ ํธ์ถ)?
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ปค๋ฅ์ ํ๊ณ ๋๋ CPU ํ๊ณ์ ๊ทผ์ ํ๋์ง, ์ฟผ๋ฆฌ๊ฐ ๋๊ธฐ ์ค์ธ์ง ๋ณผ ์ ์๋๊ฐ?
- ์๋ฆผ์ด ์ธ๋ ธ๋ค๋ฉด ๋ค์ ํ๋(๋กค๋ฐฑ, ์ค์ผ์ผ, DB ์ปค๋ฅ์ ํ์ธ, ํน์ ์๋ํฌ์ธํธ ๊ฒ์ฌ)์ ์ ์ํ๋๊ฐ?
๋ก๊ทธ๋ ์์ ํ๋ฉด์ ์ ์ฉํด์ผ ํฉ๋๋ค. ํ๋์ ์คํจ ์์ฒญ์ ์๋น์ค๋ค ์ ๋ฐ์์ ์ถ์ ํ ์ ์์ ์ ๋์ ์ปจํ ์คํธ๋ ํ์ํ์ง๋ง ๊ฐ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ๋ฉด ์ ๋ฉ๋๋ค.
๋ก๊ทธ ๊ฑด์ ์ฑ ์ ๊ฒ
์ต๊ทผ ์คํจ ํ๋๋ฅผ ๊ณจ๋ผ ๋ก๊ทธ๋ฅผ ์ด์ด๋ณด์ธ์. request_id, ์๋ํฌ์ธํธ, ์ํ ์ฝ๋, ์ง์์๊ฐ, ๋ช
ํํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ์๋์ง ํ์ธํ์ธ์. ๋ํ ์์ ํ ํฐ, ๋น๋ฐ๋ฒํธ, ๊ฒฐ์ ์์ธ ์ ๋ณด ๋๋ ๊ฐ์ธ ํ๋๋ฅผ ๊ธฐ๋กํ๊ณ ์์ง ์์์ง ํ์ธํ์ธ์.
AppMaster๋ก CRUD ์ค์ฌ ๋ฐฑ์๋๋ฅผ ๋น๋ํ๋ค๋ฉด ์๋ฌ, ์๋ํฌ์ธํธ๋ณ p95 ์ง์ฐ, DB ์ํ๋ฅผ ๊ฒฐํฉํ ๋จ์ผ "์ฌ๊ฑด ๋ทฐ"๋ฅผ ๋ชฉํ๋ก ํ์ธ์. ์ด๊ฒ๋ง์ผ๋ก๋ ๋น์ฆ๋์ค ์ฑ์ ๋๋ถ๋ถ ์ค์ ์ฅ์ ๋ฅผ ์ปค๋ฒํฉ๋๋ค.
์์: ์ฌ๋ฐ๋ฅธ ์ ํธ๋ก ๋๋ฆฐ CRUD ํ๋ฉด ์ง๋จํ๊ธฐ
๋ด๋ถ ๊ด๋ฆฌ์ ํฌํธ์ด ์ค์ ๋ด๋ด ๊ด์ฐฎ๋ค๊ฐ ๋ฐ์ ์๊ฐ๋์ ํ์ ํ ๋๋ ค์ง๋๋ค. ์ฌ์ฉ์๋ "์ฃผ๋ฌธ" ๋ชฉ๋ก์ ์ด๊ฑฐ๋ ํธ์ง์ ์ ์ฅํ ๋ 10~20์ด๊ฐ ๊ฑธ๋ฆฐ๋ค๊ณ ๋ถํํฉ๋๋ค.
์์ ์ ํธ๋ถํฐ ๋ด ๋๋ค. API ๋์๋ณด๋๋ ์ฝ๊ธฐ ์๋ํฌ์ธํธ์ p95๊ฐ ์ฝ 300ms์์ 4โ6s๋ก ๋ฐ์์ง๋ง ์ค๋ฅ์จ์ ๋ฎ๊ฒ ์ ์ง๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํจ๋์ ํ์ฑ ์ปค๋ฅ์ ์ด ํ ํ๊ณ์ ๊ทผ์ ํ๊ณ ๋ฝ ๋๊ธฐ๊ฐ ์ฆ๊ฐํ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ฐฑ์๋ ๋ ธ๋์ CPU๋ ์ ์์ด๋ผ ์ปดํจํธ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค.
๋ค์์ผ๋ก ๋๋ฆฐ ์์ฒญ ํ๋๋ฅผ ๊ณจ๋ผ ๋ก๊ทธ๋ฅผ ๋ฐ๋ผ๊ฐ๋๋ค. ์๋ํฌ์ธํธ(GET /orders ์์)๋ก ํํฐ๋งํ๊ณ ์ง์์๊ฐ๋ณ ์ ๋ ฌ์ ํฉ๋๋ค. 6์ด์ง๋ฆฌ ์์ฒญ์ request_id๋ฅผ ์ก์ ์๋น์ค ์ ๋ฐ์์ ๊ฒ์ํ๋ฉด ํธ๋ค๋ฌ๋ ๋น ๋ฅด๊ฒ ๋๋ฌ์ง๋ง ๋์ผ request_id์ DB ์ฟผ๋ฆฌ ๋ก๊ทธ๊ฐ 5.4์ด๋ฅผ ๊ธฐ๋กํ๊ณ rows=50, ํฐ lock_wait_ms๋ฅผ ๋ณด์ด๋ ๊ฒ์ ํ์ธํฉ๋๋ค.
์ด์ ์์ธ์ ํ์ ์ ๊ฐ๊ณ ๋งํ ์ ์์ต๋๋ค: ๋๋ฆผ์ ๋คํธ์ํฌ๋ ๋ฐฑ์๋ CPU๊ฐ ์๋๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฒฝ๋ก(๋๋ฆฐ ์ฟผ๋ฆฌ ๋๋ ๋ฝ ๊ฒฝ์)์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ต์ํ์ ์ค์ ์ด ์ ๊ณตํ๋ ๊ฐ์น์ ๋๋ค: ๋ฌธ์ ๋ฅผ ํจ์ฌ ๋น ๋ฅด๊ฒ ์ขํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์์ ํ ์์ ์์:
- ๋ชฉ๋ก ํ๋ฉด์์ ์ฌ์ฉํ ํํฐ/์ ๋ ฌ์ ๋ง์ถฐ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์กฐ์ ํ์ธ์.
- ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ ์กฐ์ธ์ผ๋ก ๊ฐ์ ธ์ค๋๋ก N+1 ์ฟผ๋ฆฌ๋ฅผ ์ ๊ฑฐํ์ธ์.
- ๋ถํ ์ DB๊ฐ ๊ณ ๊ฐ๋์ง ์๋๋ก ์ปค๋ฅ์ ํ์ ํ๋ํ์ธ์.
- ์ฝ๊ธฐ ์ค์ฌ ๋ฐ์ดํฐ์ ๋ํด์๋ง ์์ ์ ์ธ ์บ์๋ฅผ ์ถ๊ฐํ๊ณ ๋ฌดํจํ ๊ท์น์ ๋ฌธ์ํํ์ธ์.
๋ซ๋ ๋ฃจํ: ์๋ํฌ์ธํธ ๊ทธ๋ฃน์ p95 ์ง์ฐ์ด ์ง์ ํ ์๊ณ๊ฐ ์ด์์ผ๋ก 10๋ถ๊ฐ ์ ์ง๋๊ณ DB ์ปค๋ฅ์ ์ฌ์ฉ๋์ด (์: 80%) ์ด์์ผ ๋๋ง ํ์ด์ง๋ฅผ ์ธ๋ฆฌ๋๋ก ๊ฒฐํฉ ๊ฒฝ๋ณด๋ฅผ ๋ง๋์ธ์. ์ด ์กฐํฉ์ ๋ ธ์ด์ฆ๋ฅผ ์ค์ด๊ณ ๋ค์ ๋ฒ์๋ ๋ ๋นจ๋ฆฌ ์ด ๋ฌธ์ ๋ฅผ ์ก๊ฒ ํด์ค๋๋ค.
๋ค์ ๋จ๊ณ: ์ต์ํ์ผ๋ก ์ ์งํ๋ค๊ฐ ์ค์ ์ฌ๊ณ ๋ก ๊ฐ์ ํ๊ธฐ
์ต์ ๊ด์ธก ๊ตฌ์ฑ์ ์ฒซ๋ ๋ฐ๋ถํ๊ฒ ๋๊ปด์ ธ์ผ ํฉ๋๋ค. ๋๋ฌด ๋ง์ ๋์๋ณด๋์ ์๋ฆผ์ผ๋ก ์์ํ๋ฉด ๊ณ์ ํ๋ํ๋ค๊ฐ๋ ์ค์ ๋ฌธ์ ๋ฅผ ๋์นฉ๋๋ค.
๋ชจ๋ ์ฌ๊ณ ๋ฅผ ํผ๋๋ฐฑ์ผ๋ก ์ทจ๊ธํ์ธ์. ์์ ์ด ๋ฐฐํฌ๋ ํ: ๋ฌด์์ด ์์์ผ๋ฉด ๋ ๋นจ๋ฆฌ ๋ฐ๊ฒฌํ๊ณ ์ง๋จํ ์ ์์์๊น? ๊ทธ ํญ๋ชฉ๋ง ์ถ๊ฐํ์ธ์.
์ด๊ธฐ์ ํ์คํ๋ฅผ ํด๋๋ฉด ์ข์ต๋๋ค, ์ค๋ น ์๋น์ค๊ฐ ํ ๊ฐ๋ฟ์ด๋ผ๋. ๋ก๊ทธ ํ๋๋ช ๊ณผ ๋ฉํธ๋ฆญ๋ช ์ ๋์ผํ๊ฒ ์ฌ์ฉํ๋ฉด ์ ์๋น์ค๋ ๋ ผ์ ์์ด ํจํด์ ๋ฐ๋ผ๊ฐ๊ณ ๋์๋ณด๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ๋ฐฐํฌ ๊ท์จ์ด ๋น ๋ฅธ ์ฑ๊ณผ๋ฅผ ์ค๋๋ค:
- ๋ฐฐํฌ ๋ง์ปค(version, environment, commit/build ID)๋ฅผ ์ถ๊ฐํด ๋ฌธ์ ๊ฐ ๋ฐฐํฌ ํ ์์๋๋์ง ๋ณด์ธ์.
- ์์ 3๊ฐ ๊ฒฝ๋ณด์ ๋ํ ์์ ๋ฐ๋ถ์ ์์ฑํ์ธ์: ์๋ฏธ, ์ฒซ ํ์ธ ํญ๋ชฉ, ๋ด๋น์.
- ๊ฐ ์๋น์ค์ ๋ํ ํ์ ํญ๋ชฉ์ด ๋ด๊ธด ๋จ์ผ "๊ณจ๋ " ๋์๋ณด๋๋ฅผ ์ ์งํ์ธ์.
AppMaster๋ก ๋ฐฑ์๋๋ฅผ ์์ฑํ๋ค๋ฉด ์๋น์ค ์์ฑ ์ ์ ๊ด์ธก ํ๋์ ํต์ฌ ๋ฉํธ๋ฆญ์ ๊ณํํด ๋๋ฉด ์ API๊ฐ ์ผ๊ด๋ ๊ตฌ์กฐํ ๋ก๊ทธ์ ํฌ์ค ์ ํธ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๊ฒ ํ ์ ์์ต๋๋ค. AppMaster( appmaster.io )๋ ๊ตฌํ์ด ๋ณํด๋ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉฐ ์ด์ ์ค๋น๋ ๋ฐฑ์๋ยท์นยท๋ชจ๋ฐ์ผ ์ฑ์ ์์ฑํ๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
ํ ๋ฒ์ ํ๋์ ๊ฐ์ ๋ง ์ ํํ์ธ์. ์ค์ ๋ก ๋ฌธ์ ๋ฅผ ์ผ์ผํจ ๊ฒ์ ๊ธฐ๋ฐํด ๋ค์ ํญ๋ชฉ์ ์ถ๊ฐํ์ธ์:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ํ์ด๋ฐ์ ์ถ๊ฐํ๊ณ ๋งฅ๋ฝ๊ณผ ํจ๊ป ๋๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ๋ก๊น ํ๊ธฐ
- ๊ฒฝ๋ณด๋ฅผ ์ฌ์ฉ์ ์ํฅ์ ๋ง์ถฐ ๋ ์๊ฒฉํ๊ฒ ์กฐ์ ํ๊ธฐ
- ๋์๋ณด๋ ํ๋๋ฅผ ๋ ๋ช ํํ๊ฒ ๋ง๋ค๊ธฐ(์ฐจํธ ์ด๋ฆ ๋ณ๊ฒฝ, ์๊ณ๊ฐ ์ถ๊ฐ, ์ฌ์ฉํ์ง ์๋ ํจ๋ ์ ๊ฑฐ)
์ด ์ฌ์ดํด์ ์ค์ ์ฌ๊ณ ๋ง๋ค ๋ฐ๋ณตํ๋ฉด ๋ช ์ฃผ ๋ด์ ํน์ CRUD ์ฑ๊ณผ API ํธ๋ํฝ์ ๋ง๋ ๋ชจ๋ํฐ๋ง์ด ์๊ธฐ๊ณ , ๋จ์ํ ํ ํ๋ฆฟ๋ณด๋ค ์ค๋ฌด์ ๋ง๋ ๊ด์ธก ์ฒด๊ณ๋ฅผ ๊ฐ์ถ๊ฒ ๋ฉ๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
ํ๋ก๋์ ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋ฌธ์ ๋ฅผ ๊ณ ์น๋ ์๊ฐ๋ณด๋ค ๊ธธ์ด์ง ๋ ๊ด์ธก์ ์์ํ์ธ์. โ๋ฌด์์ 500โ, ๋๋ฆฐ ๋ชฉ๋ก ํ์ด์ง, ์ฌํ๋์ง ์๋ ํ์์์์ด ๋ณด์ธ๋ค๋ฉด, ์ผ๊ด๋ ์๋์ ๋ก๊ทธยท๋ฉํธ๋ฆญยท์๋ฆผ์ผ๋ก ์ถ์ธก์ ๋๋ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
๋ชจ๋ํฐ๋ง์ ๋ฌด์ธ๊ฐ ์๋ชป๋์๋ค๋ ์ฌ์ค์ ์๋ ค์ฃผ๊ณ , ์ค๋ธ์ ๋ฒ๋น๋ฆฌํฐ๋ ์ ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํ๋์ง ์ดํดํ๊ฒ ํด ์ค๋๋ค. CRUD API์์๋ ์ค๋ฌด ๋ชฉํ๊ฐ ๋น ๋ฅธ ์ง๋จ์ ๋๋ค: ์ด๋ค ์๋ํฌ์ธํธ์ธ์ง, ์ด๋ค ์ฌ์ฉ์/ํ ๋ํธ์ธ์ง, ์๊ฐ ์๋ชจ๊ฐ ์ฑ ๋ด๋ถ์ธ์ง DB์ธ์ง ํ์ ํ๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.
๊ตฌ์กฐํ๋ ์์ฒญ ๋ก๊ทธ, ๋ช ๊ฐ์ง ํต์ฌ ๋ฉํธ๋ฆญ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ํฅ ๊ธฐ๋ฐ์ ์์ ๊ฒฝ๋ณด๋ก ์์ํ์ธ์. ๋ง์ CRUD ์ฑ์ duration_ms, db_time_ms(๋๋ ์ ์ฌ ์งํ)์ ์ ์ญ request_id๋ฅผ ์ด๋ฏธ ๋ก๊น
ํ๊ณ ์๋ค๋ฉด ํธ๋ ์ด์ฑ ์์ด๋ ์ถฉ๋ถํฉ๋๋ค.
ํ๋์ ์๊ด ID ํ๋(์: request_id)๋ฅผ ์ฌ์ฉํ๊ณ ๋ชจ๋ ์์ฒญ ๋ก๊ทธ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์คํ์ ํฌํจํ์ธ์. ์ฃ์ง(์: API ๊ฒ์ดํธ์จ์ด ๋๋ ์ฒซ ํธ๋ค๋ฌ)์์ ์์ฑํ๊ณ ๋ด๋ถ ํธ์ถ์ ์ ๋ฌํ๋ฉด ํ ์์ฒญ์ ๋น ๋ฅด๊ฒ ์ฌ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๋ก๊ทธ์ timestamp, level, service, env, route, method, status, duration_ms์ tenant_id ๊ฐ์ ์์ ํ ์๋ณ์๋ฅผ ๋จ๊ธฐ์ธ์. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ธ ๋ฐ์ดํฐ, ํ ํฐ, ์ ์ฒด ์์ฒญ ๋ณธ๋ฌธ์ ๊ธฐ๋กํ์ง ๋ง์ธ์. ๋ณด๋ค ์์ธํ ์ ๋ณด๋ ํน์ ์ค๋ฅ์ ๋ํด ํ์ํ ๋๋ง ๋ง์คํน/๋ถ๋ถ ๋ก๊ทธ๋ก ๋จ๊ธฐ์ธ์.
์์ฒญ๋ฅ , 5xx ๋น์จ, ์ง์ฐ ํผ์ผํ์ผ(์ต์ p50 ๋ฐ p95), CPU/๋ฉ๋ชจ๋ฆฌ ๋ฑ ํฌํ๋ ์งํ์ DB ์๊ฐ ๋ฐ ์ปค๋ฅ์ ํ ์ฌ์ฉ๋์ ์กฐ๊ธฐ์ ์ถ๊ฐํ์ธ์. ๋ง์ CRUD ์ฅ์ ๊ฐ DB ๊ฒฝ์์ด๋ ํ ๊ณ ๊ฐ์์ ์ต๋๋ค.
ํ๊ท ์ ์ฌ์ฉ์๊ฐ ๋๋ผ๋ ๋๋ฆฐ ๊ผฌ๋ฆฌ๋ฅผ ์จ๊น๋๋ค. p95/p99๋ ์์์ ์์ฒญ์์ ๋ฐ์ํ๋ ์ฌ๊ฐํ ์ง์ฐ์ ํฌ์ฐฉํ๋ฏ๋ก ๋ฌธ์ ํ์ง์ ํจ์ฌ ์ ์ฉํฉ๋๋ค.
์ฒซ์งธ๋ก ๋๋ฆฐ ์ฟผ๋ฆฌ ๋น์จ๊ณผ p95/p99 ์ฟผ๋ฆฌ ์๊ฐ(์์ ๋๋ฆฐ ์ฟผ๋ฆฌ ํฌํจ), ๋์งธ๋ก ๋ฝ ๋๊ธฐ ๋ฐ ๋ฐ๋๋ฝ, ์ ์งธ๋ก ์ปค๋ฅ์ ์ฌ์ฉ๋(ํ์ฑ ์ปค๋ฅ์ vs ํ ํ๊ณ)๊ณผ ๊ฐ์ ์งํ๋ฅผ ์ฐ์ ๋ณด์ธ์. ์ด๋ค์ด ๋๋ถ๋ถ์ DB ๋ณ๋ชฉ ์์ธ์ ์ค๋ช ํฉ๋๋ค.
์ฌ์ฉ์ ์ํฅ์ ์ด์ ์ ๋ง์ถ ๊ฒฝ๋ณด๋ถํฐ ์์ํ์ธ์: ์ง์์ ์ธ 5xx ์ฆ๊ฐ, ์ง์์ ์ธ p95 ์ง์ฐ ์ฆ๊ฐ, ์ฑ๊ณต ์์ฒญ์ ๊ธ๊ฒฉํ ๊ฐ์ ๊ฐ์ ๊ฒ๋ค์ ๋๋ค. ์์ธ ๊ธฐ๋ฐ ๊ฒฝ๋ณด(DB ์ปค๋ฅ์ ํ๊ณ ๋ฑ)๋ ๊ทธ ๋ค์์ ์ถ๊ฐํ์ธ์.
๋ก๊ทธ, ๋์๋ณด๋, ์๋ฆผ์ ๋ฒ์ /๋น๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ถ์ด๊ณ ๋ฐฐํฌ ๋ง์ปค๋ฅผ ๊ธฐ๋กํ์ธ์. ํนํ AppMaster๋ก ์์ฑ๋ ๋ฐฑ์๋์ฒ๋ผ ์ฝ๋ ์ฌ์์ฑยท๋ฐฐํฌ๊ฐ ์ฆ์ ํ๊ฒฝ์์๋ ๋ฐฐํฌ ์งํ ํ๊ท๊ฐ ์์๋์ง ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์์ด์ผ ํฉ๋๋ค.


