Runtime: ์งˆ๋ฌธ : .Net Core 1.0์—์„œ ์ง„ํ–‰๋˜๋Š” ์ง๋ ฌํ™” ์ง€์›

์— ๋งŒ๋“  2016๋…„ 03์›” 01์ผ  ยท  38์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/runtime

์•ˆ๋…•ํ•˜์„ธ์š”,
.Net Core 1.0์—์„œ๋Š” ํ”Œ๋žซํผ ๊ฐ„ ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง๋ ฌํ™” ์ง€์›์ด ์ค‘๋‹จ๋œ๋‹ค๋Š” ์†Œ์‹์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. (๊ธฐ์–ต์—์„œ ํŒจ๋Ÿฌ ํ”„๋ ˆ์ด์ง•) ์ด๊ฒƒ์ด ์‹ค์ œ์ ์ธ ์˜๋ฏธ์—์„œ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? BinaryFormatter์˜ Serialize ๋ฐ Deserialize ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์™„์ „ํžˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์˜ˆ์ •์ด๋ฉฐ protobuf-net์ด๋ผ๊ณ  ๋งํ•˜๋ฉด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ณ€ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ์˜คํ•ด ํ–ˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ,
-์ƒ˜

area-Serialization question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

peope๊ฐ€ ์‹ค์ œ๋กœ .NET Core๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด Silverlight์™€ ๊ฐ™์€ ์‹œ๊ฐ„ ๋‚ญ๋น„์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ .NET Core๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“œ์„ธ์š”. ์‚ฌ๋žŒ๋“ค์ด ์ง๋ ฌํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉด ๊ตฌ์ถ•ํ•˜์‹ญ์‹œ์˜ค. ์ด๋“ค์€ ์‹ค์ œ๋กœ ๊ท€ํ•˜์˜ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋ฉฐ ๊ทธ๋“ค์˜ ์˜๊ฒฌ์€ ๋ชจ๋“  Microsoft ์ง์›์˜ ์ง‘๋‹จ์  ์ง€ํ˜œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ๋žŒ๋“ค์€ Microsoft์™€ ๋‹ฌ๋ฆฌ ์‹ค์ œ๋กœ .NET์—์„œ ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ํ•ญ๋ชฉ์„ ๋นŒ๋“œํ•˜๊ณ  ์žˆ์œผ๋ฉฐ .NET Core๊ฐ€ ๋ฌด์—‡์ด๋“  ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์œ ์šฉ์„ฑ์„ ์ค‘๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋‹น์‹ ์—๊ฒŒ ์™„์ „ํ•œ ์žฌ ์ž‘์„ฑ์„ ์œ„ํ•ด .NET์„ ๋ฒ„๋ฆฌ๋ผ๊ณ  ์š”๊ตฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ „์ฒด .NET ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ํฌํŒ…ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ฏค์ด๋ฉด ๋๋‚ฌ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  38 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @joshfree , ์˜ˆ, ๋ถˆํ–‰ํžˆ๋„ ๊ทธ๊ฒƒ์ด ํ˜ผ๋ž€์„ ์ผ์œผํ‚จ ๋ฌธ์„œ์˜€์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ ์ค‘ JSON.NET์€ json ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  protobuf-net์€ ์ด์ง„ ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ datacontractserializer๋Š” xml ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด์ง„ ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. protobuf-net์€ ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์ง€๋งŒ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. Protobuf-nets repo์—์„œ ์ง€์›๋˜๋Š” ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค :
๋ฐ์ดํ„ฐ ๊ณ„์•ฝ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
๋งค๊ฐœ ๋ณ€์ˆ˜์—†๋Š” ์ƒ์„ฑ์ž
Silverlight : ๊ณต๊ฐœ
๋งŽ์€ ๊ณตํ†ต ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ๋“ฑ
๋‹จ์ผ ์ฐจ์› ๋ฐฐ์—ด : T []
๋ชฉ๋ก / IList
์‚ฌ์ „ / IDictionary
IEnumerable์„ ๊ตฌํ˜„ํ•˜๊ณ  Add (T) ๋ฉ”์„œ๋“œ๊ฐ€์žˆ๋Š” ๋ชจ๋“  ์œ ํ˜•
๊ณผ๊ฑฐ์—๋Š” binaryformatter๊ฐ€ ํ•ญ์ƒ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ ์•˜์ง€๋งŒ ๋” ์ด์ƒ ๊ทธ๋ ‡์ง€ ์•Š์„๊นŒ์š”? protobuf-net์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์˜ ์ด์ง„ ์ง๋ ฌํ™”์— ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ง์ ‘ ๋งŒ๋“œ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ๊ฝค ์ดˆ๋ณด์ž์ด๋ฏ€๋กœ ๋ฌด์–ธ๊ฐ€์— ๋Œ€ํ•œ ์š”์ ์„ ์™„์ „ํžˆ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋ถ„์‚ฐ ์ปดํ“จํŒ… (Azure ...)์—์„œ ํ•„์š”์— ๋”ฐ๋ผ ์˜ˆ์™ธ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ง๋ ฌํ™” (๋ฐ ๋ชจ๋“  ๊ด€๋ จ ๋ฐ์ดํ„ฐ ์œ ์ง€) ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@cdrnet point๋Š” Orleans guys IIRC์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํฐ ๊ณ ์ฐฉ ์ ์ž…๋‹ˆ๋‹ค.

