다음을 통해 공유


크고 복잡한 캔버스 앱 빌드

문서의 이 섹션에 있는 대부분의 문서는 사용자가 경험하는 앱의 런타임 성능을 다룹니다. 이 문서에서는 앱을 만든 사람들이 경험한 앱 성능에 대해 다룹니다.

앱이 커지고 복잡해짐에 따라 Power Apps Studio는 기하급수적으로 증가하는 상호 종속성과 함께 수많은 컨트롤, 수식 및 데이터 원본을 로드하고 관리해야 합니다. Power Apps Studio는 로드하는 데 시간이 오래 걸릴 수 있으며 IntelliSense 및 색상 코딩과 같은 기능이 지연될 수 있습니다. 다음 권장 사항을 사용하여 Power Apps Studio에서 크고 복잡한 앱으로 더 잘 작업하세요. 또한 앱의 런타임 성능을 개선하는 데 도움이 될 수 있습니다.

이 문서의 예는 병원 비상 대응 샘플 솔루션을 사용합니다.

App.OnStart 대신 App.Formulas 사용

명명된 수식 대신 With 함수 및 캔버스 구성 요소 사용자 지정 출력 속성을 사용할 수 있습니다.

Power Apps Studio 및 앱의 로드 시간을 줄이는 가장 좋은 방법은 App.OnStart의 변수 및 컬렉션 초기화를 App.Formulas의 명명된 수식으로 바꾸는 것입니다.

App.OnStart를 사용하는 다음 예제를 살펴보겠습니다.

// Get the color of text on a dark background.
Set(varColorOnDark,RGBA(0, 0, 0, 1));

// Get the color of the menu icons.
Set(varColorMenuIcon,"#0070a9");

// Get the styles for a form.
Set(varFormStyle,
    {
        DataCard: { Height: 50 },
        Title: { Height: 50, Size: 21, Color: varColorOnDark },
        Control: { Height: 50, Size: 18 },
        Label: { Size: 18, Color: varColorOnDark }
    }
);

ClearCollect(
    FacilitiesList,
    ForAll(
        Facilities,
        { Name: 'Facility Name', Id: Facility }
    )
);
If(
    Not IsBlank(Param("FacilityID")),
    Set(ParamFacility,
        LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Name
    );
);

명령문 시퀀스이기 때문에 앱이 첫 번째 화면을 표시하기 전에 이러한 SetCollect 호출을 순서대로 평가해야 앱 로드 속도가 느려집니다. 그리고 전체 App.OnStart를 전체로 간주하고 순서를 유지하며 최종 결과를 반환하기 전에 오류를 집계해야 하기 때문에 Power Apps Studio가 분석하기에는 공식이 복잡합니다.

더 좋은 방법이 있습니다. 대신 App.Formulas를 사용하고 다음 예제와 같이 이러한 변수와 컬렉션을 명명된 수식으로 정의합니다.

// Get the color of text on a dark background.
varColorOnDark = RGBA(0, 0, 0, 1);

// Get the color of the menu icons.
varColorMenuIcon = "#0070a9";

// Get the styles for a form.
varFormStyle = 
    {
        DataCard: { Height: 50 },
        Title: { Height: 50, Size: 21, Color: varColorOnDark },
        Control: { Height: 50, Size: 18 },
        Label: { Size: 18, Color: varColorOnDark }
    };

FacilitiesList =
    ForAll(
        Facilities,
        { Name: 'Facility Name', Id: Facility }
    );

ParamFacility = 
    If( Not IsBlank(Param("FacilityID")),
        LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Name,
        Blank()
    );

이 변화는 사소해 보일 수 있지만 큰 영향을 미칠 수 있습니다. 명명된 각 수식은 서로 독립적이기 때문에 Power Apps Studio는 이를 독립적으로 분석하여 큰 App.OnStart를 더 작은 조각으로 효과적으로 분할할 수 있습니다. 이 변경 사항만으로도 Power Apps Studio 로드 시간이 80%나 감소했습니다.

또한 결과가 필요할 때까지 이러한 수식을 평가할 필요가 없기 때문에 앱이 더 빠르게 로드됩니다. 바로 앱의 첫 화면이 뜹니다.

명명된 수식은 수정하거나 Set과 함께 사용할 수 없기 때문에 모든 상황에서 사용할 수 없습니다. 일부 상황에서는 수정할 수 있는 상태 변수를 사용해야 합니다. Set는 이러한 상황에 적합하며 계속 사용해야 합니다. 그러나 변경되지 않는 정적 값을 설정하기 위해 OnStart에서 전역 변수를 사용하는 경우가 더 많습니다. 이러한 경우 명명된 수식이 더 나은 선택입니다.

