allthingsare๐Ÿ…ฟ๏ธ.com Books โฌ…๏ธ Back allthingsare





MSA (Microservices Architecture)

1) ์™œ ๋‚˜์™”๋‚˜ (๋ฌธ์ œ ์ธ์‹)

  • ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋†€๋ฆฌ์‹(monolith) ์•ฑ์€ ๋ฐฐํฌ๊ฐ€ ํ•œ ๋ฉ์–ด๋ฆฌ๋ผ์„œ ์ž‘์€ ์ˆ˜์ •๋„ ์ „์ฒด ์žฌ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•จ.

  • ํŒ€ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ฝ”๋“œ ์ถฉ๋Œ, ๋นŒ๋“œ ์‹œ๊ฐ„ ์ฆ๊ฐ€, ๋ฆด๋ฆฌ์Šค ์กฐ์œจ ์ง€์˜ฅ.

  • ๋„๋ฉ”์ธ๋ณ„ ์„ฑ๊ฒฉ์ด ๋‹ค๋ฅธ๋ฐ๋„ ํ•œ ๊ฐ€์ง€ ๊ธฐ์ˆ  ์Šคํƒ/DB๋กœ ๋ฌถ์—ฌ ๋ณ‘๋ชฉ ๋ฐœ์ƒ.

  • ์žฅ์•  ์‹œ ์ „์ฒด๊ฐ€ ์˜ํ–ฅ ๋ฐ›๋Š” ์ทจ์•ฝํ•œ ๋ณต์›๋ ฅ.

2) ํ•ต์‹ฌ ์•„์ด๋””์–ด

  • ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ ์ž‘์€ ์„œ๋น„์Šค๋กœ ์ชผ๊ฐœ๊ณ , ๊ฐ ์„œ๋น„์Šค๋Š” ๋…๋ฆฝ ๋ฐฐํฌ/ํ™•์žฅ ๊ฐ€๋Šฅ.

  • ์„œ๋น„์Šค๋ณ„ ๋ฐ์ดํ„ฐ ๋…๋ฆฝ(โ€œDB-per-serviceโ€), ๋А์Šจํ•œ ๊ฒฐํ•ฉ, ๋ช…์‹œ์  ํ†ต์‹ (API/์ด๋ฒคํŠธ).

  • ํŒ€๋„ ์„œ๋น„์Šค ๋‹จ์œ„๋กœ ์™„์ „ ์†Œ์œ (you build it, you run it).


3) ์žฅ๋‹จ์ 

์žฅ์ 

  • ํŒ€/๊ธฐ๋Šฅ ๋‹จ์œ„ ๋…๋ฆฝ ๊ฐœ๋ฐœยท๋ฐฐํฌ, ์žฅ์•  ๊ฒฉ๋ฆฌ, ํ•„์š” ์„œ๋น„์Šค๋งŒ ์ˆ˜ํ‰ ํ™•์žฅ.

  • ๊ธฐ์ˆ  ์ด๊ธฐ์ข… ํ—ˆ์šฉ(Java ์˜†์— Python ๋“ฑ), ๊ฐ์ž์˜ ์ตœ์  ๋„๊ตฌ ์‚ฌ์šฉ.

  • ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)์˜ Bounded Context์™€ ์ฐฐ๋–ก๊ถํ•ฉ.

๋‹จ์ 

  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๋ณต์žก๋„(๋„คํŠธ์›Œํฌ, ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ, ๋””๋ฒ„๊น…).

  • ์˜ค๋ฒ„ํ—ค๋“œ: API ํ˜ธ์ถœ ๋น„์šฉ, ์šด์˜/๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ”„๋ผ๊ฐ€ ํ•„์ˆ˜.

  • ์ž˜๋ชป ์ชผ๊ฐœ๋ฉด Distributed Monolith(๋ถ„์‚ฐ๋ผ ์žˆ๋Š”๋ฐ ์„œ๋กœ ๊ฐ•๊ฒฐํ•ฉ) 