@joshfree ํฌํŒ… ์ง€์นจ์ด ์ง€์ ํ–ˆ๋“ฏ์ด ๊ธฐ๋ฅผ .NET Core๋กœ ๊ฐ€์ ธ์˜ฌ ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค. .NET Remoting๊ณผ .NET Core์˜ AppDomain ๊ฐœ๋…์ด ์—†์œผ๋ฉด ์ด์ง„ serializer๋Š” ํ›จ์”ฌ ๋œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. .NET Core์—์„œ ๊ณ„์† ์ง€์› ๋  DataContractSerializer (DCS), DataContractJsonSerializer (DCJS) ๋ฐ XmlSerializer์™€ ๊ฐ™์€ .NET Core์˜ ๋‹ค๋ฅธ serializer๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”. ๋ฌผ๋ก  .NET Core์— ๋นŒ๋“œ ๋œ ํƒ€์‚ฌ serializer๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์งˆ๋ฌธ์„ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด์ง„ ์ง๋ ฌํ™” ๋œ ํŽ˜์ด๋กœ๋“œ๊ฐ€์žˆ๋Š” ์ง๋ ฌํ™”๊ธฐ๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ (๊ทธ๋ ‡๋‹ค๋ฉด ์™œ) ์•„๋‹ˆ๋ฉด ๊ด€์‹ฌ์žˆ๋Š” ์œ ํ˜•์„ ์ง๋ ฌํ™” / ์—ญ ์ง๋ ฌํ™” ํ•  ์ˆ˜์žˆ๋Š” ์ง๋ ฌํ™”๊ธฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” DCS, DCJS ๋ฐ XmlSerializer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ .NET ์œ ํ˜•์˜ ์ง๋ ฌํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ serializer๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํŠน์ • ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ธ์ œ๋“ ์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@cdrnet ๋ฐ @ RichiCoder1 , ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ์ง๋ ฌํ™”์— ๋Œ€ํ•œ ๋…ผ์˜์— ๋Œ€ํ•œ ๊ณต๊ฐœ ๋ฌธ์ œ dotnet / coreclr # 2715๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ํ”ผ๋“œ๋ฐฑ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์˜ˆ์™ธ๋ฅผ ์ง๋ ฌํ™” ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ .NET Core์—์„œ ISerializable์ด ์—†์œผ๋ฉด ์ „์ฒด .NET ํ”„๋ ˆ์ž„ ์›Œํฌ ์—์„œ์ฒ˜๋Ÿผ ์˜ˆ์™ธ๋ฅผ ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @zhenlan , ์•„๋งˆ๋„ ์›๋ž˜ ์–ธ๊ธ‰ ํ–ˆ์–ด์•ผ binaryformatter๋ฅผ ์›ํ•˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ์˜ˆ์™ธ๋ฅผ (๋น„) ์ง๋ ฌํ™”ํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ํฌํ•จํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์œผ๋กœ, ์ผ๋ถ€ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ tcp / ip๋ฅผ ํ†ตํ•ด ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด JSON.NET์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ผ๋ฐ˜์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  tcp / ip๋ฅผ ํ†ตํ•ด ์ „์†กํ•˜๊ณ  ๋‹ค๋ฅธ ์ชฝ ๋์—์„œ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•œ ๋ฒˆ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์—์„œ ์›ํ•˜๋Š” ๊ฐ์ฒด๋กœ ์—ญ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช…ํ•ด ์ฃผ์‹  @SamuelCox ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด์ œ ๋‹น์‹ ์˜ ์šฐ๋ ค๋ฅผ ์ดํ•ด ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ง„ ์ง๋ ฌํ™”๋Š” ๊ฐ€๊นŒ์šด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. Xml ๋˜๋Š” JSON๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ๊ธฐ๋ฐ˜ ์ง๋ ฌํ™”๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ–ฅํ›„ ์„œ๋กœ ๋‹ค๋ฅธ ํ”Œ๋žซํผ ๋˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด / ์Šคํฌ๋ฆฝํŠธ ๊ฐ„์˜ ์ง๋ ฌํ™”๋ฅผ ์ง€์›ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ํŽ˜์ด๋กœ๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ์ •๋ง๋กœ ๋ฌธ์ œ๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ ์˜ค๋Š˜๋‚  ๋งŽ์€ ์„œ๋ฒ„์— ๋‚ด์žฅ ๋œ ๊ธฐ๋Šฅ์ธ ๋ฐ์ดํ„ฐ ์••์ถ•์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค ์„ฑ๋Šฅ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ๋” ๋งŽ์ด ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ง์ ‘ ์ง๋ ฌํ™” ๋ฐ ์—ญ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•  ๋•Œ ๋‚ญ๋น„๋˜๋Š” ์ž‘์—…์ด ๋งŽ์ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ ์–ด๋„ ํ•ด๋ช…์„ ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ์ด๊ฒƒ์„ ์ข…๋ฃŒํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ์—์„œ ์—ด๋ฆฐ 4.6๊ณผ ์ฝ”์–ด 1.0 ์‚ฌ์ด์— ๊ฐ„๊ฒฉ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ™”์— ์กฐ๊ธˆ ๋Šฆ์—ˆ์ง€๋งŒ ์—ฌ๊ธฐ์— ๋‚ด ๋‘ ์„ผํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

