๐ WhereDynamic๋ฅผ ์ฌ์ฉํ์ฌ .NET8+์์ ๋์ LINQ ์ฟผ๋ฆฌ๋ฅผ ์ฝ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ
Source: Dev.to
Introducing WhereDynamic
์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒฝํํด๋ดค์ต๋๋ค: ์กฐ๊ฑด๋ถ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋์์ด if ๋ฌธ์ ์์ฑํ๊ฑฐ๋, ์๋ก ๋ค๋ฅธ ํํฐ ์กฐํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ๋ฌ ์๋ํฌ์ธํธ์ ๋ก์ง์ ๋ณต์ ํ๋ ์ํฉ์. ์ด๋ ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์ ์ง๋ณด์๊ฐ ์ด๋ ต์ต๋๋ค.
The Problem
.NET๊ณผ Entity Framework๋ฅผ ์ฌ์ฉํด API ๋๋ ๋ฐ์ดํฐ ์ค์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋, ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ํํฐ๋ฅผ ์ ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ ํต์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฝ๋๊ฐ ๋ถํ์ด ์ค๋ฅด๊ฒ ๋ง๋ญ๋๋ค.
The Solution
WhereDynamic์ ๋ฐํ์์ LINQ Where ์ ์ ๊ตฌ์ฑํ ์ ์๋ ๊ฐ๊ฒฐํ๊ณ ํ์
โ์์ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ, ๋ฐ๋ณต์ ์ธ ์กฐ๊ฑด ๋ก์ง์ ์์ ๋ฉด์๋ EF Core๊ฐ SQL๋ก ์์ ํ ๋ณํํ๋๋ก ํฉ๋๋ค.
Practical Use Cases
1. Advanced Search Filters
์ฌ์ฉ์๊ฐ ์์์ ๊ธฐ์ค(์: ๋ ์ง ๋ฒ์, ํ ์คํธ ๋งค์น, ์ซ์ ๋ฒ์)์ ์กฐํฉํ ์ ์๋ ๋ณต์กํ ๊ฒ์ ํ์ด์ง๋ฅผ ๋ณ๋์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ๊ตฌํํฉ๋๋ค.
2. MultiโTenant Data Filtering
ํ ๋ํธ๋ณ ํํฐ๋ฅผ ์๋์ผ๋ก ์ ์ฉํ์ฌ ๊ฐ ์์ฒญ์ด ํ์ฌ ํ ๋ํธ์ ์ํ ๋ฐ์ดํฐ๋ง ์ ๊ทผํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
3. API Query Parameters
์ฟผ๋ฆฌ ๋ฌธ์์ด ํ๋ผ๋ฏธํฐ๋ฅผ LINQ ํ๋ ๋์ผ์ดํธ์ ์ง์ ๋งคํํ์ฌ REST ๋๋ GraphQL ์๋ํฌ์ธํธ์์ ์ ์ฐํ ํด๋ผ์ด์ธํธโ์ฃผ๋ ํํฐ๋ง์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
4. Complex Nested Conditions
๋์ ์ผ๋ก ์ค์ฒฉ๋ AND/OR ๊ทธ๋ฃน์ ๊ตฌ์ฑํ์ฌ โ(A AND B) OR (C AND (D OR E))โ์ ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ํ๋์ฝ๋ฉ ์์ด ์ง์ํฉ๋๋ค.
Key Benefits
- Cleaner Code โ ๋ฐ๋ณต์ ์ธ ์กฐ๊ฑด ๋ก์ง์ ์ ๊ฑฐํฉ๋๋ค.
- Type Safety โ IntelliSense ์ง์๊ณผ ์ปดํ์ผ ์์ ๊ฒ์ฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Performance โ ์ต์ ํ๋ SQL ์ฟผ๋ฆฌ๋ก ์ง์ ๋ณํ๋ฉ๋๋ค.
- Maintainability โ ํํฐ ๋ก์ง์ด ์ค์ ์ง์คํ๋์ด ํ ์คํธ์ ํ์ฅ์ด ์ฉ์ดํฉ๋๋ค.
- Flexibility โ ๊ธฐ์กด Entity Framework ์ฝ๋์ ์ํํ๊ฒ ์๋ํฉ๋๋ค.
Built For Modern .NET
WhereDynamic์ .NETโฏ8+์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ผ๋ฉฐ Entity Framework Core์ ์๋ฒฝํ๊ฒ ํธํ๋ฉ๋๋ค. ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์์ต๋๋ค. REST API, GraphQL ์๋ํฌ์ธํธ, ๋ณต์กํ ๋ณด๊ณ ์์คํ
๋ฑ ์ด๋ค ์ํฉ์์๋ ์๊ตฌ์ ๋ง๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.