! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

2021년 WPF 모범 사례 > 인사이트

본문 바로가기

MESCIUS 커뮤니티

인사이트

IT&개발 정보 2021년 WPF 모범 사례

페이지 정보

작성자 GrapeCity 작성일 2021-12-31 11:16 조회 3,762회 댓글 2건

본문

오늘날에는 보건의료부터 회계 및 교육에 이르기까지 거의 모든 조직이 자체 웹사이트를 갖고 있습니다. 우리가 배우고 일하며 공유하는 방식은 웹사이트와 아주 깊이 연관되어 있기 때문에 웹 개발이 데스크톱 개발을 완전히 앞질렀다고 생각할 수도 있습니다.


하지만 웹사이트의 인기가 아무리 높다고 해도 개발자는 여전히 해마다 수많은 데스크톱 응용 프로그램을 만듭니다. 이는 데스크톱 개발 산업이 아직 활발하게 유지되고 있음을 입증하는 것입니다. 많은 전문 조직, 다국적 기업, 심지어 일반 사용자까지도 원하는 작업을 수행하기 위해 아직도 데스크톱 소프트웨어에 의존하고 있습니다.


개발자는 전통적으로 WinForms(Windows Forms)를 사용하여 Windows 응용 프로그램을 만들었습니다. 하지만 세분화된 현대 응용 프로그램을 구축하기에는 WinForms에 한계가 있습니다. WPF(Windows Presentation Foundation)는 이러한 한계를 극복하고 추가 기능을 제공하려는 의도로 만들어졌습니다.


데스크톱 개발 업계에서 15년 이상의 역사를 가진 WPF는 발전과 진보를 거듭하면서 모범 사례를 축적했습니다. WPF에 대한 최신 정보를 확인하면서 현재 상황은 어떤지 자세히 알 수 있도록 하기 위해, 이 문서에서는 2021년 현재와 그 이후까지 도움이 될 WPF 개발자를 위한 다양한 모범 사례를 살펴보겠습니다.



모범 사례


이 섹션에서는 데스크톱 개발자가 WPF로 작업할 때 구현할 수 있는 중요한 모범 사례 몇 가지에 대해 논의합니다.


.NET 5+로 이동


.NET 5+를 지원하는 것은 Microsoft .NET뿐이므로 Microsoft .NET 5+는 발전을 위한 공식적인 방법입니다. 이것은 유연한 배포, 강력한 성능 그리고 현대적인 데스크톱 응용 프로그램 구축 방법을 제공합니다. .NET 5+는 이전 .NET 프레임워크의 두 배에 가까운 성능을 제공합니다.


또한 .NET 6을 도입함으로써 C# 10을 이용하여 보다 효율적이고 간결한 코드를 작성할 수 있습니다. .NET 5+를 기반으로 구축된 WPF 응용 프로그램은 기본적으로 Windows on Arm 장치에서도 실행할 수 있습니다. 따라서 부분적으로는 WPF 응용 프로그램을 개발할 때 한 번 작성하면 어디에든 배포할 수 있습니다.


응용 프로그램이 현재 .NET 5에 없는 경우에는 업그레이드 도우미를 사용하여 WPF 앱을 쉽게 업그레이드할 수 있습니다. 이 업데이트는 향상된 성능과 효율이라는 장점을 제공합니다.


Async 및 Await 지원


Async 및 Await는 Task Parallel Library에 있으며 WPF에서 제대로 작동합니다. Run, ContinueWith, Invoke 등과 같은 이전 함수가 마음에 들지 않는다면 Async 및 Await 함수를 좋아하게 될 것입니다. 이러한 기능은 이해하기가 더 쉽기 때문에 삶을 더욱 단순하게 만들어 줍니다. 작업을 대기(Await)할 때는 현재 작업이 완료될 때까지 다음 코드 줄이 실행되지 않습니다. WPF에서는 WPF 이벤트용 비동기 메서드 처리기를 버튼 클릭처럼 사용할 수 있습니다.


Async 및 Await를 사용하여 이전 함수를 쉽게 대체하는 방법에 대해 알아보겠습니다. 다음은 작업이 완료될 때까지 스레드를 일시 중지하는 이전 방법을 보여주는 코드입니다.