BinaryFormatter์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ .NET remoting ๋ฐ AppDomains๋กœ ์ œํ•œ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋ฏฟ๋Š” ๊ฒƒ์€ ์‹ค์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๊ตฌ์‹) BinaryFormatter์™€ ์ตœ์‹  ๋ฒ„์ „์˜ ์ฐจ์ด์ ์€ ํด๋กœ์ €, ํ•˜์œ„ ์œ ํ˜• ๋ฐ ์ˆœํ™˜ ๊ทธ๋ž˜ํ”„๋ฅผ ํฌํ•จํ•˜์—ฌ๋ณด๋‹ค ์ด๊ตญ์ ์ธ .NET ๊ฐœ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜๋Š” ์ˆœ์ „ ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ๋‚˜์—ด๋œ ๋‹ค๋ฅธ serializer๋Š”์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Prajna ๋ฐ Mobius (์ผ๋ช… SparkCLR)์™€ ๊ฐ™์€ Microsoft ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จํ•œ ๋งŽ์€ ์ตœ์ฒจ๋‹จ ๋ถ„์‚ฐ ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด BinaryFormatter์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์šฐ์—ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ .NET ์„ธ๊ณ„์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Spark๋Š” ํด๋กœ์ €๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋ž˜๋˜๊ณ  ๋Š๋ฆฐ Java ๋ฐ”์ด๋„ˆ๋ฆฌ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

mbrace ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž์ฒด FsPickler ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์—ฌ BinaryFormatter์˜ ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•˜๋Š” ๋‹ค๋ฅธ (์ด์ง„ ํ˜•์‹์ด ์•„๋‹Œ) serializer๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CoreCLR์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ CoreCLR๋กœ ์ด์‹ํ•˜๋Š” ๊ฒƒ์ด ๋น„์‹ค์šฉ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ•œ ๋งŽ์€ ์ฃผ์š” API๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๊ด€์ ์—์„œ CoreCLR์ด ๋ถ„์‚ฐ ์ปดํ“จํŒ… / ๋น… ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ JVM์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฒฝ์Ÿ์ž๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” POCO ๋ฐ ํด๋กœ์ € (์ด์ง„ ๋˜๋Š” ๊ธฐํƒ€)์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ธ ์ง๋ ฌํ™” ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ํ”Œ๋žซํผ ์—†์ด๋Š” ๋ฐœ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