명명된 수식은 변경할 수 없으므로 명명 규칙으로 접두사 var("변수"의 줄임말)은 더 이상 적합하지 않습니다. 일치하려면 앱의 나머지 부분을 변경해야 하므로 이 예에서는 이름을 변경하지 않았습니다.

App.OnStart에 명명된 수식을 배치하고 싶은 유혹이 있지만 그렇게 하지 마세요. 그들은 거기에 속하지 않습니다. On 동작 속성으로 App.OnStart는 각 명령문을 순서대로 평가하여 전역 변수를 만들고 앱이 로드될 때 한 번만 데이터베이스와 통신합니다. 명명된 수식은 필요할 때마다 무언가를 계산하는 방법을 정의하는 수식이며 항상 참입니다. 이러한 수식 특성으로 인해 독립적일 수 있고 앱이 평가되기 전에 로드를 완료할 수 있습니다.

긴 수식 나누기

App.OnStart는 긴 수식에 대한 최악의 위반자 중 하나이며 확실히 시작해야 하지만 유일한 경우는 아닙니다.

우리의 연구에 따르면 Power Apps Studio 로드 시간이 긴 거의 모든 앱에는 256,000자가 넘는 수식이 하나 이상 있습니다. 로드 시간이 가장 긴 일부 앱에는 100만 자 이상의 수식이 있습니다. 오랫동안 Power Apps Studio에 상당한 부담을 주는 공식.

설상가상으로, 긴 수식이 포함된 컨트롤을 복사하여 붙여넣으면 컨트롤 특성의 수식이 인식되지 않고 복제됩니다. Power Apps는 수식의 여러 복사본이 일반적인 Excel을 모델로 합니다. 그러나 Excel에서 수식은 하나의 식으로 제한되며 8,000자로 제한됩니다. Power Apps 수식은 명령형 논리와 연결 연산자(; 또는 ;; 로캘에 따라 다름)의 도입으로 훨씬 더 길어질 수 있습니다.

일반적인 해결책은 이전 섹션에서 App.OnStartSet/Collect 문을 App.Formulas의 명명된 수식으로 변경했을 때 했던 것처럼 긴 수식을 더 작은 부분으로 분할하고 해당 부분을 재사용하는 것입니다. 다른 프로그래밍 언어에서는 재사용 가능한 부분을 종종 서브루틴 또는 사용자 정의 함수라고 합니다. 명명된 수식은 매개 변수나 부작용이 없는 단순한 형태의 사용자 정의 함수로 생각할 수 있습니다.

어디에서나 명명된 수식 사용

이전 예제에서는 명명된 수식을 App.OnStart 대신 사용했습니다. 그러나 이를 사용하여 앱의 어디에서나 계산을 바꿀 수 있습니다.

예를 들어 Hospital Emergency Response 샘플 솔루션의 화면 중 하나는 Screen.OnVisible에 다음 논리를 포함합니다.

ClearCollect(
    MySplashSelectionsCollection,
    {
        MySystemCol: First(
            Filter(
                Regions,
                Region = MyParamRegion
            )
        ).System.'System Name',
        MyRegionCol: First(
            Filter(
                Regions,
                Region = MyParamRegion
            )
        ).'Region Name',
        MyFacilityCol: ParamFacility,
          MyFacilityColID:  LookUp(
            FacilitiesList,
            Id = GUID(Param("FacilityID"))
        ).Id
    }
); 

이 수식은 명명된 수식 집합으로 분할할 수 있습니다. 또한 공식을 더 쉽게 읽을 수 있습니다.

MyRegion = LookUp(
                    Regions,
                    Region = MyParamRegion
           );

