๐Ÿ‘จ‍๐Ÿ‘ฉ‍๐Ÿ‘ง‍๐Ÿ‘ฆ Project/๐Ÿ“ฉ DevTalk

CQS๋ฅผ ๊ณ๋“ค์ธ ํ—ฅ์‚ฌ๊ณ ๋‚ (Hexagonal) ์•„ํ‚คํ…์ฒ˜ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ์™€ ํด๋ž˜์Šค ๋„ค์ด๋ฐ

DevPoong 2023. 7. 7. 14:58

โœข ํ”„๋กœ์ ํŠธ์—์„œ ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๊ณ , MSA ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ž ๋ถ„๋ฆฌ๋œ ๋‹ด๋‹น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•œ๋‹ค. ์•„๋ฌด๋ฆฌ ๋ถ„๋ฆฌ๋œ ์„œ๋น„์Šค๋ผ๊ณ  ํ•ด๋„ ์ฒ˜์Œ์—๋Š” ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋‚˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์ •ํ•ด๋†“๋Š” ๊ฒŒ ์ถ”ํ›„์— ์„œ๋กœ ์ฝ”๋“œ๋ฆฌ๋ทฐํ•  ๋•Œ ํŽธํ•˜๊ณ  ์—ฌ๋Ÿฌ ์žฅ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•˜์˜€๋‹ค. 

1. ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ

์— ๋Œ€ํ•œ ๊ฒƒ์€ ์ด์ „ ํฌ์ŠคํŒ…์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

2023.07.06 - [๐Ÿ‘จ‍๐Ÿ‘ฉ‍๐Ÿ‘ง‍๐Ÿ‘ฆ Project/๐Ÿ“ฉ DevTalk] - ํ—ฅ์‚ฌ๊ณ ๋‚ (Hexagonal) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณต๋ถ€ํ•ด ๋ณด์ž (with Layered, Clean Architecture)

2. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ

src.groupname
          ใ„ด global
                  ใ„ด config
                  ใ„ด util
                  ใ„ด error
                         ใ„ด exception
                         ใ„ด handler
           ใ„ด {์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ์ด๋ฆ„}
                   ใ„ด adapter
                   |        ใ„ด in
                   |        |   ใ„ด web
                   |        |        ใ„ด dto
                   |        |
                   |        ใ„ด out
                   |             ใ„ด persistence
                   |             ใ„ด producer
                   |
                   |
                   |
                   |
                   ใ„ด domain
                   |
                   |
                   |
                   ใ„ด application
                                ใ„ด port
                                |     ใ„ด in
                                |     |   ใ„ด dto
                                |     |      
                                |     |
                                |     ใ„ด out
                                |          ใ„ด repository
                                |          ใ„ด producer
                                | 
                                |
                                ใ„ด validator

 

3. ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋„ค์ด๋ฐ ๊ทœ์น™ (์ˆ˜์ •๋จ)

  • global.error.exception: ~Exception
  • global.util: ~Utils
  • global.config: ~Config
  • adapter.in.web: ~ApiController
  • adapter.in.web.dto: ~Input, ~Output
  • adatper.in.consumer: ~Consumer
  • adapter.out.producer: ~Producer
  • adatper.out.persistence:  ~QueryRepo
  • application.port.out.repository: ~Repo, QueryableRepo
  • application.port.in.dto: ~Req, ~Res
  • application.port.out.producer: ~ProducerPort
  • application.validator: ~Validator
  • application.port.in: ~UseCase
  • application: ~Service

 

4. ๊ธฐํƒ€ ๊ทœ์น™

  1. ์–ด๋Œ‘ํ„ฐ์—์„œ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ํฌํŠธ๋“ค์€ public
  2. ๋„๋ฉ”์ธ ํด๋ž˜์Šค๋“ค์€ ์„œ๋น„์Šค ๊ทธ๋ฆฌ๊ณ  ์ž ์žฌ์ ์œผ๋กœ ์–ด๋Œ‘ํ„ฐ์—๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก public
  3. ์„œ๋น„์Šค๋Š” ์ธ์ปค๋ฐ ํฌํŠธ ์ธํ„ฐํŽ˜์ด์Šค ๋’ค์— ์ˆจ๊ฒจ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— package-private(java: default)
  4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์ด ์ธ์ปค๋ฐ/์•„์›ƒ๊ณ ์ž‰ ์–ด๋Œ‘ํ„ฐ์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ
  5. adapter ํŒจํ‚ค์ง€ ๋‚ด์—์„œ๋Š” ๋ชจ๋‘ package-private

 

5. CQS(Command Query Separation) ํŒจํ„ด

๊ธฐ์กด์—๋Š” Repository ์ˆ˜์ค€์—์„œ CQS๋ฅผ ์ ์šฉํ•˜๊ณ ์ž ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ•˜๋Š” ์„œ๋น„์Šค๋Š” Command ์ฟผ๋ฆฌ์˜ ๋น„์ค‘์ด ์ ์—ˆ๊ธฐ์— ๊ดœํžˆ ์˜์กด์„ฑ๋งŒ ๋Š˜์–ด๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์กฐํšŒ์šฉ Repository๋Š” ๋ถ„๋ฆฌํ•˜๋˜ ์“ฐ๊ธฐ์šฉ์€ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  JpaRepository๋ฅผ ์ƒ์†ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. 

Command์™€ Query๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด

CRUD(Create, Read, Update, Delete)์—์„œ Command๋Š” Create, Update, Delete์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์ด๊ณ , Query๋Š” Read์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ๋‹จ์ˆœ ์กฐํšŒํ•˜๋Š” ์ž‘์—…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋Š” Command์™€ Query ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ํ•ด์•ผ ํ•œ๋‹ค.

์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ, ์œ ์ง€๋ณด์ˆ˜๋‚˜ ๊ฐ€๋…์„ฑ์— ๋„์›€์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚˜๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ Repository์™€ UseCase์—์„œ ํด๋ž˜์Šค ๋‹จ์œ„๋กœ CQS ํŒจํ„ด์„ ์ ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค. 

 

6. CQS์™€ CQRS ์ฐจ์ด์ 

CQRS๋Š” Command and Query Responsibility Segregation)์œผ๋กœ CQS์˜ ํ™•์žฅ๋œ ์ˆ˜์ค€์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
ํ•˜์ง€๋งŒ CQS๋Š” ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ์—ฐ์‚ฐ ์ˆ˜์ค€์—์„œ ๋ถ„๋ฆฌํ•˜์ง€๋งŒ, CQRS๋Š” ๊ฐœ์ฒด๋‚˜ ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ๋ถ„๋ฆฌํ•œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.