본문 바로가기

프로그래밍&IT/기타

MAUI 관심있어서 유료강의를 신청했다.

사실은 WPF를 공부하다가 우연히 MAUI 라는것도 보게되었다.

이것도 나온지 몇년된 기술인데 생업과 c# 윈폼 (winform)에만 빠져있다보니

뒤늦게 보게 되었다.

 

이전에 유니버설 앱인가 그리고 자마린 (Xamarin)까지는 대충 알고있었는데

내가 MS의 기술로 먹고 사는데 기술 트렌드에 관심을 좀 적게 둔것같다.

WPF가 거의 망한 (그나마 한국에선 좀 프로젝트가 있던데...) 케이스라고 들었는데

그 기술로 또 다른걸 만들어낸듯?

 

MAUI의 full name은  Multi platform App UI 의 약자다.

폴리네이사의 영웅 이름으로 맞춘것같긴한데.. 여튼

(디즈니 애니메이션 영화 중 "모아나"에서 들어봤다..)

 

 

이것말고도 멀티플랫폼 기술이 몇 개 더 있는걸로 아는데

한 번 이 기술에 대해서 공부하기로 궁금한것을 챗GPT에도 관련된 정보를 알아봤다.

 

목차

  • 안드로이드, iOS 네이비트와 React Native랑과의 차이
  • MAUI에서 개발한 소스를 가지고 native 성능을 낼 수 있는 방법은 있는가

 

질문사항 :   안드로이드, iOS 네이티브와  React Native랑과의 차이

 

MAUI로 개발된 앱과 iOS 네이티브, React Native와의 성능 차이는 여러 요인에 의해 결정됩니다. 각 플랫폼의 특성과 기술적인 차이를 고려하면, 전반적인 성능과 최적화는 다음과 같이 요약할 수 있습니다.

1. MAUI vs. iOS 네이티브 성능 차이

MAUI 성능

  • MAUI (Multi-platform App UI)는 C#과 .NET을 기반으로 하는 크로스 플랫폼 프레임워크로, 네이티브 코드를 직접 사용하지 않고 네이티브 API에 접근하는 중간 레이어를 사용합니다.
  • UI와 로직이 공유 가능하다는 장점이 있지만, 완전한 네이티브 성능과는 차이가 있을 수 있습니다.
  • 기본 성능은 네이티브 앱보다 느릴 수 있으나, C#의 최적화된 성능 덕분에 많은 경우 실사용에서 큰 차이는 없을 수 있습니다.
  • 렌더링 속도메모리 사용량은 네이티브 앱에 비해 다소 낮을 수 있지만, 대부분의 애플리케이션에서 문제가 되지는 않을 것입니다

-> 내가 기술자를 넘어서 사업을 한다면 이런 멀티플랫폼 기술이 내게 꼭 필요할수도 있을것같다.

한 개의 소스를 만들어서 여러 플랫폼에 돌릴수있다면...

iOS 네이티브 성능

  • iOS 네이티브 앱은 Objective-C 또는 Swift로 개발되며, 이 언어들은 iOS의 코어에 직접적으로 작동하는 완전한 네이티브 환경을 제공합니다.
  • 그래픽 렌더링메모리 관리 측면에서 가장 높은 성능을 기대할 수 있습니다.
  • 특히, 복잡한 애니메이션, 하드웨어 접근성, 멀티미디어 처리와 같은 고성능이 필요한 작업에서 확실히 우월합니다.

결론

  • MAUI 앱은 다중 플랫폼 개발의 장점과 생산성 향상을 제공하지만, 성능 최적화가 핵심인 복잡한 앱에서는 iOS 네이티브가 여전히 더 빠르고 안정적입니다.
  • 일반적인 비즈니스 앱이나 단순 UI 앱에서는 MAUI가 충분한 성능을 제공할 수 있습니다.

2. MAUI vs. React Native 성능 차이