5) ์ ์šฉ ์‹œ์  ๊ฐ€์ด๋“œ

  • ํŒ€/๋„๋ฉ”์ธ์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋˜๊ณ  ๋ฆด๋ฆฌ์Šค ๋นˆ๋„๊ฐ€ ๋†’์„ ๋•Œ.

  • ๊ธฐ๋Šฅ๋ณ„ ํŠธ๋ž˜ํ”ฝ ํŽธ์ฐจ๊ฐ€ ์ปค์„œ ๋ถ€๋ถ„ ํ™•์žฅ์ด ํ•„์š”ํ•  ๋•Œ.

  • ๋ฐ˜๋Œ€๋กœ ์ดˆ๊ธฐ ์†Œ๊ทœ๋ชจ MVP๋ผ๋ฉด ๋ชจ๋†€๋ฆฌ์‹ + ๋ชจ๋“ˆํ™”๊ฐ€ ๋” ๋น ๋ฅด๊ณ  ์•ˆ์ „.

6) ์‹ค๋ฌด ์ฒดํฌ๋ฆฌ์ŠคํŠธ(์š”์•ฝ)

  • ๊ฒฝ๊ณ„ ์„ค์ •: Bounded Context ๋จผ์ €, ๊ทธ๋‹ค์Œ ์„œ๋น„์Šค ์ชผ๊ฐœ๊ธฐ.

    ์˜ˆ:

    • โ€œ์ฃผ๋ฌธ(Order)โ€์ด ์‡ผํ•‘๋ชฐ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” โ€œ๊ณ ๊ฐ์ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๊ฒฐ์ œํ•œ ๊ธฐ๋กโ€์„ ๋œปํ•˜์ง€๋งŒ,

    • ๋ฐฐ์†ก ์ปจํ…์ŠคํŠธ์—์„œ๋Š” โ€œ๋ฐฐ์†กํ•ด์•ผ ํ•  ๋ฌผํ’ˆ ๋ชฉ๋กโ€์ด๋ผ๋Š” ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ์“ฐ์ผ ์ˆ˜ ์žˆ์Œ.

    • ๋”ฐ๋ผ์„œ ์ฃผ๋ฌธ(Order)์ด๋ผ๋Š” ๊ฐ™์€ ๋‹จ์–ด๋„ Bounded Context๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋‹ค๋ฅธ ๋ชจ๋ธ์ด ๋  ์ˆ˜ ์žˆ์Œ.

  • ํ†ต์‹ : ๋™๊ธฐ ์ตœ์†Œํ™”, ๊ฐ€๋Šฅํ•˜๋ฉด ์ด๋ฒคํŠธ ์ค‘์‹ฌ.


  • ๋ฐ์ดํ„ฐ: ๊ณต์œ  ์Šคํ‚ค๋งˆ ๊ธˆ์ง€

    • ์˜๋ฏธ: ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋“ค์ด ํ•˜๋‚˜์˜ ๊ณต์šฉ DB ํ…Œ์ด๋ธ”์ด๋‚˜ ์Šคํ‚ค๋งˆ๋ฅผ ์ง์ ‘ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์›์น™.

    • ์™œ๋ƒ๋ฉด?

      • ์„œ๋น„์Šค ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง โ†’ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋‹ค๋ฅธ ์„œ๋น„์Šค๋„ ๊นจ์ง.

      • ๋…๋ฆฝ ๋ฐฐํฌ, ๋…๋ฆฝ ํ™•์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง.

    • ๋Œ€์•ˆ: ์„œ๋น„์Šค๋งˆ๋‹ค ์ž๊ธฐ DB๋ฅผ ์†Œ์œ ํ•˜๊ณ , ์ž๊ธฐ ๋ฐ์ดํ„ฐ๋Š” ์ž๊ธฐ๋งŒ ์ฑ…์ž„์ง.

    • ๋น„์œ : ์ž์ทจ๋ฐฉ ์‚ด๋ฉด์„œ ๋ƒ‰์žฅ๊ณ ๋ฅผ ๋”ฐ๋กœ ์“ฐ๋Š” ๊ฒƒ. ๊ณต์šฉ ๋ƒ‰์žฅ๊ณ  ์“ฐ๋ฉด ๋ˆ„๊ฐ€ ๋ฐ”๊ฟ”๋†จ๋Š”์ง€ ๋ชจ๋ฅด๊ณ  ๋งจ๋‚  ์‹ธ์›€๋‚จ

  • ์‹ ๋ขฐ์„ฑ: Idempotency ํ‚ค, ์žฌ์‹œ๋„ ๊ทœ์น™, ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค.

    Idempotency ํ‚ค (๋ฉฑ๋“ฑ์„ฑ ํ‚ค) - ๊ฐ™์€ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฒ˜๋ฆฌํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ณด์žฅ๋˜๋Š” ์„ฑ์งˆ.

    ์žฌ์‹œ๋„ ๊ทœ์น™ -  ์‹คํŒจํ•œ ์š”์ฒญ์„ ์ผ์ • ๊ทœ์น™์— ๋”ฐ๋ผ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋Š” ๋ฐฉ์‹.๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ์ผ์‹œ ์žฅ์• ๊ฐ€ ํ”ํ•จ. โ†’ ํ•œ ๋ฒˆ ๋” ์‹œ๋„ํ•˜๋ฉด ์„ฑ๊ณตํ•  ํ™•๋ฅ ์ด ๋†’์Œ

    ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค - ๋งˆ์น˜ ์ „๊ธฐ ์ฐจ๋‹จ๊ธฐ์ฒ˜๋Ÿผ, ํŠน์ • ์„œ๋น„์Šค๊ฐ€ ๊ณ„์† ์‹คํŒจํ•˜๋ฉด ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ์ž ์‹œ ๋Œ€๊ธฐํ•˜๋Š” ํŒจํ„ด, ์žฅ์• ๋‚œ ์„œ๋น„์Šค๋ฅผ ๊ณ„์† ๋‘๋“œ๋ฆฌ๋ฉด ์ž๊ธฐ ๋ฆฌ์†Œ์Šค๊นŒ์ง€ ๊ณ ๊ฐˆ๋จ

  • ๊ด€์ธก์„ฑ: ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(OpenTelemetry), ํ‘œ์ค€ ๋กœ๊น…/๋ฉ”ํŠธ๋ฆญ.

    ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(OpenTelemetry) - ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” ์š”์ฒญ ํ•˜๋‚˜๊ฐ€ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ๊ฑฐ์ณ ์ฒ˜๋ฆฌ๋จ, ์ฃผ๋ฌธ -> ๊ฒฐ์ œ->์ถœ๊ณ ->๋ฐฐ์†ก, ์ด ์ค‘ ์–ด๋””์„œ ์ง€์—ฐ์ด ์ƒ๊ฒผ๋Š”์ง€ ์ฐพ๊ธฐ ์–ด๋ ค์›€.

                                                             ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ์€ ์š”์ฒญ์ด ํ˜๋Ÿฌ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ Trace ID๋ฅผ ๋ถ™์ด๊ณ , ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ด Trace ID๋กœ ์ž๊ธฐ ์ž‘์—…์„ ๊ธฐ๋ก.

    ํ‘œ์ค€ ๋กœ๊น…/๋ฉ”ํŠธ๋ฆญ -  ์„œ๋น„์Šค๋งˆ๋‹ค ๋กœ๊ทธ ํ˜•์‹ ์ œ๊ฐ๊ฐ์ด๋ฉด, ์žฅ์•  ๋ถ„์„ํ•  ๋•Œ ๋กœ๊ทธ๋ฅผ ํ•ฉ์ณ ๋ณผ ์ˆ˜ ์—†์Œ.Timestamp, Trace ID/Span ID, Log Level(INFO/ERROR), ๋“ฑ

    ๋ฉ”ํŠธ๋ฆญ - ์„œ๋น„์Šค์™€ ๋น„์ฆˆ๋‹ˆ์Šค ์ƒํƒœ๋ฅผ ์ˆ˜์น˜๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง, ์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ: CPU, ๋ฉ”๋ชจ๋ฆฌ, ๋„คํŠธ์›Œํฌ I/O, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”ํŠธ๋ฆญ: ์š”์ฒญ ์ˆ˜, ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„, ์—๋Ÿฌ์œจ

  • ๋ณด์•ˆ: ์ œ๋กœ ํŠธ๋Ÿฌ์ŠคํŠธ, mTLS, JWT, RBAC.

    ์ œ๋กœ ํŠธ๋Ÿฌ์ŠคํŠธ - โ€œ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋Š” ์•ˆ์ „ํ•˜๋‹คโ€๋Š” ๊ฐ€์ •์„ ๋ฒ„๋ฆฌ๊ณ , ๋ชจ๋“  ์š”์ฒญ์€ ํ•ญ์ƒ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™. 

                              ํšŒ์‚ฌ ๊ฑด๋ฌผ ์•ˆ์— ๋“ค์–ด์™”์–ด๋„, ์‚ฌ๋ฌด์‹คยท์„œ๋ฒ„์‹คยท์ฐฝ๊ณ ๋งˆ๋‹ค ์ถœ์ž…์นด๋“œ ๋”ฐ๋กœ ์ฐ์–ด์•ผ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋А๋‚Œ.

    mTLS (mutual Transport Layer Security) - TLS(HTTPS)์ฒ˜๋Ÿผ ์„œ๋ฒ„๋งŒ ์ธ์ฆํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ์ธ์ฆํ•˜๋Š” ๋ฐฉ์‹. ํ†ต์‹  ๊ฒฝ๋กœ ์•”ํ˜ธํ™” + ์„œ๋น„์Šค ๊ฐ„ ์‹ ๋ขฐ์„ฑ ํ™•๋ณด.

    JWT (JSON Web Token) - ์‚ฌ์šฉ์ž ์ธ์ฆยท์ธ๊ฐ€ ์ •๋ณด๋ฅผ ๋‹ด์€ ์„œ๋ช…๋œ ํ† ํฐ.ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์ธ โ†’ ์„œ๋ฒ„๊ฐ€ JWT ๋ฐœ๊ธ‰ โ†’ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ดํ›„ ์š”์ฒญ๋งˆ๋‹ค JWT ํ—ค๋”์— ํฌํ•จ.์„œ๋ฒ„๋Š” DB๋ฅผ ๋‹ค์‹œ ์กฐํšŒํ•  ํ•„์š” ์—†์ด ํ† ํฐ๋งŒ ๊ฒ€์ฆํ•ด๋„ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ํ™•์ธ ๊ฐ€๋Šฅ.๋†€์ด๊ณต์› ์ž…์žฅํ•  ๋•Œ ์†๋ชฉ๋ฐด๋“œ ์ฐจ๊ณ  ๋‹ค๋‹ˆ๋Š” ๊ฑฐ. ์ผ์ผ์ด ์‹ ๋ถ„์ฆ ํ™•์ธํ•  ํ•„์š” ์—†์Œ.

    RBAC (Role-Based Access Control) -  ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๊ฐœ์ธ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ์—ญํ• (Role) ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹.Admin โ†’ ๋ชจ๋“  ์„œ๋น„์Šค ์ ‘๊ทผ ๊ฐ€๋Šฅ, Manager โ†’ ์ฃผ๋ฌธ/๋ฐฐ์†ก๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ, User โ†’ ์ž๊ธฐ ๊ณ„์ • ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

  • ํ…Œ์ŠคํŠธ: ์†Œ๋น„์ž ์ฃผ๋„ ๊ณ„์•ฝ ํ…Œ์ŠคํŠธ(Contract Test) ํ•„์ˆ˜.

    ์†Œ๋น„์ž ์ฃผ๋„ (Cunsumer-Driven) - ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ(Consumer)์ด "๋‚ด๊ฐ€ ์ด API์—์„œ ํ•„์š”ํ•œ ๊ฑด ์ด ํ•„๋“œ์™€ ์‘๋‹ต์ด๋‹คโ€๋ฅผ ๊ณ„์•ฝ์œผ๋กœ ์ •์˜.Provider(์ œ๊ณต์ž)๋Š” ์ด ๊ณ„์•ฝ์„ ๋ฐ˜๋“œ์‹œ ์ถฉ์กฑ์‹œ์ผœ์•ผ ํ•จ. ์ฆ‰, ๊ณ„์•ฝ์˜ ๊ธฐ์ค€์€ Provider๊ฐ€ ์•„๋‹ˆ๋ผ Consumer. Provider๋Š” ์ž๊ธฐ ์ž…์žฅ์—์„œ ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ•„๋“œ๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ์ง€๋งŒ, Consumer ์ž…์žฅ์—์„œ๋Š” ๊ทธ๊ฒŒ ํ•ต์‹ฌ์ผ ์ˆ˜ ์žˆ์Œ.

    ๊ณ„์•ฝ ํ…Œ์ŠคํŠธ(Contract Test) - ์„œ๋น„์Šค ๊ฐ„์˜ ์•ฝ์†(๊ณ„์•ฝ, Contract: ์š”์ฒญ/์‘๋‹ต ํ˜•์‹, ํ•„๋“œ ๋“ฑ)์ด ์ œ๋Œ€๋กœ ์ง€์ผœ์ง€๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ.POST /payment โ†’ { "amount": number, "currency": string } โ†’ ์‘๋‹ต { "status": "OK" }

  • ๋ฐฐํฌ: Canary/Blue-Green, ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™”

    ์ˆ˜๋™ ๋ฐฐํฌ (Manual Deployment) -  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ(.jar, .war, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋“ฑ)์„ ์ถ”์ถœ โ†’scp, ftp ๊ฐ™์€ ๊ฑธ๋กœ ์„œ๋ฒ„์— ์—…๋กœ๋“œ โ†’ SSH ๋“ค์–ด๊ฐ€์„œ java -jar ... ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰

    ์นด๋‚˜๋ฆฌ์•„ ๋ฐฐํฌ (Canary Deployment) - ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ์ „์ฒด์— ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ , ์ผ๋ถ€ ์‚ฌ์šฉ์ž/ํŠธ๋ž˜ํ”ฝ์—๋งŒ ๋จผ์ € ๋ฐฐํฌํ•ด์„œ ์•ˆ์ •์„ฑ ํ™•์ธ ํ›„ ์ ์ง„์ ์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹.๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๋น ๋ฅด๊ฒŒ ๋กค๋ฐฑ ๊ฐ€๋Šฅ, ์˜ํ–ฅ ์ตœ์†Œํ™”.

    ๋ธ”๋ฃจ๊ทธ๋ฆฐ ๋ฐฐํฌ(Blue-Green) - ๋‘ ๊ฐœ์˜ ํ™˜๊ฒฝ(Blue=ํ˜„์žฌ ๋ฒ„์ „, Green=์ƒˆ ๋ฒ„์ „)์„ ์ค€๋น„ํ•ด ๋‘๊ณ , ๋ฐฐํฌ ์‹œ ํŠธ๋ž˜ํ”ฝ ์Šค์œ„์น˜๋งŒ ๋ฐ”๊ฟ”์„œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ์‹.๋ฌธ์ œ ์ƒ๊ธฐ๋ฉด ๋‹ค์‹œ Blue๋กœ ํŠธ๋ž˜ํ”ฝ ์ „ํ™˜ โ†’ ์ฆ‰์‹œ ๋กค๋ฐฑ.

    ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™”(CI/CD Pipeline) - ์ฝ”๋“œ โ†’ ๋นŒ๋“œ โ†’ ํ…Œ์ŠคํŠธ โ†’ ๋ฐฐํฌ ๊ณผ์ •์„ ์ž๋™ํ™”.์ฝ”๋“œ๊ฐ€ ํ‘ธ์‹œ๋˜๋ฉด ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ & ๋ฐฐํฌ ์ค€๋น„.





