๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ Bounded Context

๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ๊ฒฝ๊ณ„

๋„๋ฉ”์ธ์„ ์™„๋ฒฝํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋‹จ์ผ ๋ชจ๋ธ์„ ๋งŒ๋“œ๋Š” ์‹œ๋„?

  • ๋„๋ฉ”์ธ์€ ๋‹ค์‹œ ์—ฌ๋Ÿฌ ํ•˜์œ„ ๋„๋ฉ”์ธ์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
  • ๋ชจ๋“  ํ•˜์œ„ ๋„๋ฉ”์ธ์— ๋งž์ง€ ์•Š๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.

๋„๋ฉ”์ธ์˜ ์ด๋ฆ„๊ณผ ์กด์žฌ

  • ์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ์—ญํ• 

    • ์นดํƒˆ๋กœ๊ทธ ๋„๋ฉ”์ธ : ์ƒํ’ˆ(์ƒํ’ˆ ์ด๋ฏธ์ง€, ์ƒํ’ˆ๋ช…, ๊ฐ€๊ฒฉ)
    • ์žฌ๊ณ  ๊ด€๋ฆฌ ๋„๋ฉ”์ธ : ์ƒํ’ˆ(์‹ค์กดํ•˜๋Š” ๊ฐœ๋ณ„ ๊ฐ์ฒด๋ฅผ ์ถ”์  ๋ชฉ์ )
  • ์ด๋ฆ„์€ ๋‹ค๋ฅด์ง€๋งŒ ๊ฐ™์€ ์—ญํ• 

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

  • ํ•˜์œ„ ๋„๋ฉ”์ธ๋งˆ๋‹ค ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

  • ๊ฐ ๋ชจ๋ธ์€ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ ธ์„œ ์„ž์ด์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

  • ์„ž์ด๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋ชจ๋ธ์˜ ์˜๋ฏธ๊ฐ€ ์•ฝํ•ด์งˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ

  • ํ•˜์œ„ ๋„๋ฉ”์ธ ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ๋ฐœ์ „ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋ธ์— ๋ฐ˜์˜ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

Bounded Context

  • ๋ชจ๋ธ์€ ํŠน์ •ํ•œ Context์—์„œ ์™„์ „ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๊ตฌ๋ถ„๋˜๋Š” ๊ฒฝ๊ณ„๋ฅผ ๊ฐ–๋Š” Context๋ฅผ DDD์—์„œ๋Š” Bounded Context๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • Bounded Context๋Š” ๋ชจ๋ธ์˜ ๊ฒฝ๊ณ„๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉฐ ํ•œ ๊ฐœ์˜ Bounded Context๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ํ•œ ๊ฐœ์˜ ๋ชจ๋ธ์„ ๊ฐ–๋Š”๋‹ค.
  • ํŒ€ ์กฐ์ง ๊ตฌ์กฐ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๊ธฐ๋„ ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ ์•ˆ์— 2๊ฐœ์˜ Bounded Context

๋‘๊ฐœ์˜ ๋„๋ฉ”์ธ ์•ˆ์— 1๊ฐœ์˜ Bounded Context

์ฃผ์˜ํ•  ์ .

  • ํ•˜์œ„ Domain์˜ ๋ชจ๋ธ์ด ๋’ค์„ž์ด์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๊ฐœ๋ณ„ Bounded Context Package๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ํ•˜์œ„ Domain์ด ์„ž์ด์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋„๋ฉ”์ธ์ด ์„ž์ด๊ฒŒ ๋œ๋‹ค๋ฉด ๊ธฐ๋Šฅ ํ™•์žฅ์ด ์–ด๋ ต๊ฒŒ ๋˜๊ณ  ์ด๋Š” ์„œ๋น„์Šค์˜ ๊ฒฝ์Ÿ๋ ฅ์„ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

Bounded Context์˜ ๊ตฌํ˜„

  • Bounded Context๋Š” ์•„๋ž˜๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
    • ํ‘œํ˜„ ์˜์—ญ
    • ์‘์šฉ ์„œ๋น„์Šค
    • ๋„๋ฉ”์ธ
    • ์ธํ”„๋ผ ์˜์—ญ

์ฃผ์˜ํ•  ์ .

  • ๋ชจ๋“  Bounded Context๋ฅผ ๋ฐ˜๋“œ์‹œ Domain Driven์œผ๋กœ ๊ฐœ๋ฐœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ๊ฐ„๋‹จํ•œ DAO์™€ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ VO(Value Object)๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•ด๋„ ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๋ถ€๋ถ„์— ํฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.
  • ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ ์ž์ฒด๊ฐ€ ๋‹จ์ˆœํ•˜๋ฉด ์„œ๋น„์Šค-DAO๋กœ ๊ตฌ์„ฑ๋œ CRUD ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋„ ์ฝ”๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค.

CQRS Pattern(Command Query Resposibility Segregaton)

  • ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น ๊ธฐ๋Šฅ๊ณผ ๋‚ด์šฉ์„ ์กฐํšŒํ•˜๋Š” Query ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๋ชจ๋ธ์„ ๊ตฌ๋ถ„ํ•˜๋Š” Pattern
  • ํ•˜๋‚˜์˜ Bound Context ์•ˆ์— CRUD์™€ Domain Driven ๋ฐฉ์‹์„ ์„ž์–ด์„œ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • Domain : ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น ๊ธฐ๋Šฅ
    • DAO(Data Access Object) : ์กฐํšŒ ๊ธฐ๋Šฅ
    • CQRS๊ฐ€ ๋Œ€ํ‘œ์ ์ธ Pattern

