ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
C#: ๐—ง๐—ต๐—ฒ ๐—ฆ๐—ฝ๐—ฒ๐—ฐ๐—ถ๐—ณ๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—ฃ๐—ฎ๐˜๐˜๐—ฒ๐—ฟ๐—ป
Dev.toDev.to
Backend

Business Rule ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์œ„ํ•œ Specification Pattern ์„ค๊ณ„

C#: ๐—ง๐—ต๐—ฒ ๐—ฆ๐—ฝ๐—ฒ๐—ฐ๐—ถ๐—ณ๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—ฃ๐—ฎ๐˜๐˜๐—ฒ๐—ฟ๐—ป

Karwan Essmat Othman2026๋…„ 4์›” 28์ผ1๋ถ„intermediate

Context

๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด Query, Command, Validation, Test ๋“ฑ ์—ฌ๋Ÿฌ ๊ณ„์ธต์— ํŒŒํŽธํ™”๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ ์ค‘๋ณต ๋ฌธ์ œ. ๊ทœ์น™ ๋ณ€๊ฒฝ ์‹œ ๋ชจ๋“  ์ง€์ ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ์ฆ๊ฐ€ ๋ฐ ์ •ํ•ฉ์„ฑ ๊ฒฐ์—ฌ๊ฐ€ ์ฃผ์š” ํ•œ๊ณ„์ .

Technical Solution

  • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ๋…๋ฆฝ์ ์ธ ๊ฐ์ฒด๋กœ ์บก์Аํ™”ํ•œ Specification Pattern ๋„์ž…
  • ToExpression() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ Database Query๋กœ์˜ ์ง์ ‘ ๋ณ€ํ™˜ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ๋ฒจ ํ•„ํ„ฐ๋ง ์ตœ์ ํ™”
  • IsSatisfiedBy() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๊ฐ์ฒด ์ƒํƒœ ๊ฒ€์ฆ ๋ฐ ๋„๋ฉ”์ธ ์œ ํšจ์„ฑ ์ฒดํฌ
  • And(), Or(), Not() ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ ๋ณตํ•ฉ Specification ์กฐํ•ฉ์œผ๋กœ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์„ ์–ธ์  ๊ตฌ์„ฑ
  • ๋„๋ฉ”์ธ ๊ทœ์น™์„ DB ์˜์กด์„ฑ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” Unit Test ๊ตฌ์กฐ ์„ค๊ณ„

1. ๋™์ผํ•œ ํ•„ํ„ฐ๋ง/๊ฒ€์ฆ ๋กœ์ง์ด 2๊ณณ ์ด์ƒ์˜ ๊ณ„์ธต์—์„œ ์ค‘๋ณต๋˜๋Š”์ง€ ํ™•์ธ

2. ๋‹จ์ˆœ Boolean ๋ฉ”์„œ๋“œ๋ฅผ ๋„˜์–ด IQueryable๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•œ Expression ๊ธฐ๋ฐ˜ ์„ค๊ณ„ ๊ฒ€ํ† 

3. ๋ณตํ•ฉ ์กฐ๊ฑด ์ƒ์„ฑ ์‹œ Composite Pattern์„ ์ ์šฉํ•˜์—ฌ Specification ์กฐํ•ฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํŒ๋‹จ

4. ๋„๋ฉ”์ธ ๊ทœ์น™์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ DB Mocking ์—†์ด Specification ๋‹จ๋… ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ ๊ฒ€ํ† 

์›๋ฌธ ์ฝ๊ธฐ