MVC (Modelโ€“Viewโ€“Controller)

1) ์™œ ๋‚˜์™”๋‚˜ (๋ฌธ์ œ ์ธ์‹)

  • ํ™”๋ฉด/์ž…๋ ฅ/๋„๋ฉ”์ธ ๊ทœ์น™/๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ด ๋’ค์—‰ํ‚ค๋ฉด ์œ ์ง€๋ณด์ˆ˜ ๋ถˆ๊ฐ€.

  • ๋ณ€๊ฒฝ ์ด์œ ๊ฐ€ ๋‹ฌ๋ผ๋„ ํŒŒ์ผ์ด ํ•จ๊ป˜ ๋ณ€ํ•ด ์‘์ง‘๋„ ๋‚ฎ๊ณ  ๊ฒฐํ•ฉ๋„ ๋†’์Œ.

2) ํ•ต์‹ฌ ์•„์ด๋””์–ด

  • View: ํ™”๋ฉด ํ‘œํ˜„(HTML/JSON), ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ์—†์Œ.

  • Controller: ์š”์ฒญ์„ ์–ด๋Œ‘ํŠธํ•˜๊ณ  ํ๋ฆ„ ์ œ์–ด(๊ฒ€์ฆ, ๋ฐ”์ธ๋”ฉ, ์„œ๋น„์Šค ํ˜ธ์ถœ).

  • Model: ๋„๋ฉ”์ธ ์ƒํƒœ์™€ ๊ทœ์น™(์—”ํ‹ฐํ‹ฐยท๋ฐธ๋ฅ˜ยท๋„๋ฉ”์ธ ์„œ๋น„์Šค).
    (ํ˜„๋Œ€ ์›น์—์„  Model์˜ ์ˆœ์ˆ˜์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด Service/Repository๋ฅผ ์ถ”๊ฐ€ํ•œ 3-๊ณ„์ธต+MVC ํ˜ผํ•ฉ์ด ์ผ๋ฐ˜์ )