peope๊ฐ€ ์‹ค์ œ๋กœ .NET Core๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด Silverlight์™€ ๊ฐ™์€ ์‹œ๊ฐ„ ๋‚ญ๋น„์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ .NET Core๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“œ์„ธ์š”. ์‚ฌ๋žŒ๋“ค์ด ์ง๋ ฌํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉด ๊ตฌ์ถ•ํ•˜์‹ญ์‹œ์˜ค. ์ด๋“ค์€ ์‹ค์ œ๋กœ ๊ท€ํ•˜์˜ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋ฉฐ ๊ทธ๋“ค์˜ ์˜๊ฒฌ์€ ๋ชจ๋“  Microsoft ์ง์›์˜ ์ง‘๋‹จ์  ์ง€ํ˜œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ๋žŒ๋“ค์€ Microsoft์™€ ๋‹ฌ๋ฆฌ ์‹ค์ œ๋กœ .NET์—์„œ ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ํ•ญ๋ชฉ์„ ๋นŒ๋“œํ•˜๊ณ  ์žˆ์œผ๋ฉฐ .NET Core๊ฐ€ ๋ฌด์—‡์ด๋“  ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์œ ์šฉ์„ฑ์„ ์ค‘๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋‹น์‹ ์—๊ฒŒ ์™„์ „ํ•œ ์žฌ ์ž‘์„ฑ์„ ์œ„ํ•ด .NET์„ ๋ฒ„๋ฆฌ๋ผ๊ณ  ์š”๊ตฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ „์ฒด .NET ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ํฌํŒ…ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ฏค์ด๋ฉด ๋๋‚ฌ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

fwiw, CSLA .NET ์€ ๋ชจ๋ฐ”์ผ ๊ฐœ์ฒด์˜ ๊ฐœ๋…์— ๊ธฐ๋ฐ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ ์ถฉ์‹ค๋„ ์ง๋ ฌํ™”์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

Silverlight๊ฐ€ ๋‚˜์˜ค๊ณ  BinaryFormatter ๋˜๋Š” NetDataContractSerializer๊ฐ€ ์—†์—ˆ์„ ๋•Œ _and_๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ถˆ์พŒํ•œ ๋ฐ˜์‚ฌ ์ œํ•œ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์†Œํ•œ์˜ ๋ฐ˜์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  BF ๋˜๋Š” NDCS์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ž์ฒด ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Silverlight ์ดํ›„ ์„ธ๊ณ„์—์„œ๋Š” BF / NDCS๋ฅผ UWP, WinRT, .NET Core ๋“ฑ์—์„œ ์•ˆ์ •์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์™„์ „ํ•œ ์ถฉ์‹ค๋„ ์ง๋ ฌํ™” ๊ธฐ๊ฐ€ ์กด์žฌํ•ด์•ผํ•œ๋‹ค๋Š” ์ฃผ์žฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ .NET์˜ ๋ชจ๋“  ๋‹ค์–‘ํ•œ ํ™”์‹ ์— ์กด์žฌํ•œ๋‹ค๋ฉด ์ •๋ง ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค (์ ์–ด๋„ imo).

@rockfordlhotka @opinionmachine @eiriktsarpalis ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋˜‘๊ฐ™์ด ๋Š๋ผ๋Š” ๊ฒƒ์„ ๋“ฃ๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค . ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๊ฒฐ๋จ์— ๋”ฐ๋ผ corefx ํŒ€์ด ๋” ์ด์ƒ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” @forki์—์„œ ์–ธ๊ธ‰ ํ•œ ๋ฐ”์™€ ๊ฐ™์ด DOTNET / coreclr # 2715์— ๋Œ€ํ•œ ์šฐ๋ ค๋ฅผ ์ž˜ ํ•  ์ˆ˜ ์ข‹์„ ๊ฑธ