private void buttonClick(object s, RoutedEventArgs e)  
{  
button.IsEnabled = false;  
button.Text = "Starting task";  
​
var task = Task.Run(() =>  
{  
Thread.Sleep(1000<a name="_Int_Pskp4/89">); /</a>/ making task sleep for 1 Second  
});  
​
task.ContinueWith((t) => // executed after 1 Second of sleep  
{  
Dispatcher.Invoke(() => // Dispatcher consist queued items  
{  
button.IsEnabled = true;  
button.Text = "Completed task";  
});  
});  
}  



이제 다음 코드를 비교해 보세요.

 Async 및 Await를 사용하여 코드를 간소화하고 더 읽기 쉽게 만들었습니다.

private async void buttonClick(object s, RoutedEventArgs e)  
{  
button.IsEnabled = false;  
button.Text = "Starting task";  
​
var result = await Task.Run(() => // awaiting the task  
{  
Thread.Sleep(1000); e  
return "Completed long task";  
});  
​
button.IsEnabled = true;  
button.Text = result;  
}  


보이는 대로, 첫 단계에서는 함수의 액세스 한정자 바로 뒤에 async 키워드를 넣어야 합니다. async 함수는 await를 호출할 수 있는 유일한 함수이므로 사용하지 않으면 오류가 발생합니다.


그런 다음 수행하려는 작업을 기다립니다. await 다음에 입력한 코드는 대기하던 작업이 완료되면 자동으로 실행됩니다.


다른 편리한 기능은 여러 작업을 기다린 후 다음 문을 실행하는 기능입니다. 여기서는 WhenAll을 사용할 수 있습니다.

...Functions  
​
var results = await Task.WhenAll(buttonClick, eventClick);  
​
...Next Statements  


await 및 async를 사용하는 동안에는 UI 스레드를 차단하지 않도록 주의해야 합니다. 동일한 스레드에서 유지하는 대신 다른 스레드에서 UI와 메서드를 처리함으로써 안전하게 수행할 수 있습니다.


다음은 이를 보여주는 코드입니다.


간단한 Async 및 Await 함수
private async void Button_Click_3(object s, RoutedEventArgs e)  
{  
var returnValue = await Task.Run(()=>  
functionToBeAwaited(this, intParam1, intParam2, intParam3));  
}
 
Async 함수
internal void functionToBeAwaited (MainWindow gui, int param1, int param2, int param3)  
{  
gui.UpdateWindow("Work Started");  
while (true)  
{  
gui.UpdateWindow(".");  
System.Threading.Thread.Sleep(50);  
}  
gui.UpdateWindow("Done and Done");  
}
 
GUI를 업데이트하기 위한 함수 호출
void UpdateWindow(string text)  
{  
Dispatcher.Invoke(() =>  
{  
txt.Text += text;  
});  
}  
 


효율적인 Intellisense 사용


Visual Studio의 최신 릴리스에서는 WPF의 기능이 크게 향상되었습니다. 이 향상된 기능을 이용하여 더 빠르고 효율적으로 코드를 작성할 수 있습니다.


눈에 띄게 향상된 기능 한 가지는 항목의 첫 글자를 입력하면 가장 가치 있는 항목이 제안되는 것입니다. 예를 들어 “Grid”를 입력하면 Intellisense는 ColumnDefinitions와 RowDefinitions를 제안 목록 위쪽에 놓습니다.


그리드


그런 다음 “ColumnDefinitions” 또는 “RowDefinitions”를 입력하고 공백을 추가하면 Intellisense는 너비를 사용해야 할지 높이를 사용해야 할지 알려줍니다. 이처럼 세심한 기능이 코드를 더 빠르게 작성하는 데 도움이 됩니다.



디자인 타임 바인딩


디자인 타임 바인딩은 .NET 5에 도입된 또 다른 기능입니다. 디자인 타임 바인딩을 사용하면 샘플 데이터를 폼 컨트롤에 바인딩할 수 있으므로 응용 프로그램을 만드는 동안 레이아웃에 대한 감각을 얻을 수 있습니다. 응용 프로그램을 실행할 필요가 없습니다. 데이터를 입력하고 TextInput 너비를 변경하기만 하면 됩니다.