3) ์›น ์š”์ฒญ ํ๋ฆ„(์Šคํ”„๋ง ์˜ˆ)

Request โ†’ Controller โ†’ Service(ํŠธ๋žœ์žญ์…˜ยท๊ทœ์น™) โ†’ Repository(JPA/SQL) โ†’ Domain Model โ†’ Service โ†’ Controller โ†’ View(JSON/ํ…œํ”Œ๋ฆฟ)

  • Controller: REST ์—”๋“œํฌ์ธํŠธ, DTO ์ž…์ถœ๋ ฅ, ์ธ์ฆ ์ฒดํฌ.

  • Service: ๋„๋ฉ”์ธ ๊ทœ์น™/ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„, ์™ธ๋ถ€ ์‹œ์Šคํ…œ ํ˜‘๋ ฅ.

  • Repository: ์˜์†ํ™”(์กฐํšŒ/์ €์žฅ).

  • View: Thymeleaf ๋“ฑ ํ…œํ”Œ๋ฆฟ, ํ˜น์€ API JSON.

 โ€œControllerโ€“Serviceโ€“Repositoryโ€๋Š” MVC์˜ C(Controller) ๋ฅผ ์›น ์–ด๋Œ‘ํ„ฐ๋กœ ์ขํžˆ๊ณ , M(Model) ์˜ ์˜์† ์ฑ…์ž„์„ Repository๋กœ, ๊ทœ์น™์„ Service๋กœ ๊นจ๋—ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ ํ˜„๋Œ€์  ๋ณ€ํ˜•