Bound Context ๊ฐ„ ํ†ตํ•ฉ

์™œ(Bound Context)๋ฅผ ํ†ตํ•ฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

  • ์„œ๋กœ ๋‹ค๋ฅธ Bound Context์—์„œ ์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ๋„๋ฉ”์ธ ๊ด€์ ์ด ๋‹ฌ๋ผ์„œ ๋‚ด์šฉ์ด ๋‹ค๋ฅธ Model์ด ์žˆ๋‹ค.
  • ๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ˆ์‹œ๋ฅผ ๋“ ๋‹ค๋ฉด?
    • ์ถ”์ฒœ ์‹œ์Šคํ…œ๊ณผ ์ถ”์ฒœ์„ ์‚ฌ์šฉํ•˜๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ์‹œ์Šคํ…œ์€ ์ƒํ’ˆ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ค๋ฅด๋‹ค.
    • ์ถ”์ฒœ ์‹œ์Šคํ…œ : ์ƒํ’ˆ์— ๋Œ€ํ•œ ์ถ”์ฒœ ์ ์ˆ˜์™€ ๊ฐ™์€ ์ถ”์ฒœ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋‹ค.
    • ์นดํ…Œ๊ณ ๋ฆฌ ์‹œ์Šคํ…œ : ์นดํ…Œ๊ณ ๋ฆฌ ์ •๋ณด์™€ ๊ฐ™์€ ์นดํ…Œ๊ณ ๋ฆฌ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋‹ค.

  • ์ œ๊ณตํ•˜๋Š” ์ธก์—์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.
    • ์‚ฌ์šฉํ•˜๋Š” ์ธก์—์„  ์ž…๋ง›์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.
  • ์ง์ ‘ REST API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ†ตํ•ฉํ•˜๋Š” ๋Œ€์‹  ํ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„์ ‘์ ์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ๋‹ค.

Bound Context ๊ฐ„ ๊ด€๊ณ„

  • ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ์ธก์€ ์ œ๊ณตํ•˜๋Š” ์ธก์— ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
  • ์ œ๊ณตํ•˜๋Š” ์ธก์ด ํ”„๋กœํ† ์ฝœ์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด ์‚ฌ์šฉํ•˜๋Š” ์ธก์—์„œ๋Š” ๋งŽ์€ ์ˆ˜์ •์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋Œ€ํ‘œ์ ์ธ ์˜ˆ : ์ œ๊ณต[๊ฒ€์ƒ‰], ์‚ฌ์šฉ[๋ธ”๋กœ๊ทธ, ์นดํŽ˜, ๋ฉ”์ผ]
  • ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋“ฑ์žฅ
    • Google Protocol Buffer
    • XML, JSON ํ˜•ํƒœ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ

์†์ƒ ๋ฐฉ์ง€ ๊ณ„์ธต(Anticorruption Layer)

  • ์œ„ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ Layer๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์™ธ๋ถ€์— ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ์—๋„ ๊ธฐ์กด ๋„๋ฉ”์ธ์˜ ์˜ํ–ฅ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

๊ณต์œ  ์ปค๋„(Shared Kernel)

  • ๋‘ Bound Context๊ฐ€ ๊ฐ™์€ ๋ชจ๋ธ์„ ๊ณต์œ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์žฅ์ 
    • ์ค‘๋ณต ๊ฐœ๋ฐœ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ 
    • ํ•œ ํŒ€์—์„œ ์ž„์˜๋กœ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
    • ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋น„์šฉ์ด ์†Œ์š”๋œ๋‹ค.

์ •๋ฆฌํ•˜๋ฉฐ

  • ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์—์„œ ์—๋ฆญ ์—๋ฐ˜์Šค๋Š” ๋Œ€๊ทœ๋ชจ ์กฐ์ง์—์„œ ๋„ˆ๋ฌด ํฐ ๋‹จ์œ„ ๋ชจ๋ธ์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋น„ํ˜„์‹ค์ ์ด๋ผ๋ฉด์„œ ๋…๋ฆฝ์ ์ธ ๋ณดํŽธ์  ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„๋ฉ”์ธ ์˜์—ญ์„ ์ œํ•œํ•˜๋„๋ก ๊ถŒํ•ฉ๋‹ˆ๋‹ค.
  • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์˜ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๋Š” ๊ฒŒ DDD์˜ ๋ชฉ์  ์ค‘ ํ•˜๋‚˜์ธ๋ฐ ์˜คํžˆ๋ ค DDD ๋•Œ๋ฌธ์— ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ๋ณต์žกํ•ด์ง„๋‹ค๋ฉด ์ด๋Š” DDD์˜ ์• ์ดˆ ๋ชฉ์ ์—๋„ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Bounded Context ์ •๋‹ต์€ ์‚ฌ๋žŒ๋“ค๊ณผ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด ๊ฐ€๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.

Reference