์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
1. ๊ฐœ์š”2. ์„ธ๋ถ€์‚ฌํ•ญ
2.1. Xamarin.Android2.2. Xamarin.iOS2.3. Xamarin.Mac2.4. Xamarin.Forms2.5. Xamarin Test Cloud2.6. Xamarin Insights2.7. Xamarin.Essentials
3. ๊ฒฝ์Ÿ์ƒ๋Œ€4. ์™ธ๋ถ€ ๋งํฌ

1. ๊ฐœ์š”[ํŽธ์ง‘]

C#๊ณผ .NET Framework๋ฅผ ๋ฆฌ๋ˆ…์Šค์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Mono ํ”„๋กœ์ ํŠธ์—์„œ ์‹œ์ž‘๋œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‚˜ ํ˜„์žฌ Xamarin์€ ๋ฆฌ๋ˆ…์Šค๋ฅผ ๊ณต์‹ ์ง€์›ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ํ•œ๊ตญ์–ด๋กœ๋Š” ๋Œ€์ถฉ ์ž๋งˆ๋ฆฐ์ด๋ผ๊ณ  ์ฝ๊ณ  ์“ฐ๋ฉด ์–ด์ง€๊ฐ„ํ•˜๋ฉด ๋œป์ด ํ†ตํ•œ๋‹ค. ์‹ค์ œ ๋ฐœ์Œ์€ ์ฆˆ์• ๋งˆใ„น๋ฆฐ์— ๊ฐ€๊นŒ์šด ํŽธ.

์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ๋ฆฌ๋ˆ…์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ธ๊ณ„๋ฅผ ์ง€๋ฐฐํ•˜๊ณ  ์œˆ๋„์šฐํฐ์ด ์ฃฝ์„ ์‘ค์ž ๋งˆ์†Œ์—์„œ๋Š” ์ด์— ๋Œ€์‘ํ•˜์—ฌ .NET Framework์™€ C#์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ ์•„์ดํฐ์„ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ•˜๋Š” ์‹œ๋„ ์ฐจ์›์—์„œ Xamarin์ด ๋“ฑ์žฅํ•˜์˜€๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS์˜ API๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ถ•์— ์•ฝ๊ฐ„ ๋„ฃ์„์ˆ˜ ์žˆ๋Š” ์ •๋„๋‹ค. ํ•œ๋ฒˆ ์ž‘์„ฑํ•œ ํผ๊ณผ ๋กœ์ง์ด ์•ˆ๋“œ๋กœ์ด๋“œ์™€ ์•„์ดํฐ์—์„œ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ๋™์‹œ์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

Mono๋ฅผ ์ฃผ๋„ํ•ด์˜จ ๋ฉ•์‹œ์ฝ”๊ณ„ ๋ƒ‡ ํ”„๋ฆฌ๋“œ๋จผ๊ณผ ๋ฏธ๊ตฌ์—˜ ๋ฐ ์ด์นด์‚ฌ(CTO)๊ฐ€ ์„ค๋ฆฝํ•˜์˜€์œผ๋ฉฐ 2016๋…„ 2์›” 24์ผ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ ์ธ์ˆ˜, 2016๋…„ 3์›” 31์ผ ์†Œ์Šค๋ฅผ ๊ณต๊ฐœํ•˜์˜€๋‹ค.

