๋๋ ์ด๊ฒ์ด ์ ์ ์ง๋ฌธ์ ๋ฐ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๊ณ ์ด๊ฒ์ ๊ตฌ๊ธ๋งํ๊ณ ๋ช ๊ฐ์ง ๋ณต์กํ ์๋ฃจ์
์ ์ฐพ์์ง๋ง ์ด์จ๋ ์ฌ๊ธฐ์ ์์ต๋๋ค. ์ ํํ ๊ฐ์ ์ ํ์ ๋ณต์กํ ๊ฐ์ฒด๊ฐ ๋ ๊ฐ ์๋๋ฐ ๋น๊ตํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋น๊ตํด์ผ ํ๋ ํญ๋ชฉ ๋ชจ์์ด ํฌํจ๋์ด ์์ง๋ง ์์๋ฅผ ๋ฌด์ํ๊ณ ์ถ์ต๋๋ค. SemanticComparison์ผ๋ก ์ด๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น? ํ์ฌ json ๋น๊ต ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๊ณ ์์ง๋ง ๋น๊ต๊ฐ ์คํจํ ๋ ์ด๋ฅผ ๋๋ฒ๊น
ํ๋ ๊ฒ์ ์
๋ชฝ์
๋๋ค. Likeness๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์์ต๋๋ค.
๋น๊ตํ๋ ค๋ ๋ฌผ์ฒด๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ณด์ฌ์ค ์ ์์ต๋๊น?
๋ํ ์ด ์์์์ ๊ฐ์ด SemanticComparer<T>
์ง์ ์ฌ์ฉํด ๋ณด์
จ์ต๋๊น? ์ด๊ฒ์ Likeness<TSource, TDestination>
์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ์ ์ฐํฉ๋๋ค.
๊ฐ์ฒด์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public class SongDto
{
public string Lyrics { get; set; }
public IEnumerable<TagDto> Tags { get; set; }
public string FileName { get; set; }
public string CustomPromoLink { get; set; }
public string UPC { get; set; }
public YoutubeVideoDto YouTubeVideo { get; set; }
}
๋ธ๊พน์ง์ ํ ๋ ๊ฐ์ง ์์ฑ์ TagDto ์ปฌ๋ ์ ๊ณผ YouTubeVideoDto์์ผ๋ฉฐ ์ด์์ ์ผ๋ก๋ ์ด๋ฌํ ์์ฑ์ ํ์ํ๊ณ ์ต๋ํ ๊น์ด ๋น๊ตํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด ๋น๊ต ๋ฐฉ์์ผ๋ก ์ธํด ์ด์จ๋ ๋ง์ ์์ ์ ์ํํ๊ฒ ๋๋ฏ๋ก JSON ๋น๊ต๊ธฐ๋ฅผ ๊ณ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
๋ฌดํ ์ํ์ค์ธ ๊ฒฝ์ฐ ํด๋น JSON ๋น๊ต๊ธฐ๊ฐ IEnumerable<TagDto>
์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์ถ์ต๋๋ค.
๋ฌดํ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น? ๋๋ ํ์คํ ๊ทธ๊ฒ์ด ์๋ฒฝํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋ฉฐ ๋ถ๋ช ํ ๋ค๋ฅธ ์๋ฃจ์ ์ ์ฐพ๊ณ ์์ผ๋ฏ๋ก SemanticComparison์ ๋ฐ์ด๋ค์ง๋ง SC๊ฐ ์ด ์ํฉ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด ๋จ์ํ ์ฌ์ฉ์ ์์ ์ ์ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์๋๋ฐ, ๋๋ ole interwebs์์ ์ข์ ํด๊ฒฐ์ฑ ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
๋น์ ์ ์ ์ฌ ํ ์์๋ ์ด ์ฌ์ฉํ๋ DelegatingMemberComparer
์ค ํ๋๋ฅผ ๋ฐํ ํญ์ True
์ ๋ํด IEnumerable<TagDto>
๋ ๋์ ๋, ๋น๊ต IEnumerable<TagDto>
๋น์ ์ด ์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก .
(์ ๋งํฌ์ ๋ ๋ฒ์งธ ๋ฐ ์ธ ๋ฒ์งธ DelegatingMemberComparer
์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ์ญ์์ค.)
์๊ฒ ์ต๋๋ค. ๋์์ ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ฐ๋ผ์ ๋ณธ์ง์ ์ผ๋ก ์ฌ์ ํ ๊ฐ ์ ํ์ ๋ํ ์ฌ์ฉ์ ์ ์ DelegatingMemberComparer๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ์คํจํ ํ ์คํธ์์ ์ด๋ค ์์ฑ์ด ๋ค๋ฅธ์ง ์๋ ค์ค๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ์ ํ ๊ฐ ์ ํ์ ๋ํด ์ฌ์ฉ์ ์ ์ DelegatingMemberComparer๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
DelegatingMemberComparer
, a.Equals(b)๋ฅผ ์ํํ๊ฑฐ๋ ์ด์ ๋ํด Likeness๋ฅผ ์ฌ์ฉํฉ๋๋ค.IEnumerable<TagDto>
๋ํ DelegatingMemberComparer
์คํจํ ํ ์คํธ์์ ์ด๋ค ์์ฑ์ด ๋ค๋ฅธ์ง ์๋ ค์ค๋๋ค.
์๋, ๊ทธ๊ฒ ๋ผ์ดํฌ๋์ค๊ฐ ํ๋ ์ผ์ด์ผ...
Likeness๋ ๋ด๋ถ์ ์ผ๋ก SemanticComparer<T>
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋น๊ตํฉ๋๋ค... ๋ฐ๋ผ์ SemanticComparer<T>
ํ๋ฉด ๋ ์ ์ฐํด์ง ์ ์์ง๋ง Likeness์ ๋ณด๊ณ ๊ธฐ๋ฅ์ ์๊ฒ ๋ฉ๋๋ค.
๋ณด๊ณ ํญ๋ชฉ ์ด ํ์ํ ๊ฒฝ์ฐ ์ด ์์ ํ์๋ ๊ฒ์ฒ๋ผ Likeness์ With
๋ฐ EqualsWhen
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ์ฌํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์, ์ด์ ์๋์ ์ง๋ฌธ์ผ๋ก ๋์์์ต๋๋ค. ๋ณด๊ณ ํญ๋ชฉ์ด ๋ ์ด์ ์กด์ฌํ์ง ์์ผ๋ฉด(๋ด๊ฐ ์ฝ์ ๊ฒ์์ Likeness๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์) ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฌด์์ ์ป์ ์ ์์ต๋๊น? .Equals(b), ์ฐธ์กฐ ๋น๊ต๋ฅผ ์ํํ๊ฑฐ๋ ๋ชจ๋ ๊ฐ์ฒด์ Equals ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผ ํฉ๋๋ค. ๋ง๋์?
๊ทธ๋ ๋ค๋ฉด IEqualityComparers์ ํจ๊ป xUnit Assert๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ด์ ์ด ์์ต๋๊น?
AutoFixture๊ฐ ํ๋ฅญํ๋ค๊ณ ์๊ฐํ๋ฉฐ SemanticComparer๊ฐ ๋ด ์ค์ ๋งํผ ๋ด ์ฃผ์ฅ์ ์ฝ๊ฒ ๋ง๋ค์ด ์ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
SongDto
์ ๋ํ 3๊ฐ์ง ์(Likeness, SemanticComparer, IEqualityComparer)๋ฅผ ์ ๊ณตํ์ฌ ๊ฑฐ๊ธฐ์์ ๊ณ์ ๋
ผ์ํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค. - ์ง๊ธ์ ์ผ์ด ๋ฐ๋น ์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ..
@moodmosaic ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!! ๊ทธ๋ฆฌ๊ณ SemanticComparer์ ์ด์ ๋ฅผ ์ค๋ช ํ๋ ๋ช ๊ฐ์ง ๊ธฐ์ฌ๋ก ์ ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์ถ๋ค๋ฉด ์๋ง๋ ์ด ์ ์ ๋ํด ๋ ์ง์คํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ https://github.com/jmansar/SemanticComparisonExtensions ๋ฅผ ํฐ ํจ๊ณผ๋ก ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๊ฒ์ผ๋ก ๋๋ ๋ด๋ฉด์ ๋ชจ์ต์ ์ ์ดํ๊ณ ์ฝ๊ฐ ์กฐ์ ํ ์ ์์ต๋๋ค.
๋ณต์กํ ์ค์ฒฉ ๋น๊ต๋ฅผ ์ ์ํ๊ฒ ์ค์ ํ๋ ํ๋ฅญํ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํฉ๋๋ค.
@cvbarros ์ด๋ฌํ ํ์ฅ ๊ธฐ๋ฅ์ ๋งค๋ ฅ์ฒ๋ผ ์๋ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ์ต๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๋ฌํ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ https://github.com/jmansar/SemanticComparisonExtensions ๋ฅผ ํฐ ํจ๊ณผ๋ก ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๊ฒ์ผ๋ก ๋๋ ๋ด๋ฉด์ ๋ชจ์ต์ ์ ์ดํ๊ณ ์ฝ๊ฐ ์กฐ์ ํ ์ ์์ต๋๋ค.
๋ณต์กํ ์ค์ฒฉ ๋น๊ต๋ฅผ ์ ์ํ๊ฒ ์ค์ ํ๋ ํ๋ฅญํ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํฉ๋๋ค.