MyFacility = LookUp(
                    FacilitiesList,
                    Id = GUID(Param("FacilityID")
            );

MySplashSelectionsCollection = 
    {
        MySystemCol: MyRegion.System.'System Name',
        MyRegionCol: MyRegion.'Region Name',
        MyFacilityCol: ParamFacility,
        MyFacilityColID:  MyFacility.Id
    };

ParamFacility를 이전에 App.OnStart에서 App.Formulas의 명명된 수식으로 대부분의 Set 호출을 이동했을 때 명명된 수식으로 추출했습니다.

명명된 수식은 해당 값이 필요할 때만 평가됩니다. Screen.OnVisible을 사용하는 원래 의도가 화면이 표시될 때까지 작업을 연기하는 것이라면 작업은 여전히 App.Formulas에서 전역 명명된 수식으로 연기됩니다.

함수와 함께 사용

수식에서 With 함수를 사용하여 논리를 분할할 수도 있습니다. 필드로 사용할 값으로 첫 번째 매개 변수에 레코드를 만든 다음 두 번째 매개 변수에서 해당 필드를 사용하여 With의 반환 값을 계산합니다. 예를 들어 이전의 예는 하나의 명명된 수식으로 작성할 수 있습니다.

MySplashSelectionsCollection = 
    With( { MyRegion: LookUp(
                            Regions,
                            Region = MyParamRegion
                      ),
            MyFacility: LookUp(
                            FacilitiesList,
                            Id = GUID(Param("FacilityID")
                      ) 
           },
           {
                MySystemCol: MyRegion.System.'System Name',
                MyRegionCol: MyRegion.'Region Name',
                MyFacilityCol: ParamFacility,
                MyFacilityColID:  MyFacility.Id
           }
    )

이러한 방식으로 With를 사용하는 경우의 한 가지 단점은 MyFacility가 동일한 With 함수에서 정의되기 때문에 MyRegion를 사용할 수 없다는 것입니다. 이는 명명된 수식에는 없는 문제입니다. 한 가지 해결책은 With 함수를 중첩하고 As 키워드를 사용하여 모든 With 변수에 쉽게 액세스할 수 있도록 각 레코드의 이름을 지정하는 것입니다.

캔버스 구성 요소 사용

캔버스 구성 요소는 컨트롤처럼 캔버스에 배치할 수 있는 UI 컨트롤을 만드는 데 가장 자주 사용됩니다. 명명된 수식의 대안으로 사용자 지정 출력 속성을 사용하여 계산을 수행하기 위해 UI에 배치하지 않고 사용할 수도 있습니다. 캔버스 구성 요소는 구성 요소 라이브러리를 사용하여 앱 간에 쉽게 공유할 수 있으며 명명된 수식과 달리 완전히 지원됩니다. 그러나 명명된 수식보다 구성하고 사용하기가 더 어렵습니다.

논리를 분할하려면:

  1. Power Apps Studio에서 트리 보기구성 요소 탭으로 전환합니다.
  2. 새 구성 요소 만들기.
  3. 속성 창에서 Access 앱 범위를 켭니다.
  4. 사용자 지정 속성을 추가합니다.
  5. 속성 유형출력으로 설정하고 데이터 유형을 적절하게 설정합니다.
  6. 만들기를 선택합니다.
  7. 화면 상단의 수식 입력줄 옆에 있는 속성 선택기에서 새 속성을 선택합니다.
  8. 분리하여 재사용할 논리에 대한 수식을 작성합니다.

논리 사용 방법:

  1. 트리 보기에서 화면 탭으로 전환합니다.
  2. 삽입 창에서 사용자 지정을 확장하고 구성 요소를 삽입합니다.
  3. 속성으로 값을 계산하려면 ComponentName.PropertyName을 사용합니다.

명령형 논리를 위해 숨겨진 컨트롤과 함께 Select 사용

명령형 논리는 SetCollect를 사용하여 상태를 수정하고, Notify를 사용하여 사용자에게 알리고, NavigateLaunch를 사용하여 다른 화면이나 앱으로 이동하고, Patch, SubmitForm 또는 RemoveIf를 사용하여 데이터베이스에 값을 쓰는 데 사용됩니다.

명명된 수식 및 캔버스 구성 요소 사용자 지정 출력 속성은 명령형 논리를 지원하지 않습니다. 명령형 논리를 분할하는 일반적인 방법은 숨겨진 컨트롤의 OnSelect 속성을 사용하는 것입니다.

  1. 화면에 버튼 컨트롤을 추가합니다.
  2. OnSelect 속성을 실행할 명령형 논리로 설정합니다.
  3. 사용자가 보거나 상호 작용할 필요가 없으므로 Visible 속성을 false로 설정합니다.
  4. 명령형 논리를 실행하려는 경우 Select( Button )를 호출합니다.

예를 들어 샘플 화면 중 하나에는 버튼 컨트롤에 다음 OnSelect 속성이 있습니다. (이 간단한 예는 단지 설명을 위한 것입니다. 일반적으로 이 기술은 더 긴 수식에만 사용합니다.)

btnAction_17.OnSelect = 
    Trace("Feedback Screen: Submit Button",TraceSeverity.Information);
    If(
        // Proceed if all forms are validated.
        And(
            FormFeedback.Valid
        ),
    
        // Set the updates to static variables.
        Set(updatesFeedback,Patch(Defaults('App Feedbacks'), FormFeedback.Updates));
        // Submit the first form. Subsequent actions can be found in the OnSuccess.
        SubmitForm(FormFeedback);
        ,
    
        Notify("Please complete all fields before proceeding",
               NotificationType.Warning,2000)
    );

이 논리를 여러 부분으로 나누기 위해 부분을 별도의 버튼 컨트롤에 넣고 원본에서 선택할 수 있습니다.

btnTrace.OnSelect = 
    Trace("Feedback Screen: Submit Button",TraceSeverity.Information);

btnSubmit.OnSelect = 
    If(
        // Proceed if all forms are validated.
        And(
            FormFeedback.Valid
        ),
    
        // Set the updates to static variables.
        Set(updatesFeedback,Patch(Defaults('App Feedbacks'), FormFeedback.Updates));
        // Submit the first form. Subsequent actions can be found in OnSuccess.
        SubmitForm(FormFeedback);
        ,
    
        Notify("Please complete all fields before proceeding",
               NotificationType.Warning,2000)
    );

btnAction_17.OnSelect = 
    Select( btnTrace );
    Select( btnSubmit );

이 기술은 같은 화면에서만 작동합니다. 토글 컨트롤을 사용하거나, 실행하려는 로직에 OnCheck를 설정하거나, 기본값을 전역 변수로 설정한 다음 로직을 실행하려는 지점에서 전역 변수를 Set( global, true ); Set( global, false )로 토글하는 등 약간 더 복잡한 다른 기술도 화면 전체에서 작동합니다.

이 예에서는 일부 논리 분할이 이미 수행되었습니다. 주석은 "OnSuccess에서 후속 작업을 찾을 수 있습니다."라고 언급합니다. 이 이벤트는 레코드가 성공적으로 제출된 후 SubmitForm 기능에 특정한 솔루션인 명령형 논리를 실행합니다.

앱 분할

일부 앱은 수천 개의 컨트롤과 수백 개의 데이터 소스로 성장하여 Power Apps Studio를 느리게 합니다. 긴 수식과 마찬가지로 큰 앱은 하나의 사용자 경험을 생성하기 위해 함께 작동하는 더 작은 섹션으로 분할될 수 있습니다.

별도의 캔버스 앱

한 가지 접근 방식은 별도의 캔버스 앱에서 섹션을 구현하고 Launch 함수를 사용하여 별도의 앱 간을 탐색하고 필요한 컨텍스트를 전달하는 것입니다.

이 접근 방식은 병원 비상 대응 샘플 솔루션에 사용되었습니다. 별도의 앱이 전체 앱의 각 주요 영역을 관리합니다. 앱은 각 앱이 시작 화면에 표시하는 구성 요소 라이브러리를 통해 공통 스위치보드 구성 요소를 공유합니다.

전화에서 실행되는 병원 비상 대응 샘플 솔루션 캔버스 앱의 스크린샷으로 스위치보드 캔버스 구성 요소를 보여줍니다.

사용자가 영역을 선택하면 구성 요소는 사용 가능한 앱과 구성 요소를 호스팅하는 앱에 대한 메타데이터를 사용합니다. 원하는 화면이 이 앱에 있으면(즉, ThisItem.Screen이 비어 있지 않음) Navigate 호출이 이루어집니다. 그러나 원하는 화면이 다른 앱에 있는 경우(즉, ThisItem.PowerAppID가 비어 있지 않음) 대상의 앱 ID 및 FacilityID 컨텍스트와 함께 Launch 함수가 사용됩니다.

If(
    IsBlank(ThisItem.Screen),
    If(IsBlank(ThisItem.PowerAppID), 
        Launch(ThisItem.URL),           
        Launch("/providers/Microsoft.PowerApps/apps/" & ThisItem.PowerAppID, 
               "FacilityID", Home_Facility_DD.Selected.Id)
    ),
    Navigate(
        ThisItem.Screen,
        Fade
    )
);

다른 앱이 실행되면 원래 앱의 상태가 손실됩니다. Launch 함수를 호출하기 전에 모든 상태를 저장해야 합니다. 데이터베이스에 쓰거나, SaveData를 호출하거나, Param 함수로 읽은 매개 변수를 사용하여 대상 앱에 상태를 전달합니다.

사용자 지정 페이지가 있는 모델 기반 앱

섹션은 사용자 지정 페이지로 구현할 수도 있습니다. 사용자 지정 페이지는 탐색을 위한 모델 기반 앱 컨테이너와 함께 미니 캔버스 앱 역할을 합니다.

참고

귀사의 설명서 언어 기본 설정에 대해 말씀해 주시겠습니까? 간단한 설문 조사에 응해주세요. (이 설문 조사는 영어로 되어 있습니다.)

이 설문 조사는 약 7분 정도 걸립니다. 개인 데이터는 수집되지 않습니다(개인정보처리방침).