2020๋…„ ํ•˜๋ฐ˜๊ธฐ์— ๋”ฐ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋˜ .NET ํ”Œ๋žซํผ๋“ค์ด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง€๋Š” ๊ณผ์ •์˜ ์ดˆ์„์ธ .NET 5๊ฐ€ 2020๋…„ ํ•˜๋ฐ˜๊ธฐ์— ์ถœ์‹œํ•œ ํ›„ ์–ผ๋งˆ ์ง€๋‚˜์ง€ ์•Š์•„ ์ดํ›„ ๋ฒ„์ „์ธ .NET 6 ์ถœ์‹œ์— ๋งž์ถฐ Xamarin ํ”„๋ ˆ์ž„์›Œํฌ์— ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ๊ณ ๋˜์—ˆ๋‹ค. # ํ˜„์žฌ ์ด ํ”„๋กœ์ ํŠธ๋Š” .NET MAUI(Multi platform App UI)๋ผ๊ณ  ๋ฐœํ‘œ๋˜์—ˆ์œผ๋ฉฐ ์ธ๊ธฐ์—†๋Š” ์ž๋งˆ๋ฆฐ์„ ๋ฆฌ๋ธŒ๋žœ๋”ฉํ•œ ์ •๋„๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2. ์„ธ๋ถ€์‚ฌํ•ญ[ํŽธ์ง‘]

2.1. Xamarin.Android[ํŽธ์ง‘]

Mono for Android ์—์„œ ๊ฐœ๋ช…๋˜์—ˆ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ์˜ API๋ฅผ C# ์Šคํƒ€์ผ์˜ API๋กœ ๋ฐ”๊พธ์–ด ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

์ดํ›„ 2021๋…„ 11์›”์— ๊ณต์‹ ๋ฆด๋ฆฌ์ฆˆ ์˜ˆ์ •์ธ .NET 6์— .NET for Android๋ž€ ๋ช…์นญ์œผ๋กœ ๋ฐ”๋€Œ์–ด ํฌํ•จ๋  ์˜ˆ์ •์ด๋‹ค.

2.2. Xamarin.iOS[ํŽธ์ง‘]

MonoTouch ์—์„œ ๊ฐœ๋ช…๋˜์—ˆ๋‹ค. iOS์˜ API๋ฅผ C# ์Šคํƒ€์ผ์˜ API๋กœ ๋ฐ”๊พธ์–ด ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

์ดํ›„ 2021๋…„ 11์›”์— ๊ณต์‹ ๋ฆด๋ฆฌ์ฆˆ ์˜ˆ์ •์ธ .NET 6์— .NET for iOS๋ž€ ๋ช…์นญ์œผ๋กœ ๋ฐ”๋€Œ์–ด ํฌํ•จ๋  ์˜ˆ์ •์ด๋‹ค.

2.3. Xamarin.Mac[ํŽธ์ง‘]

MacOS ์„œํฌํŠธ ๋ฒ„์ „. ํ•ด์™ธ์—์„  ์ด๋ฅผ ์ด์šฉํ•œ ์œ ๋ฃŒ์•ฑ๋„ ์ถœ์‹œ๋˜์–ด ์žˆ๋‹ค.

2.4. Xamarin.Forms[ํŽธ์ง‘]

2014๋…„ ๋’ค๋Šฆ๊ฒŒ ์ถœ์‹œ๋œ Xamarin.Forms ๋Š” ์ถœ์‹œ๋‹น์‹œ์—๋Š” ๊ฐœ๋ฐœ์ž๋“ค์˜ ํ˜ธ์‘์„ ์–ป์—ˆ์œผ๋ฉฐ Cross-Platform ๊ฐœ๋ฐœ์ด ์ด๋ฃจ์–ด์กŒ๋‹ค. MS์˜ WPF์™€ C#๊ณผ XAML๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์€ ์žˆ์œผ๋‚˜ WPF์™€ Xamain/MAUI์˜ widget๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์— ์žˆ์–ด ์„ธ๋ถ€์ ์ธ ์ฐจ์ด์ ์ด ์žˆ์–ด ๊ฑฐ์˜ ๋‹ค๋ฅธ ํ”„๋ž˜์ž„์›Œํฌ๋ผ ํ• ์ˆ˜ ์žˆ์–ด ํ•™์Šต๋Ÿ‰์ด ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด์žˆ๋‹ค.

