๐Ÿฃ ์‹ค์ „! ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์™€ ์„ค๊ณ„ | ์ธํ”„์ฝ˜ 2022

  • "์™œ" ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๊ฐ€ ์ค‘์š”ํ• ๊นŒ?
    1. ์ž˜๋ชป ๊ตฌ์„ฑ์‹œ ์ถ”ํ›„ ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›€
    2. ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์— ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๋Š” ์ผ๋ จ์˜ ์„ค๊ณ„ ๊ณผ์ •
    3. ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์— ๋ง‰๋Œ€ํ•œ ์˜ํ–ฅ
  • "๋ฌด์—‡"์„ ๊ธฐ์ค€์œผ๋กœ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ„์–ด์•ผ ํ•˜๋Š”๊ฐ€?
    • ๊ฒฝ๊ณ„ ์•ˆ์—์„œ ์˜๋ฏธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ฃน์„ ์ •์˜ํ•˜๊ณ  ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š” (Bounded Context)
    • ์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ ๊ด€๊ณ„๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ๋‹ค์‹œ ์ƒ๊ฐ
  • "์–ด๋–ป๊ฒŒ" ์‹ค์ „ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
    • ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค์‹œ ๊ฒฝ๊ณ„๋ฅผ ๋‚˜๋ˆ„๊ณ  ๊ทธ ๊ธฐ์ค€์œผ๋กœ ์†Œ์Šค ์ €์žฅ์†Œ๋ฅผ ๋ถ„๋ฆฌ
    • Infra(์™ธ๋ถ€) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” Data ๊ด€๋ จ ๊ตฌํ˜„ ์ง€ํ–ฅ
    • ์„œ๋น„์Šค ๊ตฌํ˜„์€ ๊ฐ์ž ์—ญํ• ์— ๋งž๊ฒŒ ๊ฐ๊ฐ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Œ(๊ณตํ†ต์œผ๋กœ ํ•œ์ชฝ์— ๊ตฌํ˜„ X)
    • ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ ๊ตฌํ˜„์ด ์‹ค์ œ ์„œ๋น„์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ „ํ™˜
  • ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ž€?
    • ๊ธฐ์ˆ  ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ
  • ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์ด์œ ๋กœ Core์™€ Common์— ๊ณตํ†ต ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์ฆ๊ฐ€ํ–ˆ์„ ๋•Œ ๋ชจ๋“ˆ ๊ฐ„ ์ข…์†์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ
  • core์™€ common ์‚ญ์ œ
    • ์ฝ”๋“œ ์ค‘๋ณต์ด ๊ฐ–๊ณ  ์žˆ๋Š” ์œ„ํ—˜๋ณด๋‹ค ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ์ž ์žฌ์ ์ธ ์œ„ํ—˜์„ฑ์ด ๋” ํฐ ๋ฌธ์ œ
  • DDD(: Domain-Driven Design) Bounded Context
    • ํŠน์ •ํ•œ ์ปจํ…์ŠคํŠธ ๋ฌธ๋งฅ ํ•˜์—์„œ ์™„์ „ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ๊ณ„์˜ ๊ธฐ์ค€์„ ๋‚˜๋ˆ„์–ด์•ผ ํ•จ
  • ex) ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ๊ทธ๋ฃน์ด๋ผ๋Š” 4๊ฐœ์˜ ๊ทธ๋ฃน์„ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉ
    1. Boot(Server)
      • batch, admin, api
      • ์ฝ”๋“œ์˜ ๋ณ€ํ™”๊ฐ€ ์žฆ์€ ๋ชจ๋“ˆ
    2. Data(Domain)
      • meta, user, chart
      • ์„œ๋ฒ„ ๋ชจ๋“ˆ๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„
    3. Infra(์—ฐ๋™๋ชจ๋“ˆ)
      • and, vod, photo, billing
      • ์œ ๊ด€ ๋ถ€์„œ ๋ฐ ์—…์ฒด ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ๊ทธ๋ฃน
      • ๊ตฌํ˜„ ์‹œ ๋ณ€ํ™”๋Š” ์ ์ง€๋งŒ, ์ถ”ํ›„ ๋ฒ„์ „ ์—… ์‹œ ์ฝ”๋“œ์— ํฐ ๋ณ€ํ™”
    4. Cloud(System)
      • config, gateway, discovery
      • ์„œ๋ฒ„ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ทธ๋ฃน(์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ, ํŠธ๋ž˜ํ”ฝ ์ œ์–ด๋ฅผ ์œ„ํ•œ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ ๊ทธ๋ฃน)
      • ๋ณ€ํ™” ์ ์Œ
  • ๋นŒ๋“œ ๋„๊ตฌ(gradle)์—์„œ ๊ทธ๋ฃน ํด๋”๋ช…์„ ๊ธฐ์ค€์œผ๋กœ ์ •์˜ํ•  ๊ธฐ์ˆ ๋“ค์„ ์ผ๊ด„์ ์œผ๋กœ ์„ ์–ธ ๊ฐ€๋Šฅ
  • ๋ชจ๋“ˆ์„ ๋‚˜๋ˆ„๊ณ  ๋ชจ๋“ˆ ํŠน์„ฑ์— ๋งž๊ฒŒ ๋” ๋ถ„๋ฆฌํ•˜๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๊ฐ์†Œํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ๊ฒฝ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•ด์ ธ ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•ด์ง
  • ์ผ๋ฐ˜์ ์ธ Spring ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ โ†’ ์„œ๋น„์Šค โ†’ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์ˆœ์„œ์ธ๋ฐ "์„œ๋น„์Šค"๋Š” ์–ด๋Š ๋ชจ๋“ˆ์— ์œ„์น˜ํ•ด์•ผ ํ• ๊นŒ?
    • Boot์™€ Data ์–‘์ชฝ์— ๋ชจ๋‘ ์กด์žฌํ•ด Boot ์„œ๋น„์Šค์—์„œ Event ๋ฐœ์ƒ ์‹œ Data ์„œ๋น„์Šค๊ฐ€ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹
    • ์ด์ฒ˜๋Ÿผ ์„œ๋น„์Šค ๊ตฌํ˜„์ฒด๋Š” ํ”„๋กœ์ ํŠธ ๋ณ„๋กœ ์—ญํ• ์— ๋งž๋„๋ก ๊ฐ๊ฐ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
      • Data ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Survlet Request์™€ ๊ฐ™์€ ์›น ์„œ๋ฒ„์— ์˜์กด์ ์ธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„์•ผ ๋จ (R&R ์œ„๋ฐ˜)
        Servlet Request ๊ฐ์ฒด๊ฐ€ ๋ง๋‹จ Layer๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒฝ์šฐ ์—ญํ• ๊ณผ ์ฑ…์ž„, ํ˜‘๋ ฅ๊ด€๊ณ„์— ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Œ
        Data ๋ชจ๋“ˆ์€ Batch, ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜, ์›ํƒ€์ž„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด(๋ชจ๋‘๊ฐ€ ์›น ์„œ๋ฒ„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ) ์ฟ ํ‚ค, ์„ธ์…˜, ์›น ๋“ฑ ์˜์กด์ ์ธ ํด๋ž˜์Šค๋“ค ์ „๋‹ฌ X)
      • Data ํ”„๋กœ์ ํŠธ์— ์›น ๊ฐœ๋ฐœ ์˜์กด์„ฑ์ด ๊ฐ•ํ•˜๊ฒŒ ์ฃผ์ž…๋˜๋ฉด, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ์›น ์„œ๋ฒ„ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ด์ ธ Mock ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•ด์•ผ ๋˜๋Š” ๋“ฑ ๋ชจ๋“ˆ์„ ๋‚˜๋ˆˆ ์˜๋ฏธ๊ฐ€ ์ƒ์‹ค๋จBoot์™€ Meta ํ”„๋กœ์ ํŠธ ๊ฐ„์—๋Š” ์ƒํ˜ธ ๊ฐ„ ๊ทœ์น™ ํ•„์š”


