캔버스 앱 성능 향상을 위한 팁 및 모범 사례

이전 문서에서 캔버스 앱에서 실행 단계 및 데이터 호출 흐름, 성능 저하의 일반적인 원인일반적인 성능 문제와 해결 방법에 대해 알아봤습니다. 이 문서의 팁과 모범 사례에 따라 사용자가 만드는 앱의 성능을 높일 수도 있습니다.

데이터 연결 제한

동일한 앱에서 30개를 초과하는 데이터 원본에 연결하지 마십시오. 앱은 새로운 사용자가 각 커넥터에 로그인하도록 유도하므로 모든 추가 커넥터는 앱 시작 시간을 늘립니다. 앱을 실행하면 앱이 해당 원본의 데이터를 요청할 때 각 커넥터에 CPU 리소스, 메모리 및 네트워크 대역폭이 필요합니다.

앱을 실행하는 동안 Microsoft Edge 또는 Google Chrome에서 개발자 도구를 사용하도록 설정하여 앱의 성능을 빠르게 측정할 수 있습니다. Microsoft Dataverse, Azure SQL, SharePoint 및 OneDrive의 Excel과 같이 30개가 넘는 데이터 원본에서 데이터를 자주 요청하면 앱이 데이터를 반환하는 데 15초보다 오래 걸릴 수 있습니다.

컨트롤 수 제한

동일한 앱에 500개를 초과하는 컨트롤을 추가하지 마십시오. Power Apps는 각 컨트롤을 렌더링하는 HTML 문서 개체 모델을 생성합니다. 추가하는 컨트롤이 많을수록 Power Apps에 필요한 생성 시간이 늘어납니다.

경우에 따라 개별 컨트롤 대신 갤러리를 사용하면 동일한 결과를 얻고 앱을 더 빨리 시작할 수 있습니다. 또한 동일한 화면에서 컨트롤 유형의 수를 줄이는 것이 좋습니다. 일부 컨트롤(예: PDF 뷰어, 데이터 테이블 및 콤보 상자)은 큰 실행 스크립트를 가져오고 렌더링하는 데 오래 걸립니다.

OnStart 속성 최적화

사용자 세션 중에 변경되지 않으면 ClearCollect 함수를 사용하여 로컬로 데이터를 캐시합니다. 또한 데이터 원본을 동시에 로드하는 동시 함수를 사용하십시오. 이렇게 하면 앱이 데이터를 로드하는 데 필요한 시간을 절반으로 줄일 수 있습니다. 추가 정보: Power Apps의 동시 함수

동시 함수가 없으면 다음 수식은 한 번에 하나씩 4개의 테이블을 로드합니다.

ClearCollect( Product, '[SalesLT].[Product]' );
ClearCollect( Customer, '[SalesLT].[Customer]' );
ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' );
ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )

다음 이미지와 같이 브라우저의 개발자 도구에서 이 동작을 확인할 수 있습니다.

4개의 테이블이 차례로 로드되는 것을 보여주는 다이어그램

Concurrent 함수에 동일한 수식을 묶어서 작업에 필요한 전체 시간을 줄일 수 있습니다.

Concurrent( 
    ClearCollect( Product, '[SalesLT].[Product]' ),
    ClearCollect( Customer, '[SalesLT].[Customer]' ),
    ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ),
    ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' ))

이 변경으로 앱은 다음 이미지와 같이 테이블을 병렬로 가져옵니다.

4개의 테이블이 동시에 로드되는 것을 보여주는 다이어그램

참고

OnStart와 관련된 성능 문제 및 해결 방법에 대한 자세한 내용은 OnStart 이벤트 조정 필요를 참고하십시오.

조회 데이터 캐시

Set 함수를 사용하여 원본에서 데이터를 반복적으로 검색하지 않도록 조회 테이블의 데이터를 로컬로 캐시합니다. 이 기술은 세션 중에 데이터가 변경되지 않을 가능성이 있는 경우 성능을 최적화합니다. 다음 예와 같이 데이터는 원본에서 한 번 검색되고 나면, 사용자가 앱을 닫을 때까지 로컬로 참조됩니다.