대형 폼을 작성하고 변경할 것임을 기억하세요. 하루 종일 데이터를 입력해야 한다면 작업은 지루하고 많은 시간이 소요될 것입니다. 디자인 타임 바인딩을 사용하면 이 반복적인 작업에서 해방될 수 있습니다.


코드


위 이미지에는 이름이 Tim과 Corey인 텍스트 상자 두 개가 있습니다. 디자인 타임 바인딩으로 템플릿 값을 바인딩하면 d:type을 사용하여 값을 선언함으로써 디자인 타임 바인딩을 제어할 수 있습니다.


예를 들어 Corey는 텍스트 상자에 완벽하게 들어맞지 않는 것을 알 수 있습니다. 디자인 타임 바인딩을 사용하면 너비 변수 값을 쉽게 높일 수 있습니다. 또한 디자인 타임 바인딩을 텍스트에만 사용할 수 있는 것은 아닙니다. 체크박스, 라디오 버튼, 이미지, 기타 여러 도구를 사용할 수 있습니다. 자세한 내용은 공식 Microsoft 문서를 참조하세요.



Hot Reload 및 실시간 시각적 트리


Hot Reload는 대부분의 언어로 지원되는 잘 알려진 기능입니다. Hot Reload는 전체 응용 프로그램을 다시 시작하지 않고 변경한 코드에 따라 레이아웃 또는 기능을 업데이트합니다. 따라서 코드를 저장하자마자 변경 사항이 적용됩니다. 도구, 디버깅으로 이동한 후 Hot Reload를 선택하여 WPF에서 이 기능을 활성화할 수 있습니다.


WPF


활성화할 수 있는 다른 기능은 WPF 및 UWP 옵션 집합에 있습니다. 디버깅하는 동안 실시간 시각적 트리에서 선택한 요소 미리 보기를 선택하면 XAML 요소 간의 탐색을 더욱 쉽게 만들어 디버깅 프로세스를 더 빠르게 수행할 수 있습니다. 웹 개발 검사기와 같은 UI 화면의 요소를 선택할 수 있는 기능도 제공됩니다.



시간 낭비하지 않기


시간을 낭비하지 않은 것은 개발자가 시행할 수 있는 모범 사례 중 하나입니다. 뭔가 거창한 것을 만들고 있는데 즉시 사용할 수 있는 솔루션으로 WPF에는 없는 컴포넌트가 필요할 때, 처음부터 새로 만드는 것은 좋지 않은 생각입니다.


두 가지 이유는 다음과 같습니다.


첫째, 이미 다른 사람이 만들어 사용하고 있는 것을 새로 만들려는 이유가 무엇입니까? 그런 일에 시간을 투자하는 것은 생산적이지 않고 분명 즐겁지도 않을 것입니다.


둘째, 이미 만들어진 오픈 소스 WPF 컴포넌트를 사용하여 절약한 시간을 다른 곳에 사용할 수 있습니다.


오픈 소스 컴포넌트는 대부분 잘 만들어져서 오픈 소스 커뮤니티에 의해 유지 관리되고 있습니다. 즉, 이러한 컴포넌트가 WPF 및 XAML과 관련된 모범 사례를 이미 따르고 있을 것임을 의미합니다. 따라서 정확히 원하는 것을 찾을 수 없는 경우에는 유사한 오픈 소스 컴포넌트를 추출하여 필요에 맞게 편집할 수 있습니다.


그러나 WPF를 사용하여 전문적인 비즈니스 응용 프로그램을 구축하면서 정교한 상용 컴포넌트 툴킷이 필요한 경우에는 GrapeCity ComponentOne을 고려해야 할 것입니다.


여기에는 .NET 5/6을 비롯하여 .NET 프레임워크를 지원하는 전문가 수준의 고급 WPF 컴포넌트가 100개 이상 포함되어 있습니다. 현재 응용 프로그램이 이전 .NET 프레임워크를 사용 중이더라도 GrapeCity가 도와드릴 수 있습니다. 또한 개발 전문가가 이러한 컴포넌트를 구축하므로 MVVM(Model-View-ViewModel) 패턴의 업계를 선도하는 모범 사례가 제공됩니다.


