πŸ“‚ ν”„λ‘œκ·Έλž˜λ°

CQS (Command Query Separation)

Amenable 2023. 6. 27. 17:20

  CQS(Command Query Separation)을 μ‚΄νŽ΄λ³΄κΈ° 전에, ν‘œλ₯Ό μ΄μš©ν•˜μ—¬ Command와 Queryλ₯Ό 비ꡐ해 보고 CQS에 λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄μž.

 

πŸ“™ 1. Command & Query

  Command Query
객체의 μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ”κ°€? O X
값을 λ°˜ν™˜ν•˜λŠ”κ°€? X O
μ˜ˆμ‹œ setter λ©”μ„œλ“œ getter λ©”μ„œλ“œ

 

 

πŸ“™ 2. CQS

  CQS(Command Query Separation)λŠ” 객체의 λͺ¨λ“  λ©”μ„œλ“œλ₯Ό Command와 Query 두 κ°€μ§€λ‘œ κ΅¬λΆ„ν•œλ‹€. κ·Έλž˜μ„œ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ Command λ˜λŠ” Query μ€‘μ—μ„œ ν•˜λ‚˜μ—λ§Œ ν•΄λ‹Ήν•΄μ•Ό ν•œλ‹€.  즉, ν•˜λ‚˜μ˜ λ©”μ„œλ“œκ°€ Command μ΄λ©΄μ„œ λ™μ‹œμ— Query μΌμˆ˜λŠ” μ—†λ‹€.

 

  CQS의 λͺ©μ μ€ μ»€λ§¨λ“œμ™€ 쿼리λ₯Ό λΆ„λ¦¬ν•˜λŠ” 것이닀.

  CQSλ₯Ό μ§€ν‚€κ²Œ 되면 query λ©”μ„œλ“œμ— λŒ€ν•΄μ„œ μ™ΈλΆ€ μƒνƒœ λ³€ν™”κ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ κ°œλ°œμ„ ν•˜κ²Œ λœλ‹€. 그러면 query λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ, κ°’μ˜ 변경을 μ‹ κ²½ μ“°κ±°λ‚˜ λ©”μ„œλ“œμ˜ 호좜 μˆœμ„œλ₯Ό κ³ λ €ν•΄μ•Ό ν•˜λŠ” λ“±μ˜ λΉ„μš©μ„ 쀄일 수 μžˆλ‹€.

  κ·Έλž˜μ„œ 값을 λ°˜ν™˜ν•˜λŠ” 경우(Query λ©”μ„œλ“œ), μ°Έμ‘° 투λͺ…성을 κ°€μ§€κ³  μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ μ—†λ‹€κ³  ν•  수 μžˆλ‹€.

 

 

πŸ“™ 3. CQS의 μž₯점과 λ‹¨μ 

πŸ“Œ μž₯점

  • '읽기(쑰회)' 둜직과 'μ“°κΈ°(μˆ˜μ •)' λ‘œμ§μ„ 뢄리할 수 μžˆλ‹€.
  • '읽기'와 'μ“°κΈ°'κ°€ λ™μ‹œμ— μΌμ–΄λ‚˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ„±λŠ₯ μ΅œμ ν™”μ— 도움을 μ€€λ‹€.
  • κ°„νŽΈν•˜κ²Œ κ΅¬ν˜„ν•  μˆ˜ μžˆμœΌλ©΄μ„œ μ½”λ“œμ˜ κ°€λ…성도 λ†’μ—¬μ€€λ‹€.

πŸ“Œ λ‹¨μ 

  • κ°œλ°œμ„ ν•˜λ‹€ 보면 ν•˜λ‚˜μ˜ λ©”μ„œλ“œμ— λΆˆκ°€ν”Όν•˜κ²Œ '읽기'와 'μ“°κΈ°'λ₯Ό λ™μ‹œμ— ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μƒκΈ°κ²Œ λ˜λŠ”λ°, CQS νŒ¨ν„΄μ„ μœ μ§€ν•œλ‹€λŠ” λͺ…λͺ©μœΌλ‘œ 였히렀 κ°„λ‹¨ν•œ μ½”λ“œλ₯Ό λ³΅μž‘ν•˜κ²Œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ 생길 μˆ˜λ„ μžˆλ‹€.

  (stack의 pop을 생각해 보면, κ°€μž₯ μ΅œκ·Όμ— push 된 값을 λ°˜ν™˜ν•˜κ³  stackμ—μ„œλŠ” ν•΄λ‹Ή 값을 μ œκ±°ν•œλ‹€. λ§ˆν‹΄ νŒŒμšΈλŸ¬λŠ” ν•  수 μžˆλŠ” ν•œ CQS 원칙을 μ§€ν‚€λ € ν•˜κ² μ§€λ§Œ stack의 popκ³Ό 같이 맀우 μœ μš©ν•œ μƒν™©μ—μ„œλŠ” μ–Όλ§ˆλ“ μ§€ CQS 원칙을 깨뜨릴 μ€€λΉ„κ°€ λ˜μ–΄μžˆλ‹€κ³  λ§ν•œλ‹€. Trade Offλ₯Ό μƒκ°ν•˜κ³  μœ μ—°ν•œ μ‚¬κ³ λ‘œ μ„€κ³„ν•˜λ©° κ΅¬ν˜„ν•˜λŠ” 걸둜 ν•˜μž!πŸ”₯)

 

ν•΄λ‹Ή 글은
Martin Fowler λ‹˜μ˜ 'CommandQuerySeparation',
yoonpunk λ‹˜μ˜ 'CQS에 κ΄€ν•œ κ³ μ°° (feat. Side Effect, μ°Έμ‘° 투λͺ…μ„± 그리고 순수 ν•¨μˆ˜)',
yena1025 λ‹˜μ˜ 'CQS (Command Query Separation)',
devsun λ‹˜μ˜ 'CQS - Command Query Separation'
을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.