new Label() ํ•˜๋ฉด Android iOS WindowsPhone WPF UWP macOS Tizen ์œผ๋กœ ๋ชจ๋‘ ๋ฒˆ์—ญํ•ด์ค€๋‹ค. ์ˆจ์ฐจ๋‹ค ๋‹ค์–‘ํ•œ nuget ํŒจํ‚ค์ง€๋“ค๊ณผ ํ•จ๊ป˜ ์ด์šฉํ•˜๋ฉด 90% ์ด์ƒ์˜ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ 10%์ดํ•˜์˜ OS ๋ณ„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์—ฌ๋Ÿฌ OS ์šฉ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. WPF ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Code ์Šคํƒ€์ผ๊ณผ Xaml (์žฌ๋ฏˆ) ์Šคํƒ€์ผ์ด ์žˆ๋‹ค. ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ ๊ฐœ๋ฐœํ™˜๊ฒฝ/์ทจํ–ฅ์— ๋”ฐ๋ผ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜, ์œ„์˜ ์ด์•ผ๊ธฐ๋Š” ์–‘์ชฝ ํ”Œ๋žซํผ์„ ์ž์œ ๋กญ๊ฒŒ ๋‹ค๋ฃฐ ์ธ๋ ฅ์ด ์—†๋Š” ๊ฐœ๋ฐœ์‚ฌ์— ํ•ด๋‹นํ•˜๊ณ , iOS/Android ๊ฐœ๋ฐœ ์ธ๋ ฅ๊ณผ ๊ธฐํš์ž๊ฐ€ ๊ฐ–์ถฐ์ ธ์žˆ๋Š” ํŒ€์˜ ๊ฒฝ์šฐ ์•„์ง๊นŒ์ง€๋Š” ๊ธฐ์กด์˜ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๊ฒŒ์ž„์˜ ๊ฒฝ์šฐ ๊ธฐ์กด ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์ œ๊ณต๋˜๋Š” UI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†๊ณ , ์•„์˜ˆ ํ•ด๋‹น ๊ฒŒ์ž„์— ๋งž๋Š” UI ๋ฅผ ๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ๊ฐœ๋ฐœํ•˜๋Š”๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ด๊ธฐ์— ์œ ๋‹ˆํ‹ฐ ๊ฐ™์€ Cross-Platform ๊ฐœ๋ฐœ์ด ์œ ๋ฆฌํ•˜์ง€๋งŒ, ๊ฒŒ์ž„ ์™ธ์˜ ์•ฑ๋“ค์€ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์ œ๊ณตํ•˜๋Š” UI๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ์— ์˜คํžˆ๋ ค ์ž‘์—…์ด ๋Š˜์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด, ๋ฒ„ํŠผ ํ•˜๋‚˜์— ์ด๋ฏธ์ง€๋ฅผ ์ž…ํžˆ๋Š” ์ž‘์—…๋งŒ ๋ณด๋”๋ผ๋„, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋Š” ๊ณต์œ ํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„ ์„œ๋ฒ„์—ฐ๋™์ด๋‚˜ ํŽ˜์ด์ง€ ์ „ํ™˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์• ์ดˆ์— ๋ช‡ ์ค„ ์ ˆ์•ฝ๋˜์ง€๋„ ์•Š์œผ๋ฉฐ, ๋ฐ˜๋ฉด์— ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ํ•ด๋‹น ๋ฒ„ํŠผ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€์˜ layout ํŒŒ์ผ ์ž‘์—…, ํ•ด๋‹น ๋ฒ„ํŠผ์˜ ์ƒํƒœ๋ณ„ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์—ฌ์ค„ selector ํŒŒ์ผ ์ž‘์—…, iOS ์˜ ํ•ด๋‹น ๋ฒ„ํŠผ์˜ ์ƒํƒœ๋ณ„ ์ด๋ฏธ์ง€ ์ œ์–ด ์ฝ”๋“œ์ž‘์—…์„ ํ•ด์•ผํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์ž‘์—…ํ•˜๊ณ ๋„ ๊ธฐ์กด์˜ ๋„ค์ดํ‹ฐ๋ธŒ UI์˜ ์„ธ๋ถ€์ ์ธ ์„ค์ •์„ 100% ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„๋“ค์ด ์žˆ์œผ๋ฉฐ, ๋ฒ„ํŠผ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋งˆ๋‹ค ์ด๋ ‡๊ฒŒ C# style, Android style, iOS style ์„ ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๋ฉด์„œ ์ž‘์—…ํ•ด์•ผํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ SDK์˜ ๊ธฐ๋ณธ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋Š” WYSIWYG ๋ฐฉ์‹์˜ ๊ฐœ๋ฐœ๋„ ์‚ฌ์‹ค์ƒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
๋ฟ๋งŒ์•„๋‹ˆ๋ผ, ์•ฑ์˜ ํฌ๊ธฐ์— ์žˆ์–ด์„œ๋„ ๊ธฐ์กด์˜ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๋งŒ๋“ค๋ฉด ๋ช‡ KB๋กœ ๋๋‚˜๋Š” HelloWorld ์ •๋„๋งŒ ๊ตฌํ˜„ํ•ด๋„ ์†Œ์ค‘ํ•œ iPhone ์šฉ๋Ÿ‰์„ 60MB ๋‚˜ ์ฐจ์ง€ํ•ด๋ฒ„๋ฆฌ๋ฉฐ, ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๋ฉด ์ˆ˜๋ฐฑMB ๋ฅผ ์ฐจ์ง€ํ•˜๋Š”๋ฐ... ๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ๋Š” ๋ช‡์‹ญMB ๋กœ ๋๋‚  ๋‚ด์šฉ์ด๋‹ค. ๊ฒฐ๊ตญ ๊ฒŒ์ž„๋„ ์•„๋‹Œ ์•ฑ์ด ๊ฒŒ์ž„์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋กœ ๋‹ค์šด๋˜๋Š” ๋‹ต์—†๋Š” ์ƒํ™ฉ์œผ๋กœ ์ด์–ด์ง€๊ธฐ ์‰ฝ๋‹ค.[1]๊ทธ๋Ÿฐ๊ฑด ํฌ์ผ“๋ชฌ ๊ณ ๋กœ ์ถฉ๋ถ„ํ•ด
๊ฒฐ์ •์ ์œผ๋กœ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋„ˆ๋ฌด๋‚˜๋„ ๋ถ€์กฑํ•˜๋‹ค. ๋‹น์žฅ '๋ฒ„ํŠผ ์ด๋ฏธ์ง€ ์„ธํŒ…ํ•˜๊ณ  ํฌ๊ธฐ ๋ฐ”๊พธ๋Š” ๋ฒ•'์„ ์ฐพ์•„๋ณด๋ฉด ๊นจ๋‹ซ๊ฒŒ ๋œ๋‹ค. ๊ตญ๋‚ด ๋„์„œ๋Š” ์ „๋ฌดํ•˜๋ฉฐ, ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ ์ž๋ฃŒ๋Š” ์• ํ”Œ์ด๋‚˜ ๊ตฌ๊ธ€์˜ ๊ณต์‹ ์ž๋ฃŒ์— ๋น„ํ•ด ๋„ˆ๋ฌด๋‚˜๋„ ๋ถ€์‹คํ•˜๊ธฐ์— ๊ตฌ๊ธ€๊ฐ™์€ ์ˆ˜์ค€์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ„... Stack Overflow์—์กฐ์ฐจ๋„ ์ œ๋Œ€๋กœ ๋œ ์„ค๋ช…์ด ์—†์–ด์„œ, ์˜ค๋ฅ˜๊ฐ€ ํ•˜๋‚˜ ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค Xamarin ๊ฐœ๋ฐœ์ง„๊ณผ ์˜์–ด๋กœ ์†Œํ†ต์„ ํ•ด๊ฐ€๋ฉฐ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฐœ์ฒ™์ž์˜ ๊ธฐ๋ถ„์„ ๋А๋‚„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํšŒ์‚ฌ์˜ ํ”„๋กœ์ ํŠธ์— ๋„์ž…์„ ํ•˜๊ธฐ ์ „์— ์ถฉ๋ถ„ํ•œ ์—ฐ๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ฑ…์ด ํ•œ๋‘๊ฐœ ๋‚˜์˜ค๊ณ  ์ตœ์ ํ™”๊ฐ€ ์–ด๋А ์ •๋„ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ž. [2]