๐Ÿฃ ์šฐ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ๋ชจ๋“ˆ์„ ๋‚˜๋ˆด์–ด์š”: ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ์„ ์„ค๊ณ„ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ด€์  | ์ธํ”„์ฝ˜ 2023

 

[Server] ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ด€์ ๊ณผ ๊ณ ๋ ค์‚ฌํ•ญ with Spring & Gradle

์ด๋ฒˆ์—๋Š” ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์€ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ธฐ์ค€๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ๊ณ ๋ ค์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋‚ด์šฉ์€ ์ ˆ๋Œ€์ ์ธ ๊ธฐ์ค€์ด ์•„๋‹ˆ๋ฉฐ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ์„ ์ฐธ

mangkyu.tistory.com

 

GitHub - MangKyu/multimodule-sample

Contribute to MangKyu/multimodule-sample development by creating an account on GitHub.

github.com

  • "์–ด๋–ค" ๋ชจ๋“ˆ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๊ฐ€?
    • ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ๊ณตํ†ต ์ฝ”๋“œ โ†’ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ โ†’ ๊ธฐ๋Šฅ๋ณ„ ๋ถ„๋ฆฌ
    • SRP๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๊ฒŒ
  • "์–ด๋–ป๊ฒŒ" ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
    • ์œ ์Šค์ผ€์ด์Šค(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)๋Š” ๊ณตํ†ต ๋ชจ๋“ˆ์—์„œ ์ œ๊ฑฐ
    • ์ž๋™ ๋นˆ ์Šค์บ” ๋ฐฉ์‹ ์‚ฌ์šฉ X
    • ์—„๊ฒฉํ•˜๊ฒŒ ๊ณตํ†ต ๋ชจ๋“ˆ ๊ด€๋ฆฌ
  • Common ๋ชจ๋“ˆ
    • ์˜์กด์„ฑ ๊ด€๋ฆฌ, Entity, Application, Service ๊ณ„์ธต ์ฝ”๋“œ ๊ด€๋ฆฌ
    • ์ง์—… ์ˆ˜ํ–‰ ๋ฐ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์•… ์–ด๋ ค์›€
      • Common์„ ์ˆ˜์ •ํ•˜๊ณ  ๋ฐฐํฌํ•ด์•ผ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค์˜ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•จ
      • ํ•˜๋‚˜์˜ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ํžˆ์Šคํ† ๋ฆฌ์— ํผ์ ธ์žˆ์–ด ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›€
    • ์„œ๋น„์Šค ๋ถ„๋ฆฌ ์–ด๋ ค์›€
    • SRP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ธฐ ์‰ฌ์›€
      • SRP = ๋ณ€๊ฒฝ์˜ ์ด์œ ๊ฐ€ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค = ์•กํ„ฐ๊ฐ€ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค
    • Common์˜ ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›€
      • Common ์ˆ˜์ • ์‹œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์˜ํ–ฅ
      • ์˜์กด์„ฑ ๊ด€๋ฆฌ๊นŒ์ง€ Common์—์„œ ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ build๋‚˜ ์‹คํ–‰์—๊นŒ์ง€ ์˜ํ–ฅ
      • dead ์ฝ”๋“œ๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ legacy ์ฝ”๋“œ ๋Š˜์–ด๋‚จ
    • Common์— ๋ฐฐํฌ ์˜์กด์„ฑ์ด ์žˆ์Œ
      • ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ๋Š” ๋ฐฐํฌ ๋…๋ฆฝ์„ฑ๊ณผ ๊ฐœ๋ฐœ ๋…๋ฆฝ์„ฑ์ด ํ™•๋ณด๋˜์–ด์•ผ ํ•˜์ง€๋งŒ, ํ˜„์žฌ ๊ตฌ์กฐ๋ผ๋ฉด ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋จผ์ € ๋ฐฐํฌํ•ด์•ผ๋งŒ ํ•จ
  • ๊ฐœ๋ฐœํ•  ๋•Œ ์ธ์‹์˜ ์ „ํ™˜
    • ๊ฐœ๋ฐœ ์‹œ์ž‘์„ ํ…Œ์ด๋ธ” ์„ค๊ณ„๋ถ€ํ„ฐ ํ–ˆ์„ ๋•Œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ๋งž์ง€ ์•Š์•„ ํ…Œ์ด๋ธ”์„ ์—Ž์€ ์ ์ด ์žˆ์ง€ ์•Š์€๊ฐ€?
      โ†’ ํ…Œ์ด๋ธ” ์„ค๊ณ„๋ถ€ํ„ฐ ํ•˜๋Š” ๊ฒƒ์ด ๋งž์„๊นŒ?
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ "ํ”„๋ ˆ์ž„์›Œํฌ์— AOP๋ฅผ ์จ์•ผ์ง€, Cache๋Š” Redis DB๋Š” Mysql์„ ์จ์•ผ์ง€" ๋“ฑ์€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•„๋‹˜
      โ†’ ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๊ฐ€๊นŒ์›€
    • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์œ ์Šค์ผ€์ด์Šค
      • ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง: ์‹œ์Šคํ…œ์˜ ์œ /๋ฌด์™€ ์ƒ๊ด€์—†์ด ์กด์žฌํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
        ์ด๋Ÿฐ ๋กœ์ง๋“ค์€ ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•จ. ์ด๋ฅผ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ์ดํ„ฐ๋ผ๊ณ  ๋ถ€๋ฆ„
        ์ด ๋‘˜์„ ๋ฌถ์–ด์„œ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ํ˜น์€ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Œ
      • ์œ ์Šค์ผ€์ด์Šค: ์‹œ์Šคํ…œ์ด ์žˆ์–ด์•ผ ์œ ํšจํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
  • ์–ด๋–ค ๋ชจ๋“ˆ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์•ผ ํ• ๊นŒ?
    • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒƒ๋ถ€ํ„ฐ
      1. global-utils(๊ณตํ†ต ์ฝ”๋“œ)
        • ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ๋ชจ๋“ˆ(๋„๋ฉ”์ธ์— ๋ฌด๊ด€ํ•œ ์ฝ”๋“œ๋Š” ๊ฑฐ์˜ ์—†์Œ)
        • ์‹œ์Šคํ…œ์— ๋…๋ฆฝ์ ์ธ ๊ณตํ†ต ์ฝ”๋“œ ex) StringUtils
        • ์‹œ์Šคํ…œ์— ์ข…์†์ ์ธ ๊ณตํ†ต ์ฝ”๋“œ ex) ProductCode
          • ๋„๋ฉ”์ธ
          • ์ธํ”„๋ผ
      2. appstore-core
        • ๊ณตํ†ต ๋ชจ๋“ˆ
        • ์ˆ˜์ค€(Level: ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ)์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ
          - ์ž…๋ ฅ: HTTP, ์›น์†Œ์ผ“ ๋“ฑ
          - ์ถœ๋ ฅ: ์บ์‹œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ
        • ๊ณ ์ˆ˜์ค€(Domain)
          - ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์œผ๋กœ๋ถ€ํ„ฐ ๊ฑฐ๋ฆฌ๊ฐ€ ๋จผ ๊ฒƒ
          - ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์— ์˜ํ•ด ์ˆ˜์‹œ๋กœ ๋ณ€๊ฒฝ๋จ
        • ์ €์ˆ˜์ค€(Infra)
          - ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€๊นŒ์šด ๊ฒƒ
          - ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ ๋˜๋Š” ๋ณด์•ˆ ์ทจ์•ฝ์  ๋“ฑ์— ์˜ํ•ด ํŠน์ • ์‹œ์ ์— ๋ณ€๊ฒฝ๋จ
          - ํšŒ์‚ฌ ๊ณต๊ณต๋ง ์ถ”๊ฐ€ ์šด์˜, DB Migration ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ๋•Œ ์ €์ˆ˜์ค€ ๋ณ€๊ฒฝ๋จ
        • Domain๊ณผ Infra ์˜์—ญ์€ ๋‹ค๋ฅธ ์ˆ˜์ค€ = ๋‹ค๋ฅธ ๋ณ€๊ฒฝ ์†๋„
    • ๊ทธ ํ›„๋กœ๋Š” ๊ธฐ๋Šฅ๋ณ„๋กœ ์˜์กด์„ฑ์„ ๋‚˜๋ˆ”
      ๊ธฐ๋Šฅ๋ณ„๋กœ ํ•„์š”ํ•œ ์˜์กด์„ฑ๊ณผ ์ฝ”๋“œ ๋ณ€๊ฒฝ์˜ ์ฃผ๊ธฐ๊ฐ€ ๋‹ค๋ฆ„
      ex. api ์ œ๊ณต: RestDocs ๋“ฑ, admin: thymeleaf ๋“ฑ, ๋ฐฐ์น˜ ์ž‘์—…: Spring Batch ๋“ฑ
      1. appstore-batch
      2. appstore-admin
      3. appstore-apis
        • ์„œ๋กœ ๋‹ค๋ฅธ Actor๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“ˆ ๋‚˜๋ˆ”(SRP ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ)
          • creater: ์•ฑ์„ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ API
          • enduser: ์•ฑ์„ ์„ค์น˜/์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ API
          • ๊ธฐํƒ€ ๋“ฑ
  • ์œ ์Šค์ผ€์ด์Šค๊ฐ€ ๊ณตํ†ต ๋ชจ๋“ˆ์— ์กด์žฌํ•˜๋ฉด side effect ์ƒ๊น€
    • SRP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ
      (๋ชจ๋“  Actor๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต ๋ชจ๋“ˆ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ธ ์œ ์Šค์ผ€์ด์Šค๊ฐ€ ์žˆ์–ด์„œ)
    • ์œ ์Šค์ผ€์ด์Šค๋ฅผ ๊ณตํ†ต ๋ชจ๋“ˆ์—์„œ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ ์ค‘๋ณต์ธ ์ฝ”๋“œ๋“ค์ด ๋ณด์ธ๋‹ค๋ฉด ์šฐ๋ฐœ์  ์ค‘๋ณต(Actor๊ฐ€ ๋‹ค๋ฅด์ง€๋งŒ ์ค‘๋ณต์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ฝ”๋“œ) ์˜์‹ฌ
    • ์šฐ๋ฐœ์  ์ค‘๋ณต์ด ์•„๋‹Œ ์ง„์งœ ์ค‘๋ณต์ธ ์ฝ”๋“œ๋ผ๋ฉด, ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณตํ†ต API๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌ
    • ์ ˆ๋Œ€ ์ฝ”๋“œ ๊ณต์œ  X
  • ์ž๋™ ๋นˆ ์Šค์บ” ๋ฐฉ์‹ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ
    • ComponentScan์„ ํ†ตํ•ด ๋นˆ์„ ์ž๋™ ๋“ฑ๋กํ•˜๋ฉด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์„œ๋ฒ„์—์„œ๋„ ํ•ด๋‹น ๋นˆ ์„ค์ •์ด ๊ฐ•์ œ๋จ
      ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„
    • @Enable ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋™์  ๊ตฌ์„ฑ ์š”์†Œ ์„ ํƒ์„ ํ†ตํ•ด ์ธํ”„๋ผ ๊ตฌ์„ฑ ์ œ์–ด ๊ฐ€๋Šฅ
  • ์—„๊ฒฉํ•˜๊ฒŒ ๊ณตํ†ต ๋ชจ๋“ˆ ๊ด€๋ฆฌ
    • ์ปดํŒŒ์ผ ์ œํ•œ: ์–ธ์–ด(package-private ๊ฐ€์‹œ์„ฑ ๋“ฑ) ๋˜๋Š” ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ์ปดํŒŒ์ผ ์ œํ•œ
    • ๋นŒ๋“œ ์ œํ•œ: ๋นŒ๋“œ ๋„๊ตฌ ๋˜๋Š” ArchUnit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์„ ํ™œ์šฉํ•œ ๋นŒ๋“œ ์ œํ•œ
    • ๋จธ์ง€ ์ œํ•œ: Merge๋ฅผ ์œ„ํ•œ Approve ์ˆ˜ ์ œํ•œ ๋“ฑ
    • ๊ธฐํƒ€: Github Actions๋ฅผ ์ด์šฉํ•œ ๋ณ€๊ฒฝ ๋ชจ๋“ˆ ๋ผ๋ฒจ๋ง ๋“ฑ