์ง๋ ฌํ™” (๋ฐ appdomains)๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๋”์ฐํ•œ ์•„์ด๋””์–ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๊ฒฐ์ •์ด ์ž˜ ์ƒ๊ฐ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ •๋ง๋กœ ๋‚˜๋ฅผ ์–ป๋Š” ๊ฒƒ์€ MS๊ฐ€ appdomains ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋งก๊ฒจ์„œ ๊ทธ๋“ค์ด ํ•  ์ผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

coreclr์ด .net์˜ "์„œ๋ฒ„"๋ฒ„์ „์ด์–ด์•ผํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋งŽ์€ ์„œ๋ฒ„ ๊ธฐ๋Šฅ์ด ๋ฐ”๋‹ฅ์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ์ ˆํ•œ ์‚ฌ๋ก€ : StackTrace / StackFrame์€ ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž์— ์˜ํ•ด "์˜ค์šฉ"๋˜์—ˆ๊ณ  ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— corefx์—์„œ ์ œ์™ธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค (MS์— ๋”ฐ๋ฅด๋ฉด). ๋‚˜๋Š” ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ทธ๋“ค์˜ ๊ฐ๊ฐ์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค (์—„์ฒญ๋‚œ ๋ฐ˜๋ฐœ ํ›„์—) ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๋ง์€ ์ •๋ง๋กœ? ๋ˆ„๊ฐ€์ด ๋ฌผ๊ฑด์„ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๋Š” .net ์ฝ”์–ด๊ฐ€ ์ •๋ง ๋งŒ์กฑ์Šค๋Ÿฝ๊ณ  .net์˜ ํฐ ์ง„์ „์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์„ฑ๋Šฅ ํ–ฅ์ƒ์€ ํ›Œ๋ฅญํ•˜๋ฉฐ ์—ฌ์ „ํžˆ ๋‚ด๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์œผ๋ฉฐ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ๊ฐ€์ง„ ์œ ์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๊ณณ์— ๊ธฐ๋Šฅ์„ ์‚ญ์ œํ•˜๋Š” ๋ฐ๋Š” ๋งŽ์€ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์–ผ๋งˆ๋‚˜ ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋™ํ–ˆ๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”. .net์ด ์ตœ์†Œํ•œ์˜ ๋””์ž์ธ์ด์–ด์•ผํ•œ๋‹ค๋Š” ๋ง์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฑด ์šฐ์Šค๊ฝ ์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ตœ์†Œํ•œ์˜ ๋””์ž์ธ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ๋งํ•˜๊ณ ์žํ•˜๋Š” ๊ฒƒ์€ MS๊ฐ€ ํŠน์ • ๊ธฐ๋Šฅ์„ ๋–จ์–ด ๋œจ๋ ธ๋‹ค ๊ณ  ๋น„๋‚œํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@SamuelCox , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! :-)

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ .NET Core์—์„œ API๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ‹ˆ์ƒˆ ์ค‘ ์ผ๋ถ€๋Š” ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์šฐ๋ฆฌ๋Š” ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์ผ๋ถ€๋Š” ๊ณ ์น˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์ด ๊ฒช๊ณ ์žˆ๋Š” ๋ฌธ์ œ๋“ค (์ง๋ ฌํ™”์— ๊ด€ํ•œ์ด ์ „์ฒด ์“ฐ๋ ˆ๋“œ ์„ธํŠธ์™€ ๊ฐ™์€)์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฐจ๋‹จ ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹จ์ผ ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์—์„œ ์ž„์˜ ๊ฐœ์ฒด ๊ทธ๋ž˜ํ”„์˜ ์ด์ง„ ์ง๋ ฌํ™”๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  'ํž˜๋“ค๋‹ค'๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณด์•ˆ, ์„ฑ๋Šฅ, ์‹ ๋ขฐ์„ฑ ๋“ฑ ํ”Œ๋žซํผ์˜ ๋‹ค๋ฅธ ๋ชฉํ‘œ (์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ชฉํ‘œ)์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๊ด‘๋ฒ”์œ„ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Json.NET + TypeNameHandling.All + PreserveReferencesHandling.All + MemberSerialization.Fields๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. FormatterServices.GetUninitializedObject๋Š” ์—†์ง€๋งŒ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