์œ„ ๋ฐ˜๋ก ์€ ๋ฆฌ๋ชจ๋ฆญ์Šค ๊ฐœ๋ฐœ ์ด์•ผ๊ธฐ ์™€ ์ƒํ†ตํ•˜๋Š” ์ด์•ผ๊ธฐ๋กœ Xamarin.Android ์™€ Xamarin.iOS ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 5๋งŒ๊ฑด์ด์ƒ์˜ (2017.2 ๊ธฐ์ค€) ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ธฐ๋กํ•œ ์„ฑ๊ณต์ ์ธ ์•ฑ์„ ๋งŒ๋“  ๋…ธํ•˜์šฐ์™€ ์‹œํ–‰์ฐฉ์˜ค๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ธ€์ด๋‹ค. ํ•˜์ง€๋งŒ Xamarin.Forms ๋ฅผ ์ ๊ทน ๋„์ž…ํ•˜์ง€ ์•Š์•˜๊ธฐ์— ์ž๋งˆ๋ฆฐ์˜ ์žฅ์ ์„ ๊ทน๋Œ€ํ™”ํ–ˆ๋‹ค๊ณ  ํ• ์ˆ˜์—†๋‹ค.(๊ฐœ๋ฐœ์‹œ์ž‘์‹œ์ ์— XF๊ฐ€ ์—†์—ˆ๋˜๊ฒƒ์œผ๋กœ ๋ณด์ž„) ๋˜ํ•œ ๊ธฐ์กด axml ๊ณผ storyboard ๊ฐ™์€ UI ๊ตฌ์„ฑ์ง€์‹์ด ์—†์–ด์•ผ ์˜คํžˆ๋ ค XF ๋ฅผ ์ ๊ทน ๋„์ž…ํ•˜๊ฒŒ ๋˜๋ฉฐ ์•ฝ๊ฐ„์˜ custom renderer ์ฝ”๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชป๋งŒ๋“ค UI ๊ฐ€ ์—†๋‹ค. new StackLayout().to ๋ผ๊ณ  ์น˜๋ฉด ๊ฐ์ข… ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ด€๋ จ ๋ฉ”์†Œ๋“œ๋“ค์ด ๋‚˜์˜จ๋‹ค.

