Xamarin은 2011년에 발표된 C#으로 모바일 애플리케이션을 만들기 위한 Microsoft의 플랫폼입니다. Microsoft Xamarin Documentation, 2024에 따르면, Xamarin은 C#과 .NET의 공유 코드베이스를 사용하여 iOS, Android 및 Windows용 애플리케이션을 작성할 수 있으며, Mono Runtime을 사용하여 네이티브 코드로 컴파일합니다. 2024년부터 Xamarin.Forms는 .NET MAUI로 대체되었습니다.
핵심 포인트
Xamarin은 .NET과 Mono를 기반으로 하는 플랫폼으로, 크로스 플랫폼 모바일 애플리케이션을 만들기 위해 C#을 사용할 수 있습니다. Xamarin 회사는 2011년에 설립되었으며 2016년에 Microsoft가 4억 달러에 인수했습니다. 인수 후 Xamarin은 Visual Studio 및 Azure 생태계의 일부가 되었습니다.
인수 전 Xamarin은 Enterprise 라이선스가 있는 상용 제품이었습니다. Microsoft는 Visual Studio Community의 일부로 무료로 제공했으며 Mono Runtime 및 SDK 바인딩의 소스 코드도 오픈소스화했습니다. 이로 인해 인기가 급상승하여 SlashData 보고서에 따르면 2020년까지 크로스 플랫폼 프로젝트의 15%에서 Xamarin이 사용되었습니다.
Xamarin의 주요 아이디어는 코드를 세 가지 계층으로 나누는 것입니다: 공유 비즈니스 로직(C#, .NET Standard), 플랫폼별 프로젝트(iOS, Android), 그리고 Xamarin.Forms를 통한 선택적 공유 UI. 이 접근 방식은 각 플랫폼의 API에 네이티브 액세스를 유지하면서 최대 75%의 코드를 재사용할 수 있게 했습니다.
첫 번째 버전 Xamarin 1.0은 2012년에 iOS만 지원하며 출시되었습니다. Android 지원은 2013년에 추가되었습니다. 선언형 UI 프레임워크인 Xamarin.Forms는 2014년 Evolve 컨퍼런스에서 발표되었습니다. Xamarin 4.0(2016)에는 watchOS 및 tvOS 지원이 포함되었습니다. Xamarin 5.0(2019)은 CSS 스타일과 Material Design 테마를 도입했습니다.
최신 메이저 버전 Xamarin.Forms 5.0은 2021년에 출시되었습니다. Microsoft는 Xamarin이 지원 모드로 전환된다고 발표했으며(수명 종료: 2024년 5월 1일), .NET 6+의 일부인 .NET MAUI(Multi-platform App UI)로 마이그레이션을 권장했습니다. Xamarin.Forms 5.0은 더 이상 새로운 기능을 받지 않으며 중요한 보안 수정만 받습니다.
Xamarin.Forms는 통합된 구성 요소 집합을 통해 인터페이스를 추상화하는 UI 프레임워크입니다. XAML 마크업(ContentPage, StackLayout, Label, Button)은 렌더러를 통해 각 플랫폼의 네이티브 컨트롤에 매핑됩니다. Label은 iOS에서 UILabel로, Android에서 TextView로 변환됩니다. 이 접근 방식은 최대 95%의 공유 UI 코드를 제공합니다.
Xamarin.Native(Xamarin.iOS 및 Xamarin.Android라고도 함)는 공유 UI가 없는 접근 방식입니다. 개발자는 단일 C# 백엔드를 사용하여 iOS(Interface Builder 또는 Storyboard) 및 Android(AXML)용 개별 화면을 만듭니다. 이는 각 플랫폼의 모양을 완전히 제어할 수 있지만 UI 코드 중복이 50~60%로 증가합니다.
Microsoft Developer Survey 2023에 따르면 Xamarin 프로젝트의 70%가 Xamarin.Forms를 사용했고, 20%가 공유 서비스를 사용하는 Xamarin.Native를 사용했으며, 10%가 플랫폼별 최적화를 위한 사용자 지정 렌더러를 사용하는 하이브리드 방식을 사용했습니다.
Xamarin 아키텍처는 두 가지 수준으로 구성됩니다. 하위 수준은 Mono Runtime으로, 플랫폼에서 C# IL(Intermediate Language)을 실행합니다. 상위 수준은 iOS용 Managed Callable Wrappers(MCW)와 Android용 Android Bindings로 구성되며, 관리되는 C# 코드에서 네이티브 API에 액세스할 수 있도록 합니다.
Mono는 .NET Framework의 오픈소스 구현입니다. Xamarin에서 Mono는 CLR(Common Language Runtime)로 작동하여 C# 어셈블리를 로드하고 머신 코드로 컴파일합니다. iOS에서 Mono는 AOT(Ahead-of-Time) 컴파일을 수행하여 ARM64 머신 코드로 컴파일합니다. Apple이 사용자 애플리케이션에서 JIT 컴파일을 금지하기 때문입니다. Android에서 Mono는 AOT 프로파일링을 사용한 JIT 컴파일을 사용합니다.
iOS 바인딩(Xamarin.iOS)은 Objective-C 런타임 위의 C# 래퍼입니다. 각 UIKit 클래스(UIView, UIViewController)는 Xamarin.iOS.dll 어셈블리의 관리되는 클래스로 표현됩니다. Objective-C 셀렉터는 MessageUI 메커니즘을 통해 호출됩니다. Android에서 Xamarin.Android는 Android Callable Wrappers(ACW) — C#과 Java/Kotlin 사이의 JNI 브리지를 사용합니다. Kotlin 라이브러리는 Android Bindings Library를 통해 래핑됩니다.
XAML(eXtensible Application Markup Language)은 UI를 설명하기 위한 선언형 언어입니다. Xamarin.Forms에서 XAML은 화면 구조를 정의합니다: 페이지(ContentPage), 컨테이너(StackLayout, Grid, FlexLayout) 및 요소(Label, Entry, Button, ListView). C#의 코드 비하인드는 이벤트(Clicked, PropertyChanged)를 처리하고 데이터 바인딩(Binding, Data Binding)을 관리합니다.
MVVM 패턴은 Xamarin.Forms에 권장되는 아키텍처입니다. Model은 데이터를 포함하고, ViewModel은 INotifyPropertyChanged와 명령(ICommand)을 구현하며, View(XAML)는 BindingContext를 통해 바인딩됩니다. RelayCommand 또는 Prism DelegateCommand를 통한 ICommand 구현은 UI 종속성 없이 ViewModel을 테스트할 수 있게 합니다. Prism.Forms 라이브러리는 NavigationService, DialogService 및 모듈성을 제공합니다.
using Xamarin.Forms;
namespace XamarinApp
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
var label = new Label
{
Text = "Hello, Xamarin!",
FontSize = 24,
VerticalOptions = LayoutOptions.Center,
HorizontalOptions = LayoutOptions.Center
};
Content = new StackLayout
{
Children = { label }
};
}
}
}
통합된 C# 언어 — Xamarin의 주요 장점입니다. C# 및 .NET 개발자는 Swift, Kotlin 또는 Objective-C를 배우지 않고도 모바일 애플리케이션을 만들 수 있습니다. 비즈니스 로직, 네트워킹, 데이터베이스(ORM을 통한 SQLite), 암호화 및 로깅은 한 번 작성되어 모든 플랫폼에서 재사용됩니다. 이는 코드 유지 관리 및 테스트를 간소화합니다.
네이티브 API 액세스 — Xamarin은 바인딩을 통해 iOS(Cocoa Touch) 및 Android(Android SDK) API에 100% 액세스할 수 있습니다. 새 버전의 iOS 또는 Android가 출시되면 Microsoft는 24~48시간 이내에 업데이트된 바인딩을 게시합니다. 누락된 바인딩(사용자 지정 Objective-C 또는 Kotlin 라이브러리)의 경우 Android Bindings Library 또는 iOS Binding Library를 수동으로 만듭니다.
Microsoft 생태계와의 통합 — Xamarin은 Visual Studio, Azure DevOps, App Center(CI/CD, 테스트, 모니터링) 및 Enterprise Mobility + Security(Intune, ADAL, MSAL)를 지원합니다. App Center Analytics 및 Crashes는 라이브 애플리케이션에서 데이터를 수집합니다. Visual Studio App Center는 빌드, 기기 테스트 및 앱 스토어 게시를 자동화합니다.
단점으로는 애플리케이션 크기가 있습니다. 빈 화면의 Xamarin.Forms APK는 25~35MB인 반면 네이티브 Android 앱은 5~8MB입니다. 컴파일 시간도 더 깁니다. 중간 규모 프로젝트는 2~5분이 걸리는 반면 네이티브 Android Studio에서는 30~60초가 걸립니다. Mono Runtime은 최종 바이너리에 15~20MB를 추가합니다.
두 번째 단점은 새로운 API 지연입니다. 새로운 iOS/Android 기능은 네이티브 개발에서 즉시 나타나지만 Xamarin에서는 바인딩 출시 후 1~2개월 후에 도착합니다. iOS 17 SDK(2023)는 출시 후 3주 만에 Xamarin에서 완전히 지원되었습니다. 긴급 프로젝트의 경우 이것이 중요할 수 있습니다. .NET MAUI는 .NET 8과의 직접적인 통합을 통해 이 문제를 해결합니다.
| 기준 | Xamarin | .NET MAUI |
|---|---|---|
| 플랫폼 | iOS, Android, Windows | iOS, Android, Windows, macOS, Tizen |
| 기본 프레임워크 | Mono + .NET Standard | .NET 6+(통합 BCL) |
| UI 프레임워크 | Xamarin.Forms | .NET MAUI(후속) |
| 지원 상태 | 2024년 5월 1일부터 수명 종료 | Microsoft의 활발한 개발 |
| Hot Reload | 제한적 | XAML Hot Reload + C# Reload |
.NET MAUI(Multi-platform App UI)는 Xamarin.Forms의 진화된 버전으로, Microsoft가 2022년 .NET 6과 함께 출시했습니다. MAUI는 iOS, Android, Windows 및 macOS를 단일 프로젝트로 통합하여 각 플랫폼에 대한 별도의 프로젝트가 필요하지 않습니다. Xamarin.Forms와 달리 MAUI는 Mono와 .NET Standard 대신 .NET 6+ BCL을 사용합니다.
Microsoft는 마이그레이션 도구 — Visual Studio용 .NET Upgrade Assistant를 제공합니다. 이 도구는 Xamarin.Forms 프로젝트를 분석하고, 네임스페이스를 교체하며(Xamarin.Forms.* -> Microsoft.Maui.*), .csproj 파일을 업데이트하고(SDK 스타일 형식), Android 및 iOS 설정을 통합 구성으로 마이그레이션합니다. 마이그레이션 후 프로젝트는 Native AOT, 보안을 위한 CodeQL, 향상된 빌드 성능 등 .NET 8의 모든 새로운 기능을 활용할 수 있습니다.
핵심 변경 사항은 단일 프로젝트입니다. Xamarin.Forms에 3개의 개별 프로젝트(iOS, Android, .NET Standard)가 필요했던 반면, .NET MAUI는 Platforms/iOS, Platforms/Android, Platforms/Windows 및 Platforms/MacCatalyst 폴더가 있는 하나의 프로젝트를 사용합니다. 각 플랫폼은 플랫폼별 조건부 지시문(#if ANDROID, #if IOS)을 사용하여 공유 코드에서 컴파일됩니다.
기존 코드베이스의 경우 .NET MAUI는 Xamarin.Forms와 90%의 이전 버전 호환성을 유지합니다. API 호환성은 ContentView, ContentPage, Shell, NavigationPage, DependencyService 및 MessagingCenter를 다룹니다. 주요 변경 사항은 Device.StartTimer(IDispatcher로 대체), Platform API(Microsoft.Maui.ApplicationModel으로 이동) 및 지원 중단된 렌더러(Handlers로 대체)에 영향을 미쳤습니다.
마이그레이션 프로세스는 5단계로 구성됩니다. 첫째 — Xamarin.Forms를 최신 버전 5.0으로 업데이트합니다. 둘째 — .NET Standard 2.0을 .NET 6 또는 8로 교체합니다. 셋째 — 자동 프로젝트 변환을 위해 Upgrade Assistant를 실행합니다. 넷째 — Platforms 폴더에서 플랫폼별 코드를 수정합니다. 다섯째 — 특히 사용자 지정 렌더러와 플랫폼 서비스를 테스트합니다.
자주 묻는 질문
Xamarin은 iOS, Android 및 Windows용 C# 개발을 위한 Microsoft의 모바일 플랫폼입니다. 공유 코드 컴파일에 Mono Runtime을 사용하며 Xamarin.Forms(XAML을 통한 통합 UI)와 Xamarin.Native(플랫폼 네이티브 화면)의 두 가지 접근 방식을 제공합니다. 2024년부터 Xamarin은 지원 모드에 있습니다.
Xamarin은 C#과 .NET을 사용하며 바인딩을 통해 네이티브 컨트롤(UIKit, View)로 렌더링합니다. Flutter는 Dart와 자체 렌더링 엔진(Impeller)을 사용하며 네이티브 UI 구성 요소에 의존하지 않습니다. Flutter는 모든 플랫폼에서 일관된 모양을 제공하는 반면 Xamarin은 각 OS의 네이티브 모양을 제공합니다. Flutter는 Google의 지원을 받으며 Xamarin의 15%에 비해 46%의 점유율을 보유하고 있습니다.
아니요. Microsoft는 2024년 5월 1일에 Xamarin 지원을 종료했습니다. 모든 새 프로젝트는 .NET 8에 내장되어 있고 .NET 플랫폼과 함께 업데이트를 받는 후속 제품인 .NET MAUI로 시작해야 합니다. 기존 Xamarin.Forms 프로젝트의 경우 12~18개월 이내에 마이그레이션하는 것이 좋습니다.
일반 애플리케이션의 경우 차이는 무시할 만합니다. Xamarin.Forms는 Managed-Wrapper-Native 계층으로 인해 5~10%의 렌더링 오버헤드가 추가됩니다. 무거운 목록(ListView 대 RecyclerView) 및 애니메이션(플랫폼 API 없이 Xamarin.Forms 사용)에서 문제가 발생합니다. CollectionView(ListView 대체) 및 네이티브 애니메이션을 사용하는 것이 좋습니다.
네, Android Bindings Library를 통해 가능합니다. 이 .NET 프로젝트 유형은 AAR 또는 JAR 아카이브를 자동 클래스 및 메서드 생성과 함께 C# 바인딩으로 래핑합니다. Kotlin 라이브러리는 코루틴 및 봉인된 클래스를 위한 추가 핸들러가 필요하며 Binding Library의 Metadata.xml을 통해 구성됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.