MAUI 성능

  • MAUI는 .NET 및 C# 언어 기반으로 동작하며, 네이티브 API에 네이티브 인터페이스를 통해 접근합니다.
  • .NET이 제공하는 성능 최적화 도구와 JIT (Just-In-Time) 컴파일 혹은 AOT (Ahead-Of-Time) 컴파일 방식이 사용되어 성능이 비교적 좋습니다.
  • 하지만 UI는 네이티브 렌더링을 사용하지만, 중간에 C#에서 네이티브로 전환하는 오버헤드가 있을 수 있습니다.

React Native 성능

  • React NativeJavaScript를 사용하여 UI를 구성하고, React 라이브러리를 통해 네이티브 컴포넌트를 호출하는 방식입니다.
  • React Native는 JavaScript Bridge를 사용하여 네이티브 API와 통신하므로, 특히 복잡한 UI 렌더링이나 애니메이션에서 성능이 떨어질 수 있습니다.
  • 성능 개선을 위해 JIT 컴파일을 사용하지만, JavaScript Bridge는 종종 오버헤드로 작용할 수 있습니다. 특히, 대량의 데이터나 고성능이 요구되는 작업에서는 JavaScript 쓰레드네이티브 쓰레드 간의 통신 지연이 발생할 수 있습니다.
  • React Native에서 네이티브 모듈을 작성하여 성능을 최적화할 수는 있지만, 이것은 네이티브 개발 지식이 필요합니다.

결론

  • MAUI는 C#과 .NET의 성능 덕분에, React Native에 비해 일반적으로 더 나은 성능을 제공합니다. 특히 고성능 네이티브 API 호출에서 효율적입니다.
  • React Native는 빠른 개발 사이클과 광범위한 JavaScript 생태계를 제공하지만, 복잡한 UI와 데이터 집약적 작업에서는 MAUI가 성능 면에서 우위를 가질 수 있습니다.
  • 단순하고 빠른 프로토타이핑 및 개발이 필요한 경우 React Native가 유리할 수 있지만, 성능 중심 앱에서는 MAUI가 더 나은 선택일 가능성이 큽니다.

3. MAUI vs. React Native vs. iOS 네이티브 요약

기준 MAUI - React Native - iOS 네이티브