apk์™€ ipa์˜ ๊ธฐ๋ณธ์šฉ๋Ÿ‰์€ 10~20MB์ด๋ฉฐ ๊ณง ๋‚˜์˜ฌ XF 2.4์™€ 2.5[3] ์—์„œ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ด€๋ จ ์ตœ์ ํ™”๊ฐ€ ๋”์šฑ ์ด๋ฃจ์–ด์งˆ ์˜ˆ์ •์ด๋‹ค. ๊ตฌ๊ธ€์—์„œ ์˜๋ฌธ๊ฒ€์ƒ‰์œผ๋กœ ์ž๋ฃŒ๋ฅผ ์ฐพ์œผ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋“ค์ด ์ด๋ฏธ ๋…ผ์˜๋˜์–ด ์žˆ๋‹ค.

Xamarin Forms๋Š” ๊ฐœ๋ฐœ์ง„ ์ธก์—์„œ๋„ ํ”Œ๋žซํผ ์˜์กด๋„๊ฐ€ ์ ๊ณ  ์ปค์Šคํ…€ UI์˜ ์ค‘์š”๋„๊ฐ€ ์ ์€ ๊ณณ์— ์ ํ•ฉํ•˜๋ฉฐ(์ด๋ฆ„๋ถ€ํ„ฐ๊ฐ€ ํผ ํ˜•์‹์— ์ ํ•ฉํ•˜๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค) ๋ฐ˜๋Œ€๋กœ ํ”Œ๋žซํผ ๊ณ ์œ  API ์ง€ํ–ฅ์ ์ด๋ฉฐ ๋””์ž์ธ ๋œ UI๋ฅผ ์ค‘์‹œํ•˜๋Š” ๊ฒฝ์šฐ(์‚ฌ์ดํŠธ์— ๊ทธ๋ฆผ์œผ๋กœ ์˜ˆ์‹œํ•˜๋Š” ๊ฒƒ๋“ค์€ ๊ฒƒ์€ ๋ฏธ๋””์–ด ํ”Œ๋ ˆ์ด์–ด, ๊ฒŒ์ž„, ์ง€๋„ ์•ฑ)์—๋Š” Xamarin Native(Android, iOS)๋ฅผ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค. Xamarin Forms๋Š” UI ๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ด์ง€ ๋กœ์ง์˜ ์ฝ”๋“œ๊นŒ์ง€ ํ•˜๋‚˜๋กœ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ค‘ ํ”Œ๋žซํผ ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ ๊ฐ๊ฐ ๋ชจ๋‘ ๋”ฐ๋กœ ์ฝ”๋”ฉํ•ด์•ผ ํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ์— ๋น„ํ•ด ํ™•์‹คํ•˜๊ณ  ๋ถ„๋ช…ํ•œ ๊ฐ•์ ์ด ์žˆ์œผ๋‚˜ ๊ทธ๋งŒํผ์˜ ์ œ์•ฝ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๋˜๋Š” ๋‹จ์ ๋“ค๊ณผ์˜ ํƒ€ํ˜‘์ด ํ•„์š”ํ•˜๋‹ค. ํŠนํžˆ ์•ˆ๋“œ๋กœ์ด๋“œ ์ชฝ์€ ์•ž์—์„œ๋„ ์–ธ๊ธ‰๋œ ๋ฉ”๋ชจ๋ฆฌ ์ด์Šˆ ๋ฐ ๊ธฐ๋ณธ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” 'Welcome to Xamarin Forms!' ๋งˆ์ €๋„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๋„ค์ดํ‹ฐ๋ธŒ์— ๋น„ํ•ด ๊ธฐ๊ธฐ์— ๋”ฐ๋ผ 2~3์ดˆ ์ •๋„์”ฉ ๋” ์†Œ์š”๋˜๋ฉฐ ์•„์ง์€ ๊ตฌํ˜„์ด ๋œ ๋˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ์„ฑ API๋“ค๋„ ์žˆ๋‹ค. ์ œ์•ฝ์ด ๋˜๋Š” ๋ถ€๋ถ„๋“ค์€ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑํ•œ ๋’ค DependencyService๋ฅผ ํ†ตํ•ด ํ”Œ๋žซํผ ๋ณ„๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์ปค์Šคํ…€ UI๋„ Custom Renderer ์จ์„œ ํ”Œ๋žซํผ๋ณ„๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ์™€ ๋‹ค๋ฅผ๊ฒŒ ์—†๋‹ค์ง€๋งŒ ๊ทธ๋Ÿด๊ฑฐ๋ฉด ๊ทธ๋ƒฅ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ๋ฉ”๋ฆฌํŠธ๊ฐ€ ํฌ๊ฒŒ ์ƒ์‡„๋˜๋‹ˆ...... ๋‹ค๋งŒ ์ ์€ ์ธ๋ ฅ์œผ๋กœ ๋น ๋ฅธ ์‹œ๊ฐ„์•ˆ์— ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฐœ๋ฐœ์„ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ คํ•ด ๋ณผ ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐœ๋ฐœ์ง„ ์ธก์—์„œ๋„ ํฌ๋Ÿผ์„ ํ†ตํ•ด ์ตœ์ ํ™”์— ํž˜์“ฐ๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋‹ˆ ์•ž์œผ๋กœ๋ฅผ ๊ธฐ๋Œ€ํ•ด ๋ณด๋„๋ก ํ•˜์ž.

