구성 관리
참고 항목
이 전자책은 2017년 봄에 게시되었으며 그 이후로 업데이트되지 않았습니다. 이 책에는 귀중한 것들이 많이 있지만 일부 자료는 구식입니다.
설정을 사용하면 코드에서 앱의 동작을 구성하는 데이터를 분리할 수 있으므로 앱을 다시 빌드하지 않고도 동작을 변경할 수 있습니다. 설정에는 앱 설정과 사용자 설정의 두 가지 유형이 있습니다.
앱 설정은 앱이 만들고 관리하는 데이터입니다. 고정 웹 서비스 엔드포인트, API 키 및 런타임 상태와 같은 데이터를 포함할 수 있습니다. 앱 설정은 앱의 존재와 관련이 있으며 해당 앱에만 의미가 있습니다.
사용자 설정은 앱의 동작에 영향을 주며 자주 다시 조정할 필요가 없는 앱의 사용자 지정 가능한 설정입니다. 예를 들어 앱에서 사용자가 데이터를 검색할 위치와 화면에 표시하는 방법을 지정할 수 있습니다.
Xamarin.Forms 에는 설정 데이터를 저장하는 데 사용할 수 있는 영구 사전이 포함되어 있습니다. 이 사전은 속성을 사용하여 Application.Current.Properties
액세스할 수 있으며, 앱이 절전 상태로 전환될 때 저장되고 앱이 다시 시작되거나 다시 시작될 때 복원됩니다. 또한 Application
클래스에는 SavePropertiesAsync
필요한 경우 앱에서 해당 설정을 저장할 수 있는 메서드도 있습니다. 이 사전에 대한 자세한 내용은 속성 사전을 참조 하세요.
영구 사전을 사용하여 Xamarin.Forms 데이터를 저장하는 단점은 데이터가 쉽게 바인딩되지 않는다는 것입니다. 따라서 eShopOnContainers 모바일 앱은 NuGet에서 사용할 수 있는 Xam.Plugins.Settings 라이브러리를 사용합니다. 이 라이브러리는 각 플랫폼에서 제공하는 네이티브 설정 관리를 사용하는 동시에 앱 및 사용자 설정을 유지 및 검색하기 위한 일관되고 형식이 안전한 플랫폼 간 접근 방식을 제공합니다. 또한 데이터 바인딩을 사용하여 라이브러리에서 노출하는 설정 데이터에 액세스하는 것은 간단합니다.
참고 항목
Xam.Plugin.Settings 라이브러리는 앱과 사용자 설정을 모두 저장할 수 있지만 두 설정을 구분하지 않습니다.
설정 클래스 만들기
Xam.Plugins.Settings 라이브러리를 사용하는 경우 앱에 필요한 앱 및 사용자 설정을 포함하는 단일 정적 클래스를 만들어야 합니다. 다음 코드 예제에서는 eShopOnContainers 모바일 앱의 설정 클래스를 보여줍니다.
public static class Settings
{
private static ISettings AppSettings
{
get
{
return CrossSettings.Current;
}
}
...
}
설정은 Xam.Plugins.Settings 라이브러리에서 제공하는 API를 통해 ISettings
읽고 쓸 수 있습니다. 이 라이브러리는 API에 액세스하는 데 사용할 수 있는 싱글톤을 제공하며, CrossSettings.Current
앱의 설정 클래스는 속성을 통해 이 싱글톤을 ISettings
노출해야 합니다.
참고 항목
Plugin.Settings 및 Plugin.Settings.Abstractions 네임스페이스에 대한 지시문을 사용하여 Xam.Plugins.Settings 라이브러리 형식에 액세스해야 하는 클래스에 추가해야 합니다.
설정 추가
각 설정은 키, 기본값 및 속성으로 구성됩니다. 다음 코드 예제에서는 eShopOnContainers 모바일 앱이 연결하는 온라인 서비스 대한 기본 URL을 나타내는 사용자 설정에 대한 세 가지 항목을 모두 보여 줍니다.
public static class Settings
{
...
private const string IdUrlBase = "url_base";
private static readonly string UrlBaseDefault = GlobalSetting.Instance.BaseEndpoint;
...
public static string UrlBase
{
get
{
return AppSettings.GetValueOrDefault<string>(IdUrlBase, UrlBaseDefault);
}
set
{
AppSettings.AddOrUpdateValue<string>(IdUrlBase, value);
}
}
}
키는 항상 키 이름을 정의하는 const 문자열이며, 설정의 기본값은 필수 형식의 정적 읽기 전용 값입니다. 기본값을 제공하면 설정되지 않은 설정을 검색할 경우 유효한 값을 사용할 수 있습니다.
정적 속성은 UrlBase
API의 두 가지 메서드를 ISettings
사용하여 설정 값을 읽거나 씁니다. 이 ISettings.GetValueOrDefault
메서드는 플랫폼별 스토리지에서 설정의 값을 검색하는 데 사용됩니다. 설정에 대해 정의된 값이 없으면 해당 기본값이 대신 검색됩니다. 마찬가지로 이 ISettings.AddOrUpdateValue
메서드는 설정 값을 플랫폼별 스토리지에 유지하는 데 사용됩니다.
클래스 내에서 기본값을 Settings
정의하는 대신 문자열은 UrlBaseDefault
클래스에서 GlobalSetting
해당 값을 가져옵니다. 다음 코드 예제에서는 이 클래스의 BaseEndpoint
속성과 UpdateEndpoint
메서드를 보여줍니다.
public class GlobalSetting
{
...
public string BaseEndpoint
{
get { return _baseEndpoint; }
set
{
_baseEndpoint = value;
UpdateEndpoint(_baseEndpoint);
}
}
...
private void UpdateEndpoint(string baseEndpoint)
{
RegisterWebsite = string.Format("{0}:5105/Account/Register", baseEndpoint);
CatalogEndpoint = string.Format("{0}:5101", baseEndpoint);
OrdersEndpoint = string.Format("{0}:5102", baseEndpoint);
BasketEndpoint = string.Format("{0}:5103", baseEndpoint);
IdentityEndpoint = string.Format("{0}:5105/connect/authorize", baseEndpoint);
UserInfoEndpoint = string.Format("{0}:5105/connect/userinfo", baseEndpoint);
TokenEndpoint = string.Format("{0}:5105/connect/token", baseEndpoint);
LogoutEndpoint = string.Format("{0}:5105/connect/endsession", baseEndpoint);
IdentityCallback = string.Format("{0}:5105/xamarincallback", baseEndpoint);
LogoutCallback = string.Format("{0}:5105/Account/Redirecting", baseEndpoint);
}
}
속성을 설정할 때마다 BaseEndpoint
메서드가 UpdateEndpoint
호출됩니다. 이 메서드는 eShopOnContainers 모바일 앱이 연결하는 여러 엔드포인트를 나타내는 클래스에서 제공하는 Settings
사용자 설정을 기반으로 UrlBase
하는 일련의 속성을 업데이트합니다.
사용자 설정에 대한 데이터 바인딩
eShopOnContainers 모바일 앱 SettingsView
에서 두 개의 사용자 설정을 노출합니다. 이러한 설정을 통해 앱이 Docker 컨테이너로 배포된 마이크로 서비스에서 데이터를 검색해야 하는지 또는 앱이 인터넷 연결이 필요하지 않은 모의 서비스에서 데이터를 검색해야 하는지 여부를 구성할 수 있습니다. 컨테이너화된 마이크로 서비스에서 데이터를 검색하도록 선택할 때 마이크로 서비스에 대한 기본 엔드포인트 URL을 지정해야 합니다. 그림 7-1은 사용자가 컨테이너화된 마이크로 서비스에서 데이터를 검색하도록 선택한 경우를 보여 SettingsView
줍니다.
그림 7-1: eShopOnContainers 모바일 앱에서 노출하는 사용자 설정
데이터 바인딩을 사용하여 클래스에서 노출하는 Settings
설정을 검색하고 설정할 수 있습니다. 이는 뷰 바인딩의 컨트롤이 클래스의 속성 Settings
에 액세스하는 모델 속성을 보고 설정 값이 변경된 경우 속성 변경 알림을 발생시키는 방식으로 수행됩니다. eShopOnContainers 모바일 앱이 보기 모델을 생성하고 뷰에 연결하는 방법에 대한 자세한 내용은 보기 모델 로케이터를 사용하여 보기 모델 자동 만들기를 참조하세요.
다음 코드 예제에서는 사용자가 컨테이너화된 마이크로 서비스에 대한 기본 엔드포인트 URL을 입력할 수 있는 컨트롤 SettingsView
을 보여 Entry
줍니다.
<Entry Text="{Binding Endpoint, Mode=TwoWay}" />
이 Entry
컨트롤은 양방향 바인딩을 사용하여 SettingsViewModel
클래스의 Endpoint
속성에 바인딩됩니다. 다음 코드 예제에서는 엔드포인트 속성을 보여줍니다.
public string Endpoint
{
get { return _endpoint; }
set
{
_endpoint = value;
if(!string.IsNullOrEmpty(_endpoint))
{
UpdateEndpoint(_endpoint);
}
RaisePropertyChanged(() => Endpoint);
}
}
속성이 Endpoint
설정 UpdateEndpoint
되면 제공된 값이 유효하고 속성 변경 알림이 발생하는 경우 메서드가 호출됩니다. 다음 코드 예제는 UpdateEndpoint
메서드를 보여줍니다.
private void UpdateEndpoint(string endpoint)
{
Settings.UrlBase = endpoint;
}
이 메서드는 UrlBase
사용자가 입력한 기본 엔드포인트 URL 값으로 클래스의 속성을 Settings
업데이트하므로 플랫폼별 스토리지에 유지됩니다.
탐색할 SettingsView
때 클래스의 InitializeAsync
메서드가 SettingsViewModel
실행됩니다. 다음 코드 예제에서는 이 메서드를 보여줍니다.
public override Task InitializeAsync(object navigationData)
{
...
Endpoint = Settings.UrlBase;
...
}
메서드는 클래스의 Endpoint
속성 값으로 UrlBase
Settings
속성을 설정합니다. 속성에 UrlBase
액세스하면 Xam.Plugins.Settings 라이브러리가 플랫폼별 스토리지에서 설정 값을 검색합니다. 메서드가 InitializeAsync
호출되는 방법에 대한 자세한 내용은 탐색 중에 매개 변수 전달을 참조하세요.
이 메커니즘은 사용자가 SettingsView로 이동할 때마다 플랫폼별 스토리지에서 사용자 설정을 검색하고 데이터 바인딩을 통해 표시되도록 합니다. 그런 다음 사용자가 설정 값을 변경하는 경우 데이터 바인딩은 플랫폼별 스토리지에 즉시 다시 유지되도록 합니다.
요약
설정을 사용하면 코드에서 앱의 동작을 구성하는 데이터를 분리할 수 있으므로 앱을 다시 빌드하지 않고도 동작을 변경할 수 있습니다. 앱 설정은 앱이 만들고 관리하는 데이터이며, 사용자 설정은 앱의 동작에 영향을 주며 자주 다시 조정할 필요가 없는 앱의 사용자 지정 가능한 설정입니다.
Xam.Plugins.Settings 라이브러리는 앱 및 사용자 설정을 유지 및 검색하기 위한 일관되고 형식이 안전한 플랫폼 간 접근 방식을 제공하며, 데이터 바인딩을 사용하여 라이브러리로 만든 설정에 액세스할 수 있습니다.