Set(CustomerOrder, Lookup(Order, id = “123-45-6789”));
Set(CustomerName, CustomerOrder.Name);
Set(CustomerAddress, CustomerOrder.Address);
Set(CustomerEmail, CustomerOrder.Email);
Set(CustomerPhone, CustomerOrder.Phone);

이 방법은 자주 변경되지 않는 연락처 정보, 기본값 또는 사용자 정보와 같은 데이터에 더 유용합니다. 일반적으로 이 기술을 기본값사용자 함수와 함께 사용할 수도 있습니다.

화면 간 컨트롤 종속성 방지

성능 향상을 위해 앱 화면은 필요할 때만 메모리에 로드됩니다. 예를 들어 화면 1이 로드되고 해당 수식 중 하나가 화면 2의 컨트롤 속성을 사용하는 경우 이 최적화가 방해받을 수 있습니다. 이제 화면 1을 표시하기 전에 화면 2를 로드하여 종속성을 충족해야 합니다. 화면 2에 화면 3에 대한 종속성이 있고, 화면 3에 화면 4에 대한 다른 종속성이 있고, 등등이 있다고 상상해보십시오. 이 종속성 체인으로 인해 많은 화면이 로드될 수 있습니다.

이러한 이유가 있으므로 화면 간의 수식 종속성을 피하도록 하십시오. 경우에 따라 전역 변수 또는 컬렉션을 사용하여 화면 간에 정보를 공유할 수 있습니다.

예외가 있습니다. 이전 예에서, 화면 1을 표시하는 유일한 방법이 화면 2에서 탐색하는 것이라고 가정합니다. 그러면 화면 1이 로드될 때 화면 2가 이미 메모리에 로드되었을 것입니다. 화면 2에 대한 종속성을 충족하기 위해 추가 작업이 필요하지 않으므로 성능에 영향을 미치지 않습니다.

위임 사용

가능한 경우 처리를 위해 데이터를 로컬 디바이스로 검색하는 대신 데이터 처리를 데이터 원본에 위임하는 함수를 사용합니다. 앱이 로컬로 데이터를 처리해야 하는 경우 작업에 훨씬 더 많은 처리 능력, 메모리 및 네트워크 대역폭이 필요합니다(특히 데이터 집합이 큰 경우).

특정 커넥터에서 지원하는 위임 가능한 기능에 대한 자세한 내용은 커넥터 설명서를 참조하십시오.

위임 가능한 함수의 예로, SharePoint 목록에서 숫자 데이터 형식으로 정의된 ID 열을 고려하십시오. 다음 예의 수식은 예상대로 결과를 반환합니다. 그러나 첫 번째 수식은 위임할 수 없고 두 번째는 위임할 수 있습니다.