Xamarin.Forms 3.0 ์ด ์ถœ์‹œ๋˜์—ˆ๋‹ค. (2018.5)
FlexLayout[4] ์ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ  CSS ๊นŒ์ง€ ์ง€์›ํ•œ๋‹ค. WPF ๋„ ๊ณต์‹ ์ง€์›ํ•œ๋‹ค.

.NET 5๊ฐ€ 2020๋…„ ํ•˜๋ฐ˜๊ธฐ์— ์ถœ์‹œ๋œ ํ›„ ์•ž์œผ๋กœ์˜ ๋กœ๋“œ๋งต์ด ๊ณต๊ฐœ๋˜์—ˆ๋Š”๋ฐ Xamarin.Forms๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” .NET MAUI๋กœ ์ ์ฐจ ์ด์ „๋œ๋‹ค๊ณ  ํ•œ๋‹ค.
๋‹ค๋งŒ, ์ด์ „ ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง€๊ณ  .NET MAUI ๊ณต์‹ ๋ฆด๋ฆฌ์ฆˆ ์ดํ›„์—๋„ ๊ณ„์† ์ง€์›์„ ํ•˜๋ฉฐ 2022๋…„ ํ•˜๋ฐ˜๊ธฐ๊นŒ์ง€ ์—…๋ฐ์ดํŠธ๊ฐ€ ์˜ˆ์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
.NET ๊ณต์‹ ๋ธ”๋กœ๊ทธ - .NET MAUI
Xamarin.Forms Roadmap