๐Ÿฃ [์šฐ์•„ํ•œํ…Œํฌ์„ธ๋ฏธ๋‚˜] 190829 ์šฐ์•„ํ•œ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ by ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ถŒ์šฉ๊ทผ๋‹˜

 

๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ์„ค๊ณ„ ์ด์•ผ๊ธฐ with Spring, Gradle | ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ

{{item.name}} ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ์„ค๊ณ„ ์ด์•ผ๊ธฐ ์•ˆ๋…•ํ•˜์„ธ์š”. ๋ฐฐ๋‹ฌ์˜๋ฏผ์กฑ ํ”„๋ก ํŠธ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” ๊ถŒ์šฉ๊ทผ์ž…๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ์˜ ๊ฐœ๋…์„ ์ฒ˜์Œ์•Œ๊ฒŒ ๋˜์—ˆ์„ ๋•Œ๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ์ ๋“ค๊ณผ ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ

techblog.woowahan.com

  1. ๋…๋ฆฝ ๋ชจ๋“ˆ ๊ณ„์ธต(independently available)
    • ์‹œ์Šคํ…œ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ฑ๊ฒฉ์˜ ๋ชจ๋“ˆ
    • ์ž์ฒด๋กœ์„œ ๋…๋ฆฝ์ ์ธ ์—ญํ• ์„ ๊ฐ€์ง€๋ฉฐ ํ”„๋กœ์ ํŠธ ๋‚ด์— ์˜์กด ๊ด€๊ณ„๋ฅผ ๋‘์ง€ ์•Š์Œ
  2. ๊ณตํ†ต ๋ชจ๋“ˆ ๊ณ„์ธต(system core)
    • ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“  ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜๋ฐ–์— ์—†๋Š”
    • Type, Util ๋“ฑ์„ ์ •์˜(๋งŽ์ด ์“ฐ์ด๋Š” Type ์„ฑ๊ฒฉ์˜ DTO ํ˜น์€ ๊ธฐ๋ณธ์ ์ธ Util Class)
    • ๊ฐ€๋Šฅํ•˜๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
  3. ๋„๋ฉ”์ธ ๋ชจ๋“ˆ ๊ณ„์ธต(system domain)
    • ๋‚ด๋ถ€ ๋ชจ๋“ˆ ๊ณ„์ธต๊ณผ ๋น„์Šทํ•œ ์„ฑ๊ฒฉ์ด์ง€๋งŒ, ์ €์žฅ์†Œ์™€ ๋ฐ€์ ‘ํ•œ ์ค‘์‹ฌ ๋„๋ฉ”์ธ์„ ๋‹ค๋ฃจ๋Š” ๊ณ„์ธต
    • ์„œ๋น„์Šค ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ๋ชจ๋ฆ„
    • ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์€ ์ตœ๋Œ€ ํ•˜๋‚˜์˜ Infrastructure์— ๋Œ€ํ•œ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ง
    • ๋„๋ฉ”์ธ ๋ชจ๋“ˆ์„ ์กฐํ•ฉํ•œ ๋” ํฐ ๋‹จ์œ„์˜ ๋„๋ฉ”์ธ ๋ชจ๋“ˆ ์กด์žฌ ๊ฐ€๋Šฅ
    • ๋‹จ์ผ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ์‚ฌ์šฉ ๋ชจ๋“ˆ
      • Domain
        - Java ํด๋ž˜์Šค๋กœ ํ‘œํ˜„๋œ ๋„๋ฉ”์ธ Class๋“ค
      • Repository
        - ๋„๋ฉ”์ธ CRUD
        - ์‹œ์Šคํ…œ์—์„œ ๊ฐ€์žฅ ๋ณดํ˜ธ๋ฐ›์•„์•ผ ํ•˜๊ณ  ๊ฒฌ๊ณ ํ•ด์•ผ ํ•จ
        - ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ธฐ๋Šฅ์ด ์ค‘์‹ฌ ์—ญํ• ์ด๋ฉด ๋„๋ฉ”์ธ ๋ชจ๋“ˆ, ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ์„ ํ•˜๋Š” ์ธก์—์„œ ์ž‘์„ฑ
      • Service
        - ๋„๋ฉ”์ธ์˜ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ฑ…์ž„์ง
        - ๋„๋ฉ”์ธ์˜ ๋น„์ฆˆ๋‹ˆ์Šค๊ฐ€ ๋‹จ์ˆœํ•˜๋‹ค๋ฉด ์ƒ์„ฑ X
        - ํŠธ๋žœ์žญ์…˜์˜ ๋‹จ์œ„ ์ •์˜, ์š”์ฒญ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ, ์ด๋ฒคํŠธ ๋ฐœ์ƒ ๋“ฑ ๋„๋ฉ”์ธ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์ž‘์„ฑ
  4. ๋‚ด๋ถ€ ๋ชจ๋“ˆ ๊ณ„์ธต(in system available)
    • ์ €์žฅ์†Œ, ๋„๋ฉ”์ธ ์™ธ ์‹œ์Šคํ…œ์—์„œ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋“ค
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋„๋ฉ”์ธ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ๋ชจ๋ฆ„
    • ์ „์ฒด์ ์ธ ์‹œ์Šคํ…œ ์„œํฌํŠธ๋ฅผ ์œ„ํ•œ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ
    • ํ”„๋กœ์ ํŠธ์˜ ์–ด๋– ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ๋…๋ฆฝ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ์ด ์œ„์น˜๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋„๋ฉ”์ธ ๊ณ„์ธต ์˜์กด X
    • web, client, event-publisher ๋“ฑ ์ฒ˜๋ฆฌ
  5. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ ๊ณ„์ธต(application)
    • batch, worker, internal-api, external-api ๋“ฑ์˜ ๋ชจ๋“ˆ ์กด์žฌ
    • ์‚ฌ์šฉ์„ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ณ„์ธต์— ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