매니지드 컴포넌트 툴킷의 또 다른 매력적인 요소는 한 프로젝트에서가 아닌 여러 프로젝트에서 개발 시간을 절약할 수 있다는 점입니다. 마지막으로 새 컴포넌트의 정기적인 구현과 기존 컴포넌트의 기능 향상이라는 중대한 이점이 있습니다.



결론


아시다시피 데스크톱 개발은 계속되고 있습니다.


이 문서는 .NET 5/5+ 사용의 중요성을 강조하는 것으로 시작하여, Windows on Arm 장치에서 기본적으로 실행되는 WPF 응용 프로그램이 어떻게 코드를 한 번 작성하여 다른 곳에 배포하는 과정에 도움을 주는지에 대해 논의했습니다. 글 전체에서 Async 및 Await 함수가 복잡한 상황에서 코드를 간소화한다는 점과 Async 함수 내의 여러 대기 호출에 이러한 함수를 사용할 수도 있음을 설명했습니다.


이어서 .NET 5 XAML IntelliSense를 사용하여 코드를 더 빠르게 작성하는 방법을 설명하고 디자인 타임 바인딩이 어떻게 인터페이스에 대한 감각을 높이는지도 설명했습니다. 그런 다음에는 생산성 향상과 개발의 용이성을 위해 무엇보다 주목해야 할 기능인 Hot Reload 및 실시간 시각적 트리에 대해 알아보았습니다.


마지막으로 가장 중요한 내용은 여러분의 시간을 낭비할 필요가 없다는 사실이었습니다. GrapeCity ComponentOne을 사용하면, 위의 모범 사례를 적용하여 이미 만들어진 기능을 사용함으로써 귀중한 개발 시간을 절약할 수 있습니다.



  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

하늘을날자님의 댓글

profile_image 하늘을날자 작성일

데스크탑 앱은 WinForms보다 WPF로 개발하는 게 좋을 것 같습니다.(GUI 측면에서)

다만, 국내 서점에 WPF 관련 서적은 거의 없다시피합니다.(없다고 봐야죠. 그리고 신규 출간 자체가 없습니다)

제가 소장하고 있는 책은 '찰스페졸드의 WPF'가 유일합니다.ㅠㅠㅠ( 수 년전 사기까지 당해가면서 힘들게 구매한 중고서적입니다.)
기술 문서 확보가 관건이라 생각합니다. 

이 부분을 감안하시어 그레이프시티 코리아에서 적극적인 지원을 해주시면 좋겠습니다.

좋은 건 다 알지만 사용자층을 끌어들일 뭔가가 필요해 보입니다.

최근에 모 중소기업에 방문해서 정보시스템 GUI를 한 번 봤는데요. (ERP와 SCM)

정말이지 세련되지 못한 UI였습니다. ㅠㅠㅠ
  
처음 데스크탑에 입문하는 신규 사용자 확보와 윈폼에서 WPF로 넘어갈수 있는 방법이 필요해 보입니다.

GrapeCity님의 댓글의 댓글

profile_image GrapeCity 작성일

하늘을 날자님의 의견에 전적으로 동의합니다.^^ 참 저희 입장에서도 어려운 주제인 듯 합니다.

Winforms가 워낙 안정적이고 오랜기간 많은 개발자 분들에게 사랑받고 사용되어지다보니, 
WPF보다는 아무래도 익숙한 Winform을 지속적으로 선택을 하시는 듯 합니다.

또한, 앞으로는 Microsoft에서는 Winform와 WPF, UWP를 통합하는 WinUI라는 새로운 플랫폼을 중심으로 데스크톱 애플리케이션을 개발을 지원할 예정이라고 합니다. ㅎㅎ 

이렇게되면, 사람마다 보는 시각이 다르지만, 데스트톱 개발은 조만간 Winform(오랜전 부터 사용)과 WinUI로(WPF, UWP 흡수) 개편이 될 것으로 예상하고 있습니다.

말씀 주신 것과 같이 저희도 .NET 시장의 동향을 보면서 개발자 분들께 도움이 될 수 있도록 노력하겠습니다. ^^

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

인기글

더보기
  • 인기 게시물이 없습니다.
메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.