2.5. Xamarin Test Cloud[ํŽธ์ง‘]

์•ฑ ๋™์ž‘์ˆœ์„œ๋ฅผ ์ž…๋ ฅํ•ด๋†“์œผ๋ฉด 2000์—ฌ๊ฐœ์˜ ์‹ค๊ธฐ๊ธฐ์—์„œ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•ด์ฃผ๊ณ  ๋กœ๊น…ํ•ด์ค€๋‹ค.(์œ ๋ฃŒ)

2.6. Xamarin Insights[ํŽธ์ง‘]

์•ฑ ๋‚ด๋ถ€์—์„œ ์ผ์–ด๋‚˜๋Š” ํฌ๋ž˜์‹œ๋‚˜ ๊ธฐํƒ€ ์ •๋ณด๋ฅผ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋กœ๊น…ํ•ด์ค€๋‹ค. HockeyApp๊ณผ ํ†ตํ•ฉ๋˜์—ˆ๋‹ค.

2.7. Xamarin.Essentials[ํŽธ์ง‘]

๋ชจ๋“  ๊ธฐ์ข…์—์„œ ๊ณต์œ ํ•˜๋Š” ํ•˜๋“œ์›จ์–ด์  ์ ‘๊ทผ์‚ฌํ•ญ์— ๋Œ€ํ•œ API, ํฐ์˜ ์„ผ์„œ๋‚˜ ๊ธฐ๋ณธ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ๋ถ„์•ผ์— ๋Œ€ํ•ด์„œ ํ†ตํ•ฉ๋œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค.