FormatterServices.GetUninitializedObject๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ํ•ต์‹ฌ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ฆฌํ”Œ๋ ‰์…˜ ๊ธฐ๋ฐ˜ ์ง๋ ฌํ™” ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด์ด ํŠน์ • API๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. CoreCLR ํŒ€์— ๋Œ€ํ•œ ์ €์˜ ๊ถŒ์žฅ ์‚ฌํ•ญ์€์ด API๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋Š ์‹œ์ ์—์„œ .NET ์ปค๋ฎค๋‹ˆํ‹ฐ (์ƒ์—…์  ๋˜๋Š” ๊ธฐํƒ€)๋Š” ํ•ญ์ƒ ์†์„ ์žก๊ณ ์žˆ๋Š” Microsoft์— ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ์ค‘๋‹จํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•œ ์—„์ฒญ๋‚œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์œผ๋กœ ๊ฝค ์˜ค๋žซ๋™์•ˆ ์•Œ๋ ค์ ธ ์žˆ์—ˆ๋‹ค๋ฉด, ๋Œ€์•ˆ์„ ์ œ๊ณตํ•˜๊ธฐ์œ„ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™œ๋™์ด ์—†์—ˆ๋˜ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Json.NET์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋Œ€์•ˆ์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ฐธ์กฐ ์†Œ์Šค ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ๋„ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ  .NET์—์„œ๋„ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€๋ณด๊ธฐ์— ์ด๊ฒƒ์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜์žˆ๋Š” ์ตœ๊ณ ์˜ ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค (์š”๊ตฌ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Œ). ๊ทธ ๊ณต๋ฐฑ์„ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋Œ€์•ˆ์œผ๋กœ ์ฑ„์šฐ๊ธฐ ์ดˆ๊ธฐ์—

@thecodejunkie ๋ฅผ ์›ํ•˜์ง€๋งŒ,์ด๋ฅผ ์œ„ํ•ด ์ ์ ˆํ•œ API๋ฅผ ๋…ธ์ถœํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ ๋Ÿฐํƒ€์ž„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  : ์ด๊ฒƒ์€ .NET Core์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค : Type appDomainType = Type.GetType("System.AppDomain"); . ๊ทธ๋ฆฌ๊ณ  ๋„ค, ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ....

ํ”„๋ŸฐํŠธ ์—”๋“œ ์„œ๋ฒ„ ์‘๋‹ต ์„ฑ์„ 30 % ํ–ฅ์ƒ ์‹œ์ผฐ๊ณ , ์ตœ๋Œ€๋กœ๋“œ์‹œ 12 ๊ฐœ ์ฝ”์–ด์—์„œ ์ตœ๋Œ€๋กœ๋“œ์‹œ 2 ๊ฐœ ์ฝ”์–ด๋กœ ์ค„์˜€์œผ๋ฉฐ, redis ์บ์‹œ ํฌ๊ธฐ๋ฅผ 1.7Gb์—์„œ 350Mb๋กœ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ์ „์ฒด์ ์œผ๋กœ Azure ํ˜ธ์ŠคํŒ…์„ 20 % ์ค„์˜€์Šต๋‹ˆ๋‹ค (๋น„ํŠธ ๋” ์ง„์งœ)

BinaryFormatter๋ฅผ ์ง์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค!

netdatacontractserializer๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

BinaryFormatter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด .Net 4.6.1์ด ํ›จ์”ฌ ๋Š๋ ค์ง์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ API๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์ง๋ ฌํ™”). ์ด์ƒ์ ์ด์ง€ ์•Š๊ณ  ๋ถ€์„œ์ง€๊ธฐ ์‰ฌ์šด ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ตœ์†Œํ•œ ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฝ”์–ด ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฐ„๋‹จํ•œ ๊ฐ์ฒด ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๊ฒฝ๋Ÿ‰์ด์ง€๋งŒ ์‹œ์Šคํ…œ ๊ฐ„ ๋ฐ ์ž ์žฌ์ ์œผ๋กœ ๋ฒ„์ „ ๊ฐ„ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ํƒ„๋ ฅ์ ์ž…๋‹ˆ๋‹ค.

์ทจ์•ฝ์„ฑ ์™ธ์—๋„ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@blowdart WRT ๋ณด์•ˆ, https://blog.scrt.ch/2016/05/12/net-serialiception/ ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธ

๋„ค, ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ์ง๋ ฌํ™” ํ˜•์‹์€ Java๊ฐ€ ์˜ฌํ•ด ๋ฐœ๊ฒฌ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ทจ์•ฝ์  ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ง„ ์ง๋ ฌํ™”๋ฅผ ์‚ญ์ œํ–ˆ์„ ๋•Œ ๋งค์šฐ ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค.

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ
Serializer๋Š” ๋ฌผ๊ฑด์„ ๋ณด๋‚ด๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ in-proc์—๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ”์ด๋„ˆ๋ฆฌ ์‹œ๋ฆฌ์–ผ ๋ผ์ด์ €๋Š” ์ ์ ˆํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๋ฉด ์ฒ˜๋ฆฌ์ค‘์ธ ์ˆ˜์ฒœ๋งŒ ๊ฐœ์˜ ๊ฐœ์ฒด๋ฅผ ์ €์žฅํ•  ๋•Œ ์ „์ฒด ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐœ์ฒด ํž™๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ ์ข€ ๋ด:
https://www.infoq.com/articles/Big-Memory-Part-2

์ง๋ ฌํ™” API๋Š” ์ •์ƒ์ ์ธ ํด๋Ÿฌ์Šคํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ์ฒด ์ธ์Šคํ„ด์Šค CLR-> ํ…์ŠคํŠธ-> CLR์„ ํ…”๋ ˆํฌํŠธํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆํŽธํ•˜๋ฉฐ ์—„์ฒญ๋‚œ ์˜ค๋ฒ„ ํ—ค๋“œ์ž…๋‹ˆ๋‹ค.
๋งค์šฐ ๋Š๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ๊ทธ๋žจ์ด ๊ฑฐ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— BinaryFormatter๋ฅผ ๊บผ๋‚ด๋Š” ๊ฒƒ์€ ์‹ค์ˆ˜๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ
์ด๋Š” ์ „์ฒด CLR ์ง๋ ฌํ™” ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ง€์›ํ•˜๋Š” NFX.Slim ์™ธ์— ์‹œ์žฅ์—์„œ ์œ ์ผํ•œ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ์˜€์Šต๋‹ˆ๋‹ค.
์ž์„ธํ•œ ์†๋„ ๋ฐ ํฌ๊ธฐ ์ฐจํŠธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
http://aumcode.github.io/serbench/

[OnSer / Deser] ์ œํ’ˆ๊ตฐ์œผ๋กœ ISerializable์€ ํ”Œ๋žซํผ ๋‚ด ์ˆœ๊ฐ„ ์ด๋™์— ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ „ NET๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•„์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋ณด๊ด€ํ•˜์ง€ ์•Š์œผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
์ ์–ด๋„ ๋ณต์žกํ•œ ์ปฌ๋ ‰์…˜ (์˜ˆ : ์‚ฌ์ „)์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ „ํ˜€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ๋žŒ์ด JSON์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ (BinaryFormatter๊ฐ€ ์•„๋‹˜)๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€์ ์œผ๋กœ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.
๋ชจ๋‘๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—†์ด ํŠธ์œ„ํ„ฐ์™€ ์œ ์‚ฌํ•œ ์•ฑ์„ ๋งŒ๋“ค๊ณ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‚˜์š”?