4) ์žฅ๋‹จ์ /์•ˆํ‹ฐํŒจํ„ด

์žฅ์ 

  • ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ, ํ…Œ์ŠคํŠธ ์šฉ์ด, ์—ญํ• ์ด ๋ช…ํ™•.

  • UI ๋ฐ”๋€Œ์–ด๋„ ๋„๋ฉ”์ธ ๊ทœ์น™ ์žฌ์‚ฌ์šฉ.

์•ˆํ‹ฐํŒจํ„ด

  • Fat Controller: ๊ฒ€์ฆ/๊ทœ์น™/์ฟผ๋ฆฌ๋ฅผ C์— ๋‹ค ๋„ฃ์Œ โ†’ ์„œ๋น„์Šค๋กœ ์ด๋™.

  • Anemic Domain Model: ๊ทœ์น™์ด ์ „๋ถ€ Service์—๋งŒ ์žˆ๊ณ  ์—”ํ‹ฐํ‹ฐ๋Š” DTO์ฒ˜๋Ÿผ ๋น„์–ด์žˆ์Œ โ†’ ํ•ต์‹ฌ ๊ทœ์น™์€ ๋„๋ฉ”์ธ์œผ๋กœ.

  • Active Record ๋‚จ์šฉ: ์˜์†/๋น„์ฆˆ๋‹ˆ์Šค ๋’ค์„ž์ž„ โ†’ Repository๋กœ ๋ถ„๋ฆฌ.

  • ์–‘ํŒŒํ˜• ์˜์กด ์—ญ์ „ ๋ฌด์‹œ: View/Infra๊ฐ€ ๋„๋ฉ”์ธ์„ ์ฐธ์กฐํ•ด์•ผ์ง€, ๋ฐ˜๋Œ€๋Š” ๊ธˆ๋ฌผ.

