최고의 성능을 위해 앱 또는 페이지 로드 최적화

앱에 대한 사용자의 인식을 형성하는 주요 요소 중 하나는 앱이 열리고 실행되는 속도입니다. 따라서 고성능 앱을 구축하려면 이 목표의 우선 순위를 정하는 것이 중요합니다. 최적의 앱 성능을 달성하려면 주의가 필요한 세 가지 주요 영역이 있습니다.

  1. 데이터를 빠르게 로드
  2. 효율적인 계산
  3. 필요한 자원 최소화

이러한 각 영역에는 몇 가지 일반적인 안티 패턴이 있습니다.

데이터를 빠르게 로드

앱의 데이터 로딩 속도를 빠르게 하려면 다음 지침을 따르십시오.

대량의 데이터로 컬렉션을 직접 채우지 않음

때때로 작성자는 ClearCollect()를 사용하여 서버에서 앱의 컬렉션으로 데이터를 복사합니다. 이 방법은 소스의 위임 제한에 대한 해결 방법이거나 다른 목적으로 앱의 컬렉션을 사용할 계획이기 때문입니다. ClearCollect()를 사용하면 나중에 컬렉션을 활용할 때 앱 속도가 잠재적으로 향상될 수 있습니다. 그러나 구현하는 동안 주의를 기울이는 것이 중요합니다. 이런 방식으로 ClearCollect를 사용하면 앱 로드 시간이 느려지거나 페이지 간을 탐색할 때 발생할 수 있습니다. ClearCollect()가 완료되어야 갤러리나 테이블의 데이터를 볼 수 있습니다. 데이터가 많거나 데이터 원본에 이 접근 방식을 사용하는 경우 이 단계는 시간이 오래 걸릴 수 있습니다. 컬렉션은 데이터가 작고 컬렉션에 대해 많은 계산을 수행해야 하는 상황에 가장 적합합니다. 예를 들어 컬렉션을 효과적으로 활용하는 방법은 온라인 주문 바구니입니다. 고객은 주문을 확정하기 전에 항목을 여러 번 업데이트하고 제거할 수 있습니다. 또한 잠재적인 할인, 하이라이트 등과 같은 더 많은 데이터 항목으로 컬렉션을 늘릴 수 있습니다. '읽기 전용' 데이터는 기본적으로 액세스해야 하며 컬렉션으로 가져오지 않습니다.

컬렉션을 채우기 위해 Power Automate를 호출하지 않는 것이 좋습니다.

이 문제는 이전 섹션을 약간 변형한 것입니다. 때때로 작성자는 Power Automate를 사용하여 Power Apps에 컬렉션을 채울 수도 있습니다. Power Automate를 인스턴스화하는 데 약 0.6초의 성능 비용이 발생합니다. Power Automate는 호출될 때마다 독립적으로 실행되어야 합니다. 메모리를 할당하고, 올바른 구성 요소를 배치하고, 실행할 준비가 되어 있어야 합니다. 위의 조언과 마찬가지로 Power Automate에 대한 한두 번의 호출은 앱에 따라 문제가 되지 않을 수도 있습니다. 그러나 대부분의 경우 성능이 가장 낮은 앱이 이 방식을 과도하게 사용합니다. 성능 비용이 빠르게 증가하여 앱 성능을 망칠 수 있습니다.

SaveData() 및 LoadData()를 전체 오프라인 시나리오로 사용하지 않음

일부 작성자는 ClearCollect()를 사용한 다음 SaveData()를 사용하여 일반 목적의 오프라인 사용을 위해 데이터를 저장합니다. SaveData()를 사용하여 컬렉션을 장치에 저장하고, LoadData()를 사용하여 오프라인일 때 컬렉션을 로드할 수 있습니다. 그러나 이 접근 방식은 데이터 양이 많거나 데이터가 복잡한 경우에는 권장되지 않습니다. 데이터를 표시하려면 ClearCollect()가 완료될 때까지 기다려야 하기 때문에 앱 속도가 느려집니다. 기본 설정 및 짧은 목록과 같은 작고 간단한 데이터 시나리오에만 SaveData() 및 LoadData()를 사용해야 합니다. 대량의 오프라인 데이터로 작업하는 더 좋은 방법은 Dataverse와 작동하는 Power Apps 오프라인 기능을 사용하는 것입니다. 이 기능을 사용하면 더 크고 복잡한 데이터를 더 효율적으로 처리할 수 있습니다.

