๊ธฐ์ฌ์ ๋ชฉ์ ๋ฐ๋ก ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค. ์๋ ๊ณํ์ ๊ฐ๋จํ์ง๋ง ํ์ค์ ์ธ ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌํ๋ ์
์ฌ์ฉ ์๋๋ฅผ ๋์ด๋ ๋ฐ ๋ํ ํ๋ฅญํ๊ณ ์ ๋ขฐํ ์ ์๋ ์กฐ์ธ์ ์ ๊ณตํ๋ ๊ฒ์ด์์ง๋ง ๋ฒค์น๋งํน ์ค์ ๋ฆฌํ๋ ์
์ด ์๊ฐ๋งํผ ๋๋ฆฌ์ง ์๊ณ LINQ๊ฐ ์
๋ชฝ๋ณด๋ค ๋๋ฆฌ๋ค๋ ์ฌ์ค์ด ๋ฐํ์ก์ต๋๋ค. ํ์ง๋ง ๊ฒฐ๊ตญ ์ธก์ ์์๋ ์ค์๋ฅผ ํ๋ค๋ ์ฌ์ค์ด ๋ฐํ์ก์ต๋๋ค... ์ด ์ธ์ ์ด์ผ๊ธฐ์ ์์ธํ ๋ด์ฉ์ ์ปท ์๋์ ์๊ณ ๋๊ธ์ ์์ต๋๋ค. ์ด ์๋ ๊ธฐ์
์์ ์ผ๋ฐ์ ์ผ๋ก ์ํ๋๋ ๊ฒ์ฒ๋ผ ๋งค์ฐ ์ผ๋ฐ์ ์ด๊ณ ์์น์ ์ผ๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ์ ๊ฐ ๋ณด๊ธฐ์๋ ์ถ์ ์์ฐ์ธ ๊ฒ์ฒ๋ผ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๊ธฐ์ฌ์ ์ฃผ์ ์ฃผ์ ์ ์๋์ ๋ฏธ์น๋ ์ํฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Moq, Autofac, EF Core ๋ฐ ๊ธฐํ "๋ฐด๋ฉ"๊ณผ ๊ฐ์ ์ธ๋ถ ๋
ผ๋ฆฌ๋ก ์ธํด ๋์ ๋์ง ์์ต๋๋ค.
๋๋ ์ด ๊ธฐ์ฌ์ ์ธ์์ ๋ฐ์ ์์
์ ์์ํ์ต๋๋ค.
๋ณด์๋ค์ํผ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋๋ฅผ ํฌ๊ฒ ๋์ด๋ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฆฌํ๋ ์ ์ ํ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ๋ ๋์ ์ปดํ์ผ๋ ๋๋ฆฌ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ํฉ๋๋ค. ๋ฌผ๋ก IL ๋ฐฉ์ถ์ด ์์ง๋ง ์ด๋ ์ค๋ฅ๊ฐ ๋ง์ ์์ ์ ์ํํ๋ ๊ฐ์ฅ ๋ ธ๋ ์ง์ฝ์ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ํผํ๊ณ ์ถ์ต๋๋ค.
๋๋ ์ฑ์ฐฐ์ ์๋์ ๋ํด ๋ ๋น์ทํ ์๊ฒฌ์ ๊ฐ๊ณ ์์๊ธฐ ๋๋ฌธ์ ํน๋ณํ ์ ์์ ๊ฒฐ๋ก ์ ์๋ฌธ์ ์ ๊ธฐํ ์๋๋ ์์์ต๋๋ค.
๋๋ ์ข ์ข ๊ธฐ์ ์์ ์ฑ์ฐฐ์ ์์งํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํฉ๋๋ค. ์ ํ์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ถ๋์ฐ์ ๊ดํ ์ ๋ณด๊ฐ ์์ง๋ฉ๋๋ค. SetValue ๋ฉ์๋๊ฐ ํธ์ถ๋๊ณ ๋ชจ๋๊ฐ ๊ธฐ๋ปํฉ๋๋ค. ๋ชฉํ ํ๋์ ๊ฐ์ด ๋์ฐฉํ๋ฉด ๋ชจ๋๊ฐ ํ๋ณตํด์ง๋๋ค. ๋งค์ฐ ๋๋ํ ์ฌ๋๋ค(์ ๋ฐฐ์ ํ ๋ฆฌ๋)์ ํ ์ ํ์ "๋ฒ์ฉ" ๋งคํผ๋ฅผ ๋ค๋ฅธ ์ ํ์ผ๋ก ์์งํ๊ฒ ๊ตฌํํ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ฒด์ ๋ํ ํ์ฅ์ ์์ฑํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ชจ๋ ํ๋๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๋ชจ๋ ์์ฑ์ ๊ฐ์ ธ์ค๊ณ , ๋ฐ๋ณตํฉ๋๋ค. ์ ํ ๋ฉค๋ฒ์ ์ด๋ฆ์ด ์ผ์นํ๋ฉด SetValue๋ฅผ ์คํํฉ๋๋ค. ๋๋๋ก ์ฐ๋ฆฌ๋ ์ ํ ์ค ํ๋์์ ์ผ๋ถ ์์ฑ์ ์ฐพ์ง ๋ชปํ ์ค์๋ก ์ธํด ์์ธ๋ฅผ ํฌ์ฐฉํ์ง๋ง ์ฌ๊ธฐ์๋ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์๋ํด ๋ณด์ธ์.
๋๋ ์ฌ๋๋ค์ด ๊ทธ๋ค๋ณด๋ค ๋จผ์ ๋์จ ๊ธฐ๊ณ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์์ ํ ๊ฐ์ถ์ง ์์ ์ฑ ํ์์ ๋งคํผ๋ฅผ ์ฌ์ฐฝ์กฐํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๋๋ ์ฌ๋๋ค์ด ์ ๋ต ๋ค์, ์ธํฐํ์ด์ค ๋ค์, ์ฃผ์ฌ ๋ค์ ์์ ์ ์์งํ ๊ตฌํ์ ์จ๊ธฐ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๋ง์น ์ด๊ฒ์ด ํ์์ ์ธ ๊ธ์์ฆ์ ์ฉ์ํด ์ฃผ๋ ๊ฒ์ฒ๋ผ ๋ง์ ๋๋ค. ๋๋ ๊ทธ๋ฐ ๊นจ๋ฌ์์ ๊ณ ๊ฐ๋ฅผ ๋๋ ธ๋ค. ์ค์ ๋ก ์ค์ ์ฑ๋ฅ ๋์ถ์ ์ธก์ ํ์ง ์์์ผ๋ฉฐ ๊ฐ๋ฅํ๋ค๋ฉด ๊ตฌํ์ ์์ ๋ฃ์ ์๋ง ์๋ค๋ฉด ๋ "์ต์ "์ธ ๊ตฌํ์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค. ๋ฐ๋ผ์ ์๋์์ ๋ ผ์๋๋ ์ฒซ ๋ฒ์งธ ์ธก์ ์ ๋๋ฅผ ์ฌ๊ฐํ๊ฒ ํผ๋์ค๋ฝ๊ฒ ํ์ต๋๋ค.
Richter๋ ๋ค๋ฅธ ์ด๋ฐ์ฌ๋ก๊ธฐ์ ๊ธ์ ์ฝ์ผ๋ฉด์ ๋ง์ ๋ถ๋ค์ด ์ฝ๋์์์ ๋ฐ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๊ทน๋๋ก ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ํ์์ด๋ผ๋ ์์ ํ ๊ณต์ ํ ์ง์ ์ ์ ํ์ จ์ ๊ฒ์ ๋๋ค.
๋ฆฌํ๋ ์ ์ ํธ์ถํ๋ฉด CLR์ด ์ด์ ๋ธ๋ฆฌ๋ฅผ ๊ฑฐ์ณ ํ์ํ ๊ฒ์ ์ฐพ๊ณ , ํด๋น ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฑ์ ์์ ์ ์ํํ๊ฒ ๋ฉ๋๋ค. ๋ํ ์ํ์ค๋ฅผ ์ํํ๋ ๋์ ๋ฐ์๋๋ฉด ๋ง์ ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ CLR์ GC๋ฅผ ๋ฐ๊ฒฌํ๊ณ ํ๋ฆฌ์ฆ๊ฐ ์์๋ฉ๋๋ค. ๋์ ๋๊ฒ ๋๋ ค์ง ๊ฒ์ ๋๋ค. ์ ๋ง์ ๋ฏฟ์ผ์ธ์. ์ต์ ํ๋ก๋์ ์๋ฒ ๋๋ ํด๋ผ์ฐ๋ ์์คํ ์ ์์ฒญ๋ ์์ ๋ฉ๋ชจ๋ฆฌ๋ ๋์ ์ฒ๋ฆฌ ์ง์ฐ์ ๋ฐฉ์งํ์ง ๋ชปํฉ๋๋ค. ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์์๋ก GC ์๋ ๋ฐฉ์์ ์์์ฐจ๋ฆด ๊ฐ๋ฅ์ฑ์ด ๋ ๋์์ง๋๋ค. ์ด๋ก ์ ์ผ๋ก ๋ฐ์ฌ๋ ๊ทธ์๊ฒ ์ฌ๋ถ์ ๋ถ์ ๊ฑธ๋ ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ๋ชจ๋๋ IoC ์ปจํ ์ด๋์ ๋ ์ง ๋งคํผ๋ฅผ ์ฌ์ฉํ๋ฉฐ ๊ทธ ์๋ ์๋ฆฌ๋ ๋ฐ์ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ฑ๋ฅ์ ๋ํด์๋ ์๋ฌธ์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ์๋์, ์ธ๋ถ ์ ํ๋ ์ปจํ ์คํธ ๋ชจ๋ธ์ ์ข ์์ฑ๊ณผ ์ถ์ํ๋ฅผ ๋์ ํ๋ ๊ฒ์ด ๋๋ฌด ํ์ํด์ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ฑ๋ฅ์ ํฌ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด ์๋๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋ ๊ฐ๋จํด์ก์ต๋๋ค. ์ค์ ๋ก๋ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์ฌ์ค ๋ฆฌํ๋ ์ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํ๋ ์์ํฌ๋ ๋ณด๋ค ์ต์ ์ผ๋ก ์๋ํ๊ธฐ ์ํด ๋ชจ๋ ์ข ๋ฅ์ ํธ๋ฆญ์ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ ์บ์์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ ์ ํธ๋ฆฌ์์ ์ปดํ์ผ๋ ์ ๋ฐ ๋๋ฆฌ์์ ๋๋ค. ๋์ผํ ์๋ ๋งคํผ๋ ๋ฆฌํ๋ ์ ์ ํธ์ถํ์ง ์๊ณ ์ ํ์ ๋ค๋ฅธ ์ ํ์ผ๋ก ๋ณํํ ์ ์๋ ํจ์์ ์ ํ์ ์ผ์น์ํค๋ ๊ฒฝ์๋ ฅ ์๋ ์ฌ์ ์ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค.
์ด๊ฒ์ด ์ด๋ป๊ฒ ๋ฌ์ฑ๋ฉ๋๊น? ๋ณธ์ง์ ์ผ๋ก ์ด๋ ํ๋ซํผ ์์ฒด๊ฐ JIT ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ ผ๋ฆฌ์ ๋ค๋ฅด์ง ์์ต๋๋ค. ๋ฉ์๋๊ฐ ์ฒ์ ํธ์ถ๋๋ฉด ์ปดํ์ผ๋๊ณ (๋ฌผ๋ก ์ด ํ๋ก์ธ์ค๋ ๋น ๋ฅด์ง ์์ต๋๋ค.) ํ์ ํธ์ถ์์๋ ์ ์ด๊ฐ ์ด๋ฏธ ์ปดํ์ผ๋ ๋ฉ์๋๋ก ์ด์ ๋๋ฏ๋ก ์ฌ๊ฐํ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ JIT ์ปดํ์ผ์ ์ฌ์ฉํ ๋ค์ AOT์ ๋์ผํ ์ฑ๋ฅ์ผ๋ก ์ปดํ์ผ๋ ๋์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ํํ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ฌธ์ ์ ์์น์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ตํ๊ฒ ๊ณต์ํ๋ ์ ์์ต๋๋ค.
์ปดํ์ผ๋ ํจ์๋ฅผ ํฌํจํ๋ ๋๋ฆฌ์๋ก ๋ฆฌํ๋ ์
์ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ์บ์ํด์ผ ํฉ๋๋ค. ๋ํ ๊ฐ์ฒด ์ธ๋ถ์ ์ ์ฅ๋๋ ์์
์ ์ ํ ํ๋์ ์ ํ ์ ๋ณด์ ํจ๊ป ํ์ํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์บ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฌ๊ธฐ์๋ ๋ ผ๋ฆฌ๊ฐ ์์ต๋๋ค. ์์์ ๋ฐ๋ฅด๋ฉด ์ปดํ์ผํ๊ณ ์บ์ํ ์ ์๋ ์์ ์ ์ํ๋์ด์ผ ํฉ๋๋ค.
์์ผ๋ก๋ ์ ์๋ ํํ์ ์ปดํ์ผ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ์๋๋ผ๋ ๋ฆฌํ๋ ์ ์์ ์ ์บ์์ ์ฅ์ ์ด ์๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค. ์ค์ ๋ก ์ฌ๊ธฐ์๋ ์์์ ์ธ๊ธํ ๊ธฐ์ฌ ์์ฑ์์ ๋ ผ๋ฌธ์ ๋ฐ๋ณตํ๊ณ ์์ต๋๋ค.
์ด์ ์ฝ๋์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ ๊ฐ ์ต๊ทผ ์ง์งํ ์ ์ฉ ๊ธฐ๊ด์ ํ๋ก๋์ ์์ ์ง๋ฉดํด์ผ ํ๋ ๊ณ ํต์ ๋ฐํ์ผ๋ก ํ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ชจ๋ ์ค์ฒด๋ ํ๊ตฌ์ด๋ฏ๋ก ๋๊ตฌ๋ ์ถ์ธกํ ์ ์์ต๋๋ค.
๋ณธ์ง์ด ์์ต๋๋ค. ์ ์ด์ด ์๊ฒ ํ์ญ์์ค. ํ์์ ํ์ด๋๋ ์ดํฐ๊ฐ ๋์ผํ ์ ์ด์ ์์ฑํ๋ ํ์คํ๋ ๋ณธ๋ฌธ์ ๊ฐ์ง ๋ฌธ์๊ฐ ์์ต๋๋ค. ํธ์ง๊ฐ ๋์ฐฉํ๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฝ๊ณ ํค-๊ฐ ์์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ฐ๋ฝ์ฒ๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ์ต๋๋ค.
์ด๋ฑํ์์ ๋๋ค. ์ฐ๋ฝ์ฒ์ ์ ์ฒด ์ด๋ฆ, ์ฐ๋ น ๋ฐ ์ฐ๋ฝ์ฒ ์ ํ ์์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ฐ์ดํฐ๋ ํธ์ง๋ก ์ ์ก๋ฉ๋๋ค. ๋ํ ๊ธฐ์ ์์๋ ์ํฐํฐ ์์ฑ์ ํธ์ง ๋ณธ๋ฌธ์ ์์ผ๋ก ๋งคํํ๊ธฐ ์ํ ์ ํค๋ฅผ ์ ์ํ๊ฒ ์ถ๊ฐํ ์ ์๋ ์ง์์ ์ํฉ๋๋ค. ๋๊ตฐ๊ฐ ํ ํ๋ฆฟ์ ์คํ๋ฅผ ๋๊ฑฐ๋ ์ถ์ ์ ์ ์๋ก์ด ํ์์ ์ ์ํ์ฌ ์๋ก์ด ํํธ๋๋ก๋ถํฐ ๋งคํ์ ๊ธด๊ธํ๊ฒ ์์ํด์ผ ํ๋ ๊ฒฝ์ฐ. ๊ทธ๋ฐ ๋ค์ ์ ๋ ดํ ๋ฐ์ดํฐ ์์ ์ผ๋ก ์๋ก์ด ๋งคํ ์๊ด ๊ด๊ณ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฆ, ์ถ์ ์์ ๋๋ค.
์ฐ๋ฆฌ๋ ํ ์คํธ๋ฅผ ๊ตฌํํ๊ณ ์์ฑํฉ๋๋ค. ๊ณต์ฅ.
์ฝ๋๋ ์ ๊ณตํ์ง ์๊ฒ ์ต๋๋ค. ์์ค๊ฐ ๋ง๊ณ ๊ธฐ์ฌ ๋ง์ง๋ง์ ์๋ ๋งํฌ๋ฅผ ํตํด GitHub์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทํ์ ๊ฒฝ์ฐ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฏ๋ก ๋ก๋ํ๊ณ ์ธ์ํ ์ ์์ ์ ๋๋ก ๊ณ ๋ฌธํ๊ณ ์ธก์ ํ ์ ์์ต๋๋ค. ๋น ๋ฅธ ๊ฒ์ผ๋ก ์์๋๋ ํ์ด๋๋ ์ดํฐ์ ๋๋ฆด ๊ฒ์ผ๋ก ์์๋๋ ํ์ด๋๋ ์ดํฐ๋ฅผ ๊ตฌ๋ณํ๋ ๋ ๊ฐ์ง ํ ํ๋ฆฟ ๋ฉ์๋์ ์ฝ๋๋ง ์ ๊ณตํ๊ฒ ์ต๋๋ค.
๋ ผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ํ ํ๋ฆฟ ๋ฉ์๋๋ ๊ธฐ๋ณธ ํ์ ๋ ผ๋ฆฌ์ ์ํด ์์ฑ๋ ์์ ๋ฐ์ต๋๋ค. LINQ ๊ณ์ธต์ ํ์์ด์ ํ์ด๋๋ ์ดํฐ์ ๊ธฐ๋ณธ ๋ ผ๋ฆฌ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ ์คํธ์ ์์ฒญํ๊ณ ํ์์ ์๊ณผ ํค๋ฅผ ๋น๊ตํฉ๋๋ค(์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ ๋น๊ต๋ฅผ ์ํด LINQ๊ฐ ์๋ ์ฝ๋๊ฐ ์์ต๋๋ค). ๋ค์์ผ๋ก ์์ ๊ธฐ๋ณธ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฌ๋๊ณ ์์ ๊ฐ์ ์ํฐํฐ์ ํด๋น ์์ฑ์ผ๋ก ์ค์ ๋ฉ๋๋ค.
"Fast"(๋ฒค์น๋งํฌ์์ Fast๋ผ๋ ์ ๋์ฌ):
protected override Contact GetContact(PropertyToValueCorrelation[] correlations)
{
var contact = new Contact();
foreach (var setterMapItem in _proprtySettersMap)
{
var correlation = correlations.FirstOrDefault(x => x.PropertyName == setterMapItem.Key);
setterMapItem.Value(contact, correlation?.Value);
}
return contact;
}
๋ณด์๋ค์ํผ, setter ์์ฑ์ด ์๋ ์ ์ ์ปฌ๋ ์ , ์ฆ setter ์ํฐํฐ๋ฅผ ํธ์ถํ๋ ์ปดํ์ผ๋ ๋๋ค๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์ ์ฝ๋๋ก ์์ฑ๋์์ต๋๋ค.
static FastContactHydrator()
{
var type = typeof(Contact);
foreach (var property in type.GetProperties())
{
_proprtySettersMap[property.Name] = GetSetterAction(property);
}
}
private static Action<Contact, string> GetSetterAction(PropertyInfo property)
{
var setterInfo = property.GetSetMethod();
var paramValueOriginal = Expression.Parameter(property.PropertyType, "value");
var paramEntity = Expression.Parameter(typeof(Contact), "entity");
var setterExp = Expression.Call(paramEntity, setterInfo, paramValueOriginal).Reduce();
var lambda = (Expression<Action<Contact, string>>)Expression.Lambda(setterExp, paramEntity, paramValueOriginal);
return lambda.Compile();
}
์ผ๋ฐ์ ์ผ๋ก ๊ทธ๊ฒ์ ๋ถ๋ช ํฉ๋๋ค. ์์ฑ์ ํ์ํ๊ณ setter๋ฅผ ํธ์ถํ๋ ๋๋ฆฌ์๋ฅผ ๋ง๋ค๊ณ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ํ์ํ ๋ ์ ํ๋ฅผ ๊ฒ๋๋ค.
"๋๋ฆผ"(๋ฒค์น๋งํฌ์์ ์ ๋์ฌ ๋๋ฆผ):
protected override Contact GetContact(PropertyToValueCorrelation[] correlations)
{
var contact = new Contact();
foreach (var property in _properties)
{
var correlation = correlations.FirstOrDefault(x => x.PropertyName == property.Name);
if (correlation?.Value == null)
continue;
property.SetValue(contact, correlation.Value);
}
return contact;
}
์ฌ๊ธฐ์๋ ์ฆ์ ์์ฑ์ ์ฐํํ๊ณ SetValue๋ฅผ ์ง์ ํธ์ถํฉ๋๋ค.
๋ช ํ์ฑ๊ณผ ์ฐธ๊ณ ๋ฅผ ์ํด ์๊ด ์์ ๊ฐ์ ์ํฐํฐ ํ๋์ ์ง์ ์ฐ๋ ์์งํ ๋ฐฉ๋ฒ์ ๊ตฌํํ์ต๋๋ค. ์ ๋์ฌ โ ์๋.
์ด์ BenchmarkDotNet์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์๊ธฐ... (์คํฌ์ผ๋ฌ - ์ ํํ ๊ฒฐ๊ณผ๊ฐ ์๋๋๋ค. ์์ธํ ๋ด์ฉ์ ์๋์ ์์ต๋๋ค)
์ฌ๊ธฐ์ ๋ฌด์์ ๋ณผ ์ ์๋์? Fast ์ ๋์ฌ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ํฌํจํ๋ ๋ฐฉ๋ฒ์ Slow ์ ๋์ฌ๊ฐ ์๋ ๋ฐฉ๋ฒ๋ณด๋ค ๊ฑฐ์ ๋ชจ๋ ๋จ๊ณ์์ ๋ ๋๋ฆฐ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด๋ ์์
ํ ๋น๊ณผ ์๋ ๋ชจ๋์ ํด๋น๋ฉ๋๋ค. ๋ฐ๋ฉด์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ํด LINQ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋งคํ์ ์๋ฆ๋ต๊ณ ์ฐ์ํ๊ฒ ๊ตฌํํ๋ฉด ์์ฐ์ฑ์ด ํฌ๊ฒ ์ ํ๋ฉ๋๋ค. ์ฐจ์ด์ ์ ์์์
๋๋ค. ํจ์ค ํ์๊ฐ ๋ฌ๋ผ๋ ์ถ์ธ๋ ๋ณํ์ง ์์ต๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ ๊ท๋ชจ์
๋๋ค. LINQ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๊ฐ 4~200๋ฐฐ ๋๋ ค์ง๊ณ ๊ฑฐ์ ๋์ผํ ๊ท๋ชจ์์ ๋ ๋ง์ ์ฐ๋ ๊ธฐ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ ๋ฐ์ดํธ]
๋๋ ๋ด ๋์ ๋ฏฟ์ง ์์์ง๋ง ๋ ์ค์ํ ๊ฒ์ ์ฐ๋ฆฌ ๋๋ฃ๊ฐ ๋ด ๋์ด๋ ๋ด ์ฝ๋๋ฅผ ๋ฏฟ์ง ์์๋ค๋ ๊ฒ์
๋๋ค.
์ฌํ ์คํธ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฒฐ๋ก : ๊ธฐ์
์์ ๋ฆฌํ๋ ์
์ ์ฌ์ฉํ ๋ ํน๋ณํ ํธ๋ฆญ์ ์์กดํ ํ์๋ ์์ต๋๋ค. LINQ๋ ์์ฐ์ฑ์ ๋ ๋ง์ด ์๋ชจํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ต์ ํ๊ฐ ํ์ํ ๊ณ ๋ถํ ๋ฉ์๋์์๋ ์ด๋์
๋ผ์ด์ ๋ฐ ๋๋ฆฌ์ ์ปดํ์ผ๋ฌ ํ์์ผ๋ก ๋ฆฌํ๋ ์
์ ์ ์ฅํ ์ ์์ผ๋ฉฐ, ๊ทธ๋ฌ๋ฉด "๋น ๋ฅธ" ๋
ผ๋ฆฌ๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ฌ์ ์ ์ฐ์ฑ๊ณผ ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋๋ฅผ ๋ชจ๋ ์ ์งํ ์ ์์ต๋๋ค.
๋ฒค์น๋งํฌ ์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค. ๋๊ตฌ๋ ๋ด ๋ง์ ๋ค์ ํ์ธํ ์ ์์ต๋๋ค.
์ถ์ : ํ ์คํธ์ ์ฝ๋๋ IoC๋ฅผ ์ฌ์ฉํ๊ณ ๋ฒค์น๋งํฌ์์๋ ๋ช ์์ ๊ตฌ์ฑ์ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ค ์ ๋ ์ต์ข ๊ตฌํ์์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๊ณ ๊ฒฐ๊ณผ๋ฅผ ์๋๋ฝ๊ฒ ๋ง๋ค ์ ์๋ ๋ชจ๋ ์์๋ฅผ โโ์ ๊ฑฐํ์ต๋๋ค.
PPS: ์ฌ์ฉ์์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
PPPS: ์คํ์ผ๊ณผ ๋์์ธ์ ๊ธฐ์ด๋ฅผ ํ์
ํ ์ธ์ฌํ ๋
์์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ํต์ผ์ฑ๊ณผ ํธ๋ฆฌํจ์ ์ถ๊ตฌํฉ๋๋ค. ์ด๋ฒ ๋ฐํ์ ์ธ๊ต์ ์ธก๋ฉด์์๋ ์์ฌ์ด ์ ์ด ๋ง์ง๋ง, ๊ทธ ๋นํ๋ ๊ฐ์ํ์ต๋๋ค. ๋ฐ์ฌ์ฒด๋ฅผ ์์ฒญํฉ๋๋ค.
์ถ์ฒ : habr.com