5) ์‹ค๋ฌด ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์ž…๋ ฅ DTO โ†” ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ถ„๋ฆฌ, ๊ฒ€์ฆ์€ 1) ๋‹จ์ˆœ ํ˜•์‹(Controller), 2) ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™(Service/Domain) ์ด์›ํ™”.

  • Repository๋Š” ์งˆ์˜๋ช…์„ธ ์ค‘์‹ฌ(Specification/Query Object), ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ์—†์Œ.

  • ์˜ˆ์™ธ๋Š” ์˜๋ฏธ ์žˆ๋Š” ๋„๋ฉ”์ธ ์˜ˆ์™ธ๋กœ ์Šน๊ฒฉ, ์ปจํŠธ๋กค๋Ÿฌ ์–ด๋“œ๋ฐ”์ด์Šค๋กœ ๋งคํ•‘.





์ฃผ์˜: ์‘๋‹ต์ž๊ฐ€ ์—ฌ๋Ÿฌ CSP์— ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต์ˆ˜์‘๋‹ต ๋ฐฉ์‹์ด๋ผ ์ดํ•ฉ์ด 100%๋ฅผ ์ดˆ๊ณผํ•จ.

ํด๋ผ์šฐ๋“œ ๊ธฐ๋ณธ ๊ฐœ๋…