명시적 열 선택 사용

명시적 열 선택은 기본적으로 켜져 있습니다. 그러나 일부 작성자는 이 기능을 해제합니다. 문제는 명시적 열 선택(ECS)이 설정된 경우 데이터가 처음 컬렉션으로 검색되면 데이터 원본에서 열이 검색되지 않는 경우가 있다는 것입니다. 일부 테이블에는 열이 많을 수 있으므로 ECS는 컨트롤(예: 갤러리 및 양식)에서의 사용을 기반으로 검색해야 하는 열을 자동으로 계산합니다. 일부 테이블에는 열이 많을 수 있으므로 다운로드 크기를 줄이면 성능이 향상될 수 있습니다. 일부 테이블에는 100개 이상의 열이 있을 수 있습니다. 앱은 10개의 열만 필요하며 100개의 열이 있는 테이블에서 모든 열을 가져오는 경우 실제로 필요한 것보다 10배 많은 데이터를 가져오는 것입니다.

대부분의 문제는 데이터를 컬렉션으로 가져올 때 발생합니다. 열이 컨트롤에서 명시적으로 참조되면 ECS가 제대로 작동합니다. 그리고 ECS는 일반적으로 컬렉션에 대해 작동합니다. 그러나 데이터가 컬렉션과 변수를 통해 이동할 때 열 계보가 손실되는 경우가 있습니다. 따라서 Power Apps는 검색해야 하는 열을 추적하지 못할 수 있습니다. 이 문제를 해결하려면 Power Apps에서 ShowColumns 함수를 사용하여 열을 "기억"하도록 할 수 있습니다. 예:

    ClearCollect(
        MyColTable, 
        ShowColumns(Filter(BankAccounts, AcountNo = 32),
        "Col1", 
        "Col2", 
        "Col3")
    );

Col1, Col2Col3은 데이터 원본에서 검색할 것으로 예상되는 열입니다(예: Account 데이터 원본).

또는 열을 참조하는 양식에 숨겨진 컨트롤을 추가할 수 있습니다. 이렇게 하면 Power Apps가 열을 "기억"하게 됩니다.

빠른 계산

빠른(또는 효율적인) 계산은 그 자체로 성능 목표입니다. 자세한 내용은 빠른(효율적인) 계산을 참조하세요. 그러나 앱 로드에도 영향을 미칠 수 있는 몇 가지 일반적인 안티 패턴이 있으므로 여기에서 이에 대해 논의합니다. 다음은 앱 실행이나 페이지 탐색에 영향을 미칠 수 있는 고려해야 할 최적화 목록입니다.

App.Formulas 사용

역사적으로 많은 작성자가 OnStart에 수많은 계산을 넣었습니다. OnStart에 표현식을 배치하면 Power Apps는 앱이 시작될 때 그리고 다른 모든 것보다 먼저 해당 표현식을 실행하도록 강제합니다. 그러나 App.Formulas를 도입하면 Power Apps가 표현식 실행 시기를 결정하도록 할 수 있습니다. Power Apps는 필요하기 전에 'Just-In-Time' 수식을 실행할 수 있습니다. 자세한 내용은 앱 수식을 참조하십시오. App.Formulas를 사용하여 수식을 Power Apps가 실행을 위해 보다 효율적으로 정렬할 수 있는 조각으로 분할합니다.

Concurrent 사용

Concurrent 함수를 사용하면 수식이 동시에 실행될 수 있습니다. 병렬 실행이 가능하므로 이 함수를 사용하여 컬렉션을 채우는 것이 일반적입니다. 이를 통해 어느 정도 속도가 향상될 수 있지만 많은 데이터 원본을 추가하면 타이밍 및 제한 문제가 발생할 수 있습니다.

숨겨진 컨트롤에 대한 고급 성능 사용

2022년 12월 이후 생성된 모든 새 앱에서 기본적으로 활성화되면 Power Apps는 처음에 표시되지 않는 컨트롤을 렌더링하지 않습니다.

필요한 리소스 최소화