수식 위임 가능?
Filter ('SharePoint list data source', ID = 123 ) 있음
Filter(`SharePoint list data source', ID ="123") 없음

SharePoint의 ID 열이 숫자 데이터 형식으로 정의되었다고 가정했으므로 오른쪽 값은 문자열 변수가 아닌 숫자 변수여야 합니다. 그렇지 않으면 이러한 불일치로 인해 수식이 위임되지 않을 수 있습니다.

위임할 수 없는 쿼리에 대해 위임할 수 없는 함수 및 부적절한 데이터 행 제한 사용은 앱 성능에 부정적인 영향을 미칠 수 있습니다. 추가 정보: 캔버스 앱의 위임 이해

지연된 로드 사용

앱에 10개를 초과하는 화면, 규칙 없음 및 여러 화면에 있고 데이터 원본에 직접 바인딩된 많은 컨트롤이 있는 경우 지연된 로드에 대한 실험적 기능을 사용 설정합니다. 이 유형의 앱을 빌드하고 이 기능을 사용하지 않으면 열려 있지 않은 화면에서도 모든 화면의 컨트롤을 채워야 하므로 앱 성능이 저하될 수 있습니다. 또한 사용자가 레코드를 추가하는 경우와 같이 데이터 원본이 변경될 때마다 앱의 모든 화면을 업데이트해야 합니다.

큰 데이터 집합 작업

사용자가 필요한 모든 정보에 액세스할 수 있는 동안 앱의 성능을 유지하려면 위임할 수 있는 데이터 원본과 수식을 사용하고, 위임할 수 없는 쿼리에 대한 2000개의 데이터 행 제한을 초과하지 마십시오. 사용자가 데이터를 검색, 필터링 또는 정렬할 수 있는 데이터 레코드 열의 경우 SQL 서버 또는 SharePoint와 같은 데이터 원본에 설명된 대로 열에 인덱스를 사용합니다.

참고

대용량 데이터 집합이 다른 플랫폼에서 어떻게 일반적인 성능 문제를 일으키는지에 대한 추가 정보는 다른 플랫폼에서 느리게 로드되는 대용량 데이터 집합을 참고하십시오.

앱을 정기적으로 다시 게시

제작자는 정기적으로 앱을 게시하는 것이 좋습니다. Power Apps 플랫폼이 지속적으로 최적화되고 배포되므로 앱을 다시 게시하면 최신 플랫폼 최적화 내에서 앱이 다시 생성됩니다.

여러 곳에서 동일한 수식을 반복하지 않음

여러 속성이 동일한 수식을 실행하는 경우(특히 복잡한 경우) 한 번 설정한 다음 후속 설정에서 첫 번째 속성의 출력을 참조하십시오. 예를 들어, A, B, C, D 및 E 컨트롤의 DisplayMode 속성을 동일한 복잡한 수식으로 설정하지 마십시오. 대신 A의 DisplayMode 속성을 복잡한 수식으로 설정하고, B의 DisplayMode 속성을 A의 DisplayMode 속성 결과로 설정하고, C, D 및 E에 대해서도 마찬가지입니다.

모든 Text input 컨트롤에서 DelayOutput 활성화

Text input 컨트롤의 값을 참조하는 수식 또는 규칙이 여러 개인 경우 해당 컨트롤의 DelayedOutput 속성을 true로 설정하십시오. 해당 컨트롤의 텍스트 속성은 빠르게 연속적으로 입력한 키 입력이 중지된 후에만 업데이트됩니다. 수식이나 규칙은 여러 번 실행되지 않으며, 앱 성능이 향상됩니다.

규칙 및 수식에 Form.Updates를 사용하지 않음

Form.Updates 변수를 사용하여 규칙 또는 수식에서 사용자 입력 값을 참조하는 경우 모든 양식의 데이터 카드를 반복하고 매번 레코드를 만듭니다. 앱의 효율성을 높이려면 데이터 카드 또는 제어 값에서 직접 값을 참조하십시오.

구성에 따라 갤러리에서 보이는 행을 렌더링하는 데 더 오래 걸릴 수 있습니다. 성능을 향상시킬 수 있는 몇 가지 방법이 있습니다.

  • 템플릿을 간소화합니다. 예를 들어 컨트롤 수, 조회에 대한 참조를 줄이는 것이 좋습니다.
  • 복잡한 템플릿이 있는 갤러리는 DelayItemLoadingtrue 로 설정하고 LoadingSpinnerLoadingSpinner.Controls 로 설정하면 이점을 얻을 수 있습니다. 이 변경 내용은 렌더링 시간이 길어질 때인지 된 경험을 향상시킵니다. 또한 DelayItemLoading 은 화면과 갤러리가 리소스를 두고 경쟁하지 않기 때문에 화면의 나머지 부분이 더 빠르게 렌더링될 수 있도록 템플릿 렌더링을 연기합니다.

다음 단계

앱 성능을 극대화하고 앱을 더 쉽게 유지 관리하려면 코딩 표준 을 검토하십시오.

참조

캔버스 앱 실행 단계 및 데이터 호출 흐름 이해하기
일반적인 캔버스 앱 성능 문제 및 해결 방법
캔버스 앱 성능 저하의 일반적인 원인
Power Apps의 공통 문제 및 해결
Power Apps의 시작 문제 해결