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

Repository์—์„œ CQS๋ฅผ ํฌ๊ธฐํ•˜๊ณ  ์ˆ˜์ •ํ•œ ๊ณผ์ •

DevPoong 2023. 7. 13. 18:51

1. ๋ฌธ์ œ์ƒํ™ฉ

Repository๋‹จ์—์„œ Command์™€ Query๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์ฝ”๋“œ ์‘์ง‘๋„์™€ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ณ ์ž ํ•˜์˜€๋‹ค.

์ด์— ์ฒ˜์Œ ์‹œ๋„ํ–ˆ๋˜ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 Create, Update, Delete๋ฅผ ๋‹ด๋‹นํ•  CommandableRepo Interface์™€ Read๋ฅผ ๋‹ด๋‹นํ•  QueryableRepo Interface๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค.
๊ตฌํ˜„์ฒด๋Š” CommandRepo, QueryRepo๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.

์–ด๋– ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ saveํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•  ๋•Œ, ์ค‘๋ณต์กฐํšŒ๋‚˜ ๋‹ค๋ฅธ ์กฐํšŒ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ฃผ๋กœ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด๋Ÿด๋•Œ, Repository๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” Service ๊ณ„์ธต์—์„œ ์˜์กด์„ฑ์ด ๋„ˆ๋ฌด๋‚˜ ๋งŽ์•„์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

2. ๋ฌธ์ œํ•ด๊ฒฐ ๊ณผ์ • 1 - interface ๋‹ค์ค‘์ƒ์†

JpaRepository๋ฅผ ์ƒ์†๋ฐ›๋Š” Consultation๋ฅผ ์ƒ์„ฑํ•˜๊ณ  CommandableRepo์™€ QueryableRepo๋ฅผ ๋‹ค์ค‘์ƒ์† ์‹œ์ผœ์„œ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด๋ณด์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด Repository๋ฅผ CRD๊ฐ€ ํ•„์š”ํ•œ ์„œ๋น„์Šค์—์„œ ์ด ํ•˜๋‚˜์˜ Repository๋งŒ ์ฐธ์กฐํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ค„์—ฌ๋ณด์ž๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋‚˜๋ฆ„๋Œ€๋กœ, ๊ทœ์น™์„ ๋งŒ๋“ค์—ˆ์—ˆ๋‹ค.

1. Command์™€ Query ๋‘˜ ๋‹ค ํ•„์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” JpaRepository, CommandableRepo, QueryableRepo๋ฅผ ๋‹ค์ค‘์ƒ์†ํ•œ Repository๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•œ๋‹ค.

2. Read๋งŒ ํ•„์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” CommandableRepo๋งŒ ์ฐธ์กฐํ•˜๋„๋ก ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋ฉด "CQS์˜ ์˜๋ฏธ๊ฐ€ ์—†์ง€ ์•Š๋‚˜?" ๋ผ๊ณ  ์‹ฌ๊ฐํ•˜๊ฒŒ ๊ณ ๋ฏผํ•˜์˜€๊ณ  ๋˜ํ•œ ๋‚ด๊ฐ€ ๋‹ด๋‹นํ•œ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ Update ์ฟผ๋ฆฌ๋ฅผ ์งœ๋Š”๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ง€ ์•Š๊ธฐ์— ์‚ฌ์‹ค CommandableRepo์˜ ์กด์žฌ๊ฐ€ ๋ถˆํ™•์‹คํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ฐพ์•„๋ณด์•˜๋‹ค.

3. ๋ฌธ์ œํ•ด๊ฒฐ ๊ณผ์ • 2 - CommandableRepo ์‚ญ์ œ

CQS๋ผ๋Š” ๊ฐœ๋…์€ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋ณดํ†ต ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•ด์•ผํ–ˆ๊ณ , QueryableRepo๋Š” ์‚ด๋ฆฌ๋Š”๊ฒŒ ์‘์ง‘๋„๋‚˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์—์„œ ํ›จ์”ฌ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ณดํ†ต ๋‚ด ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ JPA์˜ dirty checking ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ update๋ฅผ ํ•˜์˜€๊ธฐ์—, save๋‚˜ delete์ด์™ธ์˜ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ผ์ด ๋ณ„๋กœ ์—†์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ CommandableRepo๋Š” ๊ณผ๊ฐํ•˜๊ฒŒ ์‚ญ์ œํ•˜์˜€๋‹ค.

1. QueryableRepo repository๋Š” ๋ณต์žกํ•œ ์กฐํšŒ์˜ ์ฑ…์ž„

2. JpaRepository์™€ QueryableRepo ๋ฅผ ๋‹ค์ค‘์ƒ์†ํ•œ repository๋Š” save, delete, ๋ณต์žกํ•œ ์กฐํšŒ๊นŒ์ง€ ๋ชจ๋‘ ์ฑ…์ž„

์œ„ ๋‘๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•˜๊ธฐ๋กœ ์ •ํ–ˆ๋‹ค.

ํ•ด๋‹น๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์˜์กด์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ์ถฉ๋ถ„ํžˆ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

4. ํšŒ๊ณ 

CQS ํŒจํ„ด๋งŒ ์ƒ๊ฐํ•˜๋‹ค๋ณด๋‹ˆ ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค์˜ ํŠน์„ฑ์€ ์ œ๋Œ€๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š์€๊ฒƒ ๊ฐ™๋‹ค.

update ์ฟผ๋ฆฌ๊ฐ€ ๋งŽ๊ณ  ๋ฐฐ์น˜์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ๋งŽ์•„์„œ ์ง์ ‘ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์งœ์•ผํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด CQSํŒจํ„ด์„ ์ ์šฉํ•ด๋ณผ๋งŒ ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋˜ํ•œ ์กฐํšŒ์šฉ DB์™€ ์“ฐ๊ธฐ์šฉ DB๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด์žˆ๋Š” ์ƒํ™ฉ์—์„œ๋„ ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์‚ฌ์‹ค ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ๊ตฌํ˜„์ „์— ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋‹ˆ ์˜์กด์„ฑ์€ ์ ์  ๋Š˜์–ด๋งŒ ๋‚ฌ๊ณ  ์ถ”ํ›„์— ๋” ํฐ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์•„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‹คํŒจ์— ๋Œ€ํ•œ ๊ฒฝํ—˜๋„ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ์— ๊ธฐ๋กํ•œ๋‹ค.