앱이나 화면을 실행하는 데 필요한 리소스를 최소화하세요. 이러한 노력에는 앱이나 화면에 필요한 리소스의 범위를 신중하게 지정하거나 분할하는 것이 포함됩니다. 다음은 도움이 되는 몇 가지 접근 방식입니다.

종속성이 낮은 시작 화면을 사용하고 사용하지 않는 화면을 제거하세요.

애플리케이션의 환영 메시지와 같이 종속성이 낮은 첫 번째 화면을 사용하세요. 갤러리나 테이블, 참조 데이터를 로드하지 않는 화면을 만듭니다. 이를 통해 사용자의 속도 인식을 관리하고 Power Fx가 일부 계산을 나중에 적절하게 지연할 수 있습니다. 사용하지 않는 화면이 있으면 제거하세요.

화면 간 교차 화면 종속성을 낮게 유지

페이지 간 참조는 참조를 통해 추가 페이지를 강제로 로드합니다(예: 페이지의 컨트롤 참조 및 컬렉션에 넣기). 일부 참조는 불가피할 수 있습니다. 페이지만 로드되도록 가능하면 단일 페이지에 대한 공통 참조를 중앙 집중화합니다.

포함된 미디어 고려

작성자는 빠른 로딩을 보장하기 위해 앱에 미디어를 포함하는 경우도 있습니다. 포함된 미디어가 있는 경우 해당 미디어를 사용하고 있는지 여부를 고려하십시오. 그렇지 않은 경우 삭제하세요. .png 파일을 포함했다면 더 작은 .svg 파일로 대체하는 것이 좋습니다. .svg를 사용하는 경우 .svg의 글꼴이 클라이언트 시스템에 있어야 합니다. 포함된 미디어 해상도를 고려하십시오. 사용할 디바이스에 비해 너무 높은가요?

App.StartScreen을 잊지 마세요

App.StartScreen을 사용하는 경우 첫 번째 화면이 빈 화면인지 확인하세요. 현재 앱 패키징으로 인해 첫 번째 논리 화면은 항상 앱 초기화 로직과 함께 번들로 제공되며 탐색 여부에 관계없이 초기화됩니다.

앱 분할 고려

앱이 큰 경우 더 작은 앱으로 분할하는 것이 좋습니다. 앱의 여러 부분에서 기능이 충분히 분리되어 있는 경우 이 접근 방식이 작동할 수 있습니다. 이 시나리오에서는 첫 번째 또는 상위 앱의 컨텍스트를 포함하는 매개 변수를 사용하여 실행하는 별도의 실제 앱을 만듭니다.

제안

빠른 앱 및 페이지 시작 목표를 달성하려면 다음 질문과 제안을 고려하세요.

  1. 첫 화면에 많은 데이터를 로딩하고 계시나요? 다른 첫 화면을 사용할 수 있나요?
  2. 앱 로드 시작 시 많은 명령이나 Power Fx 표현식을 실행하고 있습니까? 이러한 명령과 표현식을 애플리케이션의 나중 지점으로 연기할 수 있습니까? 앱을 시작하는 데 실제로 필요한 데이터만 가져오나요? 1 App.OnStart의 표현식을 App.Formulas를 사용하여 명명된 수식으로 변환할 수 있습니까? 이를 통해 Power Fx는 이벤트 로드 또는 탐색 시 강제로 수식을 실행하는 대신 실제로 수식을 실행할 시기를 결정할 수 있습니다.
  3. 별도의 Power Automate 흐름을 사용하여 서로 다른 원본의 데이터를 결합하는 Dataverse와 같은 로컬 데이터 저장소에 임시 테이블을 만들 수 있나요? 그런 다음 Power App에서 해당 데이터에 액세스하시겠습니까?
  4. 비즈니스 프로세스 시작의 경우 Power Automate 흐름을 호출하는 대신 서버 트리거 작업을 사용할 수 있습니까?
  5. 데이터를 조인하는 서버에 뷰를 만들 수 있나요?
  6. 앱에서 오프라인 데이터를 사용하려면 Dataverse와 작동하는 Power Apps 오프라인 기능을 사용할 수 있나요? 데이터가 Dataverse에 없는 경우 옮길 수 있습니까?