1) ํด๋ผ์šฐ๋“œ๊ฐ€ ํ•ด๊ฒฐํ•œ ๊ฒƒ

  • ๋ฌผ๋ฆฌ ์„œ๋ฒ„ ๊ตฌ๋งค/์„ค์น˜/ํ™•์žฅ์— ์ˆ˜์ฃผ~์ˆ˜๊ฐœ์›” โŸถ ๋ถ„/์ดˆ ๋‹จ์œ„๋กœ ํ”„๋กœ๋น„์ €๋‹.

  • ํƒ„๋ ฅ ํ™•์žฅ/์ถ•์†Œ, ์‚ฌ์šฉํ•œ ๋งŒํผ๋งŒ ๋น„์šฉ ์ง€๋ถˆ(Pay-as-you-go).

  • ๋„คํŠธ์›Œํฌ/์Šคํ† ๋ฆฌ์ง€/๋ณด์•ˆ/๋ชจ๋‹ˆํ„ฐ๋ง์„ API๋กœ ๊ด€๋ฆฌ(IaC).

2) ์„œ๋น„์Šค ๋ชจ๋ธ ํ•œ๋ˆˆ์—

๋ชจ๋ธ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ œ๊ณต์ž๊ฐ€ ๊ด€๋ฆฌ์˜ˆ์‹œ
IaaSOS, ๋Ÿฐํƒ€์ž„, ์•ฑ, ๋ฐ์ดํ„ฐํ•˜๋“œ์›จ์–ด/๊ฐ€์ƒํ™”/๋„คํŠธ์›ŒํฌEC2, Azure VM
PaaS์•ฑ, ๋ฐ์ดํ„ฐOS/๋Ÿฐํƒ€์ž„/๋ฏธ๋“ค์›จ์–ด/์ธํ”„๋ผElastic Beanstalk, App Engine
SaaS์‚ฌ์šฉ๋งŒ ํ•จ์ „๋ถ€Gmail, Slack
FaaS/BaaSํ•จ์ˆ˜ ์ฝ”๋“œ์‹คํ–‰ ํ™˜๊ฒฝยท์Šค์ผ€์ผ๋งAWS Lambda, Cloud Functions

  • IaaS โ†’ Infrastructure as a Service (์„œ๋น„์Šคํ˜• ์ธํ”„๋ผ)
    PaaS โ†’ Platform as a Service (์„œ๋น„์Šคํ˜• ํ”Œ๋žซํผ)
    SaaS โ†’ Software as a Service (์„œ๋น„์Šคํ˜• ์†Œํ”„ํŠธ์›จ์–ด)
    FaaS โ†’ Function as a Service (์„œ๋น„์Šคํ˜• ํ•จ์ˆ˜/๊ธฐ๋Šฅ, ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… ๋ชจ๋ธ)

    3) ์ธํ”„๋ผ ๊ธฐ์ดˆ ์šฉ์–ด
    • EC2 โ†’ Elastic Compute Cloud : ๊ฐ€์ƒ ์„œ๋ฒ„(์ธ์Šคํ„ด์Šค)๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ์ปดํ“จํŒ… ์„œ๋น„์Šค.

    • S3 โ†’ Simple Storage Service : ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค, ํŒŒ์ผยท์ด๋ฏธ์ง€ยท๋ฐฑ์—… ์ €์žฅ์— ๋งŽ์ด ์”€.

    • RDS โ†’ Relational Database Service : ๊ด€๋ฆฌํ˜• ๊ด€๊ณ„ํ˜• DB ์„œ๋น„์Šค (MySQL, PostgreSQL, Aurora ๋“ฑ ์ง€์›).


      4) ํด๋ผ์šฐ๋“œ ์„ค๊ณ„ 6์›์น™(์š”์•ฝ)

    1. ์šด์˜ ์šฐ์ˆ˜์„ฑ: ์ž๋™ํ™”/๊ด€์ฐฐ/๋Ÿฐ๋ถ.

    2. ๋ณด์•ˆ: ์•”ํ˜ธํ™”ยทIAMยท๊ฐ์‚ฌ.

    3. ์‹ ๋ขฐ์„ฑ: ๋ฉ€ํ‹ฐ-AZยท์˜คํ† ๋ฆฌ์ปค๋ฒ„๋ฆฌยท๋ฐฑ์˜คํ”„ ์žฌ์‹œ๋„.

    4. ์„ฑ๋Šฅ ํšจ์œจ: ์ ํ•ฉํ•œ ์ปดํ“จํŠธ/์Šคํ† ๋ฆฌ์ง€ ์„ ํƒ.

    5. ๋น„์šฉ ์ตœ์ ํ™”: ์„œ๋ฒ„๋ฆฌ์Šคยท์ŠคํŒŸ/RIยท์˜คํ† ์Šค์ผ€์ผ.

    6. ์ง€์†๊ฐ€๋Šฅ์„ฑ: ๋ฆฌ์†Œ์Šค ํšจ์œจ/ํƒ„์†Œ ๋ฐœ์ž๊ตญ ๊ฐ์†Œ.



    6) ์‹ค๋ฌด ์ฒดํฌ๋ฆฌ์ŠคํŠธ

    • Stateless ์•ฑ์œผ๋กœ ์„ค๊ณ„

      ์‚ฌ์šฉ์ž ์„ธ์…˜ ์ •๋ณด, ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…, ์ž„์‹œ ๋ฐ์ดํ„ฐ<-์„œ๋ฒ„ ์ž์ฒด๋Š” ์ด๋Ÿฐ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค. ํŠน์ • ์„œ๋ฒ„๊ฐ€ ์ฃฝ์–ด๋„ ๋ฌธ์ œ ์—†์Œ. ๋‹ค๋ฅธ ์„œ๋ฒ„๊ฐ€ ๋˜‘๊ฐ™์ด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ.๋ฐฐํฌ ์‹œ์—๋„ ์„œ๋ฒ„ ๊ฐ„ ์ƒํƒœ ์‹ฑํฌ ๊ณ ๋ฏผ ๋ถˆํ•„์š”.

    • ๋ฉ€ํ‹ฐ-AZ ๊ธฐ๋ณธ,ํฌ๋ฆฌํ‹ฐ์ปฌ์€ ๋ฉ€ํ‹ฐ-๋ฆฌ์ „ ๋ณต์ œ ๊ฒ€ํ† .

      AZ(Availability Zone) = AWS ๊ฐ™์€ ํด๋ผ์šฐ๋“œ์—์„œ ํ•œ ๋ฆฌ์ „(Region) ์•ˆ์— ์žˆ๋Š” ์„œ๋กœ ๋ถ„๋ฆฌ๋œ ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๋‹จ์œ„.์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ DB๋ฅผ ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ AZ์— ๋™์‹œ์— ๋ฐฐ์น˜.

      ํฌ๋ฆฌํ‹ฐ์ปฌ์€ ๋ฉ€ํ‹ฐ-๋ฆฌ์ „ ๋ณต์ œ ๊ฒ€ํ†  - Multi-AZ๋งŒ์œผ๋กœ๋Š” โ€œ๋ฆฌ์ „ ์ „์ฒด ์žฅ์• โ€๋Š” ๋ง‰์„ ์ˆ˜ ์—†์Œ. (์˜ˆ: AWS ์„œ์šธ ๋ฆฌ์ „ ์ „์ฒด์— ์žฅ์•  ๋ฐœ์ƒ).์—ฌ๋Ÿฌ ๋ฆฌ์ „์— ๋™์‹œ์— ๋ฐ์ดํ„ฐ ๋ณต์ œ & ์„œ๋น„์Šค ๋ฐฐํฌ.