개발 언어 C#, .NET JavaScript Swift, Objective-C
UI 렌더링 네이티브 UI 렌더링 네이티브 UI 렌더링 네이티브 UI
성능 중간 (C#의 높은 성능) 중간 (JavaScript Bridge 오버헤드) 매우 높음
빌드 및 컴파일 방식 JIT, AOT 지원 JIT 네이티브 컴파일
개발 속도 중간 (C# 기반 생산성) 빠름 (JavaScript 기반) 느림 (네이티브 개발)
생태계 및 라이브러리 .NET 에코시스템 JavaScript 및 NPM 생태계 iOS 전용 API 및 프레임워크
코드 재사용성 매우 높음 (멀티플랫폼) 매우 높음 (멀티플랫폼) 낮음 (iOS 전용)
  • MAUI: 다중 플랫폼 개발에 유리하고, 성능도 안정적이지만, 네이티브보다는 낮을 수 있음.
  • React Native: 빠른 개발과 JavaScript 생태계에 강점이 있지만, 복잡한 작업에서는 성능 문제가 발생할 수 있음.
  • iOS 네이티브: 최고의 성능을 제공하지만, 단일 플랫폼에만 한정되며 개발 생산성이 다소 낮을 수 있음.

결론적으로, 개발 환경과 앱의 특성에 따라 선택지가 달라질 수 있습니다. 비즈니스 로직이 중요하고 성능 타협이 가능한 다중 플랫폼 앱이라면 MAUI나 React Native가 유리하지만, 최고의 성능이 필요한 경우에는 네이티브 개발이 최선입니다.

 

그러면 또 궁금해졌다.

예전에 플러터 그리고 이번에 MAUI를 가지고도 약간 놀아봤지만 iOS나 안드로이드 관련된 소스도 생성되는걸로 알고있는데

여기서 나온 소스를 가지고 Native와 동등하거나 버금가도록 만들 수가 있는지?

 

MAUI에서 개발한 소스를 가지고 native 성능을 낼 수 있는 방법은 있는가

MAUI에서 개발한 앱 소스를 기반으로 네이티브 성능에 가까운 성능을 내는 방법은 몇 가지 최적화 기법과 네이티브 API 활용을 통해 가능합니다.

MAUI는 기본적으로 크로스 플랫폼 프레임워크로, 성능 측면에서는 네이티브에 비해 다소 떨어질 수 있지만, 특정 기술을 사용하면 네이티브에 근접한 성능을 달성할 수 있습니다. 아래에 이러한 방법들을 정리했습니다:

1. AOT (Ahead-of-Time) 컴파일 사용

  • MAUI에서 AOT 컴파일을 사용하면, JIT(Just-In-Time) 대신 미리 코드를 컴파일하여 실행 시 성능을 향상시킬 수 있습니다. AOT 컴파일은 코드를 런타임에 컴파일하지 않고 미리 기계어로 변환하여 실행 속도를 빠르게 합니다.
  • AOT 컴파일을 활성화하려면 Android와 iOS 각각에 맞는 설정을 해야 하며, 네이티브 코드와 가까운 실행 성능을 기대할 수 있습니다.

AOT 설정 방법 (iOS):

<PropertyGroup> <RunAOTCompilation>true</RunAOTCompilation> </PropertyGroup>

AOT 설정 방법 (Android):

<PropertyGroup> <AndroidUseAOT>true</AndroidUseAOT> </PropertyGroup>

2. .NET MAUI에 네이티브 코드 통합 (Native Interop)

  • 네이티브 코드와 상호 운용성을 통해 성능이 중요한 부분은 iOS 또는 Android 네이티브 코드를 직접 작성하여 성능을 극대화할 수 있습니다. Xamarin과 동일하게 MAUI에서도 네이티브 API를 호출할 수 있으며, 이는 특정 성능 문제가 있는 부분에서 매우 유용합니다.
  • iOS의 경우 Objective-C 또는 Swift로, Android의 경우 Java나 Kotlin으로 필요한 부분을 네이티브 코드로 작성하고, 이를 MAUI와 통합하여 호출하는 방식입니다.

iOS 네이티브 코드 호출 예시:

[DllImport("__Internal")] private static extern void NativeMethod();

Android 네이티브 코드 호출 예시:

using (var nativeObject = new AndroidJavaObject("com.example.NativeClass")) { nativeObject.Call("NativeMethod"); }

3. 특정 플랫폼에 최적화된 렌더링 사용

  • Custom Renderers를 사용하면 각 플랫폼에 맞는 네이티브 UI 요소를 커스터마이징하여 더 나은 성능을 낼 수 있습니다. MAUI는 기본적으로 네이티브 렌더링을 사용하지만, 성능이 중요한 UI 컴포넌트의 경우 직접 네이티브 UI 코드를 작성하여 최적화할 수 있습니다.
  • 이를 통해 성능이 중요한 UI 요소를 네이티브에 가깝게 만들어 렌더링 성능을 향상시킬 수 있습니다.

iOS에서 Custom Renderer 작성 예시:

[assembly: ExportRenderer(typeof(MyCustomControl), typeof(MyiOSCustomRenderer))] namespace MyApp.iOS { public class MyiOSCustomRenderer : ViewRenderer<MyCustomControl, UIView> { protected override void OnElementChanged(ElementChangedEventArgs<MyCustomControl> e) { base.OnElementChanged(e); // 네이티브 최적화 코드 작성 } } }
 

Android에서 Custom Renderer 작성 예시:

[assembly: ExportRenderer(typeof(MyCustomControl), typeof(MyAndroidCustomRenderer))] namespace MyApp.Droid { public class MyAndroidCustomRenderer : ViewRenderer<MyCustomControl, Android.Views.View> { protected override void OnElementChanged(ElementChangedEventArgs<MyCustomControl> e) { base.OnElementChanged(e); // 네이티브 최적화 코드 작성 } } }

4. 자원 사용 최적화

  • 메모리 관리쓰레드 관리를 최적화하여 앱의 성능을 크게 개선할 수 있습니다. .NET에서 기본 제공되는 메모리 관리 메커니즘은 자동으로 수행되지만, 성능 문제가 발생하는 경우 메모리 릭(leak)을 방지하고 GC (Garbage Collection)의 과도한 호출을 줄이는 최적화 기법을 사용할 수 있습니다.
  • 예를 들어, 대용량 데이터를 처리하는 경우 ValueTask나 Span<T> 등의 고성능 메모리 관리 도구를 사용하여 불필요한 메모리 복사를 줄일 수 있습니다.

5. XAML 최적화 및 뷰 구조 단순화

  • XAML 성능 최적화는 UI의 복잡성을 줄이고 불필요한 레이아웃 계층을 최소화하는 것이 핵심입니다. 불필요한 중첩된 레이아웃을 사용하지 않고, 필요한 UI 요소만 렌더링하도록 뷰 구조를 단순화하면 성능이 개선될 수 있습니다.
  • VisualElement.MeasureInvalidateMeasure와 같은 메서드를 남발하지 않고 적절하게 사용하여 성능 최적화를 도모할 수 있습니다.

6. 동적 데이터 로딩 최적화

  • 앱에서 많은 데이터를 한 번에 로드하는 대신, 비동기적 데이터 로딩을 사용하여 UI 성능에 미치는 영향을 최소화할 수 있습니다. async/await 패턴을 사용하여 백그라운드에서 데이터를 로드하고, UI는 부드럽게 작동하도록 합니다.
  • 특히 리스트나 테이블 같은 UI 요소에서 가상화(Virtualization)를 사용하면 성능을 크게 향상시킬 수 있습니다. 이는 스크롤할 때 필요한 데이터만 로드하고, 나머지는 백그라운드에서 처리되도록 합니다.

7. GPU 가속 활용

  • GraphicsView나 MAUI에서 제공하는 GPU 가속 기능을 활용하면 그래픽 처리 성능을 높일 수 있습니다. 애니메이션이나 복잡한 그래픽 처리 작업을 네이티브 렌더링으로 대체하거나, GPU 가속을 지원하는 그래픽 엔진을 사용할 수 있습니다.

8. 프로파일링 및 성능 분석 도구 사용

  • Visual Studio에서 제공하는 프로파일링 도구디버깅 툴을 사용하여 앱의 성능 병목을 찾아 최적화할 수 있습니다. 메모리 사용량, CPU 소비, 네트워크 요청 등을 분석하여 성능 문제를 식별하고 해결할 수 있습니다.
  • Xamarin Profiler 또는 .NET Profiler 같은 도구를 활용하여 성능 문제를 추적하고, 필요할 경우 네이티브 코드로 일부 기능을 대체할 수 있습니다.

결론

  • 네이티브 성능에 가까워지기 위해서는 MAUI의 AOT 컴파일, 네이티브 API 직접 호출, Custom Renderer 작성, UI 및 메모리 최적화와 같은 다양한 기법을 사용할 수 있습니다.
  • MAUI의 크로스 플랫폼 장점을 유지하면서도 성능이 중요한 부분에서는 네이티브 코드를 통합하거나 특정 플랫폼에 맞게 최적화하는 방법을 통해 네이티브 성능에 근접하게 만들 수 있습니다.

IT 기술 변화는 내 능력으로는 못 따라잡지못할것같다...