3. ๊ฒฝ์Ÿ์ƒ๋Œ€[ํŽธ์ง‘]

  • Flutter(ํ”„๋ ˆ์ž„์›Œํฌ) - ๊ตฌ๊ธ€์ด ๋ฐ€์–ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ. ๋„ค์ดํ‹ฐ๋ธŒ ๋ณ€ํ™˜ ์—†์ด ๋ณ„๋„์˜ ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ UI๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ์  ๋ณ€๊ฒฝ์ด๋‚˜[5] ํผํฌ๋จผ์Šค ๋ฌธ์ œ์—์„œ ์ž์œ ๋กญ๋‹ค๋Š”๊ฑธ[6] ๊ฐ•์ ์œผ๋กœ ๋ฐ€์–ด์ฃผ๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋•Œ๋ฌธ์ธ์ง€ ์ž๋งˆ๋ฆฐ ์ชฝ์—์„œ ํ”Œ๋Ÿฌํ„ฐ์˜ ๋ Œ๋”๋ง ๋ Œ์ง„์ธ ์Šคํ‚ค์•„๋ฅผ ์ž๋งˆ๋ฆฐ ํ™˜๊ฒฝ์—์„œ ์“ฐ๊ฒŒ ํ•ด์ฃผ๋Š” SkiaSharp๊ฐ€ ๋‚˜์˜ค๊ธฐ๋„ ํ–ˆ๋‹ค. 2020๋…„9์›”ํ˜„์žฌ Xamarin/MAUI๋Š” Flutter๋ฅผ ๋น„๋กฏํ•˜์—ฌ react native์—๋„ ๋ฐ€๋ฆฌ๊ณ  ionic์—๋„ ๋ฐ€๋ ค ํฌ๋กœ์Šคํ”Œ๋žซํผ ํ”„๋ž˜๋ฆผ์›Œํฌ ์‹œ์žฅ์—์„œ ์‹œ์žฅ์ ์œ ์œจ์ด ๋ฐ”๋‹ฅ์„ ๊ธฐ๊ณ  ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.

4. ์™ธ๋ถ€ ๋งํฌ[ํŽธ์ง‘]

[1] ๋ฌผ๋ก  ์ด๋ฌธ์ œ๋Š” ์ž๋งˆ๋ฆฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”Œ๋Ÿฌํ„ฐ๋“ฑ์˜ ๋‹ค๋ฅธ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋‹ค ํ•ด๋‹น๋˜๋Š” ๋ฌธ์ œ๋‹ค. ๊ฐ™์€ ํฌ๋กœ์Šคํ”Œ๋žซํผ ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋ฆฌ ๋น„๊ตํ•˜๋ฉด ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ๋” ์ž‘์€ ์ž๋งˆ๋ฆฐ์ด ์ข€๋” ์ž‘๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋ฌผ๋ก  ํฐ ์ฐจ์ด๋Š” ์•„๋‹ˆ๋‹ค.
[2] ๋ฌผ๋ก  ์ด๊ฑด ๊ตญ๋‚ด ํ•œ์ •์ด๊ณ  ์‹ค์ œ๋กœ๋Š” ์ž๋งˆ๋ฆฐ์ด ํฌ๋กœ์Šคํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ์ค‘ ์ผ์ฐ ๋‚˜์˜จ ํŽธ์— ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐœ๋ฐœ ํ”Œ๋žซํผ ๋น„ํ•ด ๋งŽ๋‹ค๊ณ  ํ‰๊ฐ€๋œ๋‹ค.
[3] ์ถœ์‹œ๋˜์—ˆ๋‹ค.
[4] css์˜ flexbox์™€ ์œ ์‚ฌํ•˜๋‹ค.
[5] ์ž๋งˆ๋ฆฐ ๋„ค์ดํ‹ฐ๋ธŒ๋‚˜ ์ž๋งˆ๋ฆฐ ํผ์ฆˆ๋Š” ํ•ด๋‹น ํ”Œ๋žซํผ์— ๋งž์ถฐ์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ์ ์œผ๋กœ UI๊ด€๋ จ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ฐ”๋€”๊ฒฝ์šฐ ๊ฐ™์ด ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ณด๊ณ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค.
[6] ํผํฌ๋จผ์Šค์ ์ธ ๋ฉด์—์„œ ๊ฑฐ์˜ ๋น„์Šทํ•˜๊ธด ํ•˜์ง€๋งŒ ํ”Œ๋Ÿฌํ„ฐ์ชฝ์ด ํ—ค๋น„ํ•œ UIํ™˜๊ฒฝ์—์„œ ๋”์šฑ ๊ฐ•ํ•œ ๋ชจ์Šต์„ ๋ณด์—ฌ์ค€๋‹ค๊ณ  ํ‰๊ฐ€๋œ๋‹ค#