@itadapter ๋Š” ์„ ํƒํ•  ์ˆ˜์žˆ๋Š” ๋‹ˆํŠธ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” JSON.Net์ด ๋งˆ์„์—์„œ ์œ ์ผํ•œ ์ง๋ ฌํ™” ๊ฒŒ์ž„์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. MsgPack, Protobuf ๋ฐ Microsoft์˜ ์ž์ฒด Bond๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (ํŽธ์ง‘ : ๋‘ ๋ฒˆ์งธ ๋งํฌ๋Š” Protobuf๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค). Json์ด ์œ ์ผํ•œ ์˜ต์…˜์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํฅ๋ฏธ๋กœ์šด ์˜๋ฏธ๋ก  (์˜ˆ์™ธ)์œผ๋กœ .Net ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜๋Š” ๋ฐ์—๋Š” ์—ฌ์ „ํžˆ ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ
์˜ˆ, ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฐจํŠธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด JIL์€ ๊ฐ€์žฅ ๋น ๋ฅธ JSON ์„ธ๋ฆด ๋ผ์ด์ €์ด์ง€๋งŒ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์‹œ๋ฆฌ์–ผ ๋ผ์ด์ €๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๊ฑด๋“œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Protobuf๋Š” ์ง„์ •ํ•œ ๋‹คํ˜•์„ฑ๊ณผ ๋ณต์žกํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ์ง€์›ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋Œ€์‹  ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ :

  • ์ด์ง„ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋Š” ํŠนํžˆ ์ˆซ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ฐœ์ฒด์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋” ์„ฑ๋Šฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋Š” ์‹œ์Šคํ…œ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™ํ•˜๋Š” ๋ฐ๋งŒ ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Big Memory ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์•„๋‹ˆ์ง€๋งŒ ์‹ค์งˆ์ ์ธ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ์บ์‹œ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์†Œ์…œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰).
  • "Teleportation"์€ MS Remoting๊ณผ ์œ ์‚ฌํ•œ ๊ธฐ์ˆ ๋กœ ์ •์งํ•˜๊ฒŒ ๋ง๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์›๊ฒฉ ์ž‘์—…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋ฉด (๋”์ฐํ•œ ๋ณต์žก์„ฑ์—†์ด) ํด๋Ÿฌ์Šคํ„ฐ ์‹œ์Šคํ…œ์—์„œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ธฐ๋ณธ ๊ฐœ์ฒด๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. DOMAIN ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๊ทธ๋Œ€๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ๊ธฐ์žˆ๋Š” serializer๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” "Typical Person"์˜ ๋ฒค์น˜ ๋งˆํฌ :
http://aumcode.github.io/serbench/Specimens_Typical_Person/web/overview-charts.htm

์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ISerializable ๋“ฑ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๊ฐ€ corefx์—์„œ ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/dotnet/corefx/tree/master/src/System.Runtime.Serialization.Formatters

@zhenlan ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” .NetStandard2.0 ์ž‘์—…์˜ ์ผ๋ถ€์ž…๋‹ˆ๊นŒ?

@ RichiCoder1 ๋„ค, ๋งž์Šต๋‹ˆ๋‹ค.

@zhenlan์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค!

@zhenlan Standard ๋ฏธ๋ฆฌ๋ณด๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ์†์„ฑ์„ ์ฐพ์„ ์ˆ˜์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@justinhelgerson ๊ฑฐ๊ธฐ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ณต์ง€ ์‚ฌํ•ญ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์˜ ์ง€์นจ์— ๋”ฐ๋ผ 2.0 Preview1 SDK๋ฅผ ์„ค์น˜ ํ–ˆ์Šต๋‹ˆ๊นŒ?

.NET Core ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“  ํ›„ .csproj ํŒŒ์ผ์— ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“  ๊ฒฝ์šฐ <TargetFramework>netstandard2.0</TargetFramework> , ์ฝ˜์†” ์•ฑ์„ ๋งŒ๋“  ๊ฒฝ์šฐ <TargetFramework>netcoreapp2.0</TargetFramework> ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

BTW,์ด ์Šค๋ ˆ๋“œ์˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด์ง„ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ์— ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฏ€๋กœ .NET Core 2.0์˜ [Serializable] ์ถ•์†Œ์— ๋Œ€ํ•œ dotnet / corefx # 19119์— ๋Œ€ํ•œ ํ† ๋ก ์— ๊ด€์‹ฌ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜๊ฒฌ์ด ์žˆ์œผ์‹œ๋ฉด ์ €ํฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@zhenlan ๋น ๋ฅธ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. NuGet์„ ํ†ตํ•ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์„ค์น˜ํ–ˆ์ง€๋งŒ .csproj ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ํŠธ๋ฆญ์ด์—ˆ์Šต๋‹ˆ๋‹ค! ์ถ•์†Œ์— ๋Œ€ํ•ด ์ฝ๊ณ  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒฝ์šฐ ์ž…๋ ฅ์„ ์ œ๊ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@justinhelgerson , ์Šค์ผ€์ผ ๋ฐฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ 1์—๋Š” ์—†์ง€๋งŒ (์•„์ง ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค!), ๊ณง ์ผ์ผ ๋นŒ๋“œ ๋˜๋Š” ํ–ฅํ›„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ ์‹œ๋„ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