애플리케이션 설정 아키텍처

이 항목에서는 애플리케이션 설정 아키텍처가 작동하는 방식과 그룹화된 설정 및 설정 키와 같은 고급 아키텍처 기능에 대해 설명합니다.

애플리케이션 설정 아키텍처에서는 애플리케이션 범위 또는 사용자 범위로 강력한 형식의 설정을 정의하고 애플리케이션 세션 간에 설정을 유지할 수 있습니다. 또한 이 아키텍처는 로컬 파일 시스템에 설정을 저장하고 해당 시스템에서 설정을 로드하기 위한 기본 지속성 엔진을 제공하며, 사용자 지정 지속성 엔진을 제공하기 위한 인터페이스도 정의합니다.

애플리케이션에서 사용자 지정 구성 요소를 호스팅할 때 구성 요소 자체의 설정을 유지할 수 있도록 하는 인터페이스가 제공됩니다. 설정 키를 사용하면 구성 요소에서 구성 요소의 여러 인스턴스에 대한 설정을 개별적으로 유지할 수 있습니다.

설정 정의

애플리케이션 설정 아키텍처는 ASP.NET과 Windows Forms 모두에서 사용되며, 두 환경 간에 공유되는 많은 기본 클래스를 포함합니다. 가장 중요한 클래스는 컬렉션을 통해 설정에 액세스할 수 있는 SettingsBase이며 설정을 로드하고 저장하기 위한 하위 수준 메서드를 제공합니다. 각 환경에서는 SettingsBase에서 파생되는 자체 클래스를 구현하여 해당 환경에 대한 추가 설정 기능을 제공합니다. Windows Forms 기반 애플리케이션에서 모든 애플리케이션 설정은 ApplicationSettingsBase 클래스에서 파생된 클래스에서 정의해야 하며, 이 클래스는 기본 클래스에 다음과 같은 기능을 추가합니다.

  • 상위 수준 로드 및 저장 작업

  • 사용자 범위 설정 지원

  • 사용자 설정을 미리 정의된 기본값으로 되돌리기

  • 이전 애플리케이션 버전에서 설정 업그레이드

  • 변경하거나 저장하기 전에 설정에 대한 유효성 검사

설정은 System.Configuration 네임스페이스에 정의된 여러 특성을 사용하여 설명할 수 있으며, 애플리케이션 설정 특성에 설명되어 있습니다. 설정을 정의할 때 설정이 전체 애플리케이션에 적용되는지 아니면 현재 사용자에게만 적용되는지를 설명하는 ApplicationScopedSettingAttribute 또는 UserScopedSettingAttribute를 사용하여 적용해야 합니다.

다음 코드 예제에서는 단일 설정인 BackgroundColor를 사용하여 사용자 지정 설정 클래스를 정의합니다.

using System;
using System.Configuration;
using System.Drawing;

public class MyUserSettings : ApplicationSettingsBase
{
    [UserScopedSetting()]
    [DefaultSettingValue("white")]
    public Color BackgroundColor
    {
        get
        {
            return ((Color)this["BackgroundColor"]);
        }
        set
        {
            this["BackgroundColor"] = (Color)value;
        }
    }
}
Imports System.Configuration

Public Class MyUserSettings
    Inherits ApplicationSettingsBase
    <UserScopedSetting()> _
    <DefaultSettingValue("white")> _
    Public Property BackgroundColor() As Color
        Get
            BackgroundColor = Me("BackgroundColor")
        End Get

        Set(ByVal value As Color)
            Me("BackgroundColor") = value
        End Set
    End Property
End Class

설정 지속성

ApplicationSettingsBase 클래스 자체는 설정을 유지하거나 로드하지 않습니다. 이 작업은 SettingsProvider에서 파생된 클래스인 설정 공급자에 속합니다. ApplicationSettingsBase의 파생 클래스가 SettingsProviderAttribute를 통해 설정 공급자를 지정하지 않으면 기본 공급자인 LocalFileSettingsProvider이 사용됩니다.

.NET Framework에서 처음 출시된 구성 시스템은 로컬 컴퓨터의 machine.config 파일 또는 애플리케이션과 함께 배포되는 app.exe.config 파일을 통해 정적 애플리케이션 구성 데이터를 제공할 수 있습니다. LocalFileSettingsProvider 클래스는 다음과 같은 방식으로 이 기본 지원을 확장합니다.

  • 애플리케이션 범위 설정은 machine.config 또는 app.exe.config 파일에 저장될 수 있습니다. Machine.config는 항상 읽기 전용이지만, app.exe.config는 보안 고려 사항에 따라 대부분의 애플리케이션에서 읽기 전용으로 제한됩니다.

  • 사용자 범위 설정은 app.exe.config 파일에 저장될 수 있으며, 이 경우 정적 기본값으로 처리됩니다.

  • 기본이 아닌 사용자 범위 설정은 새 파일 user.config에 저장됩니다. DefaultSettingValueAttribute를 사용하여 사용자 범위 설정의 기본값을 지정할 수 있습니다. 사용자 범위 설정이 애플리케이션 실행 중에 자주 변경되기 때문에 user.config는 항상 읽기/쓰기입니다. 자세한 내용은 사용자 범위 설정이 저장되는 위치를 참조하세요.

세 가지 구성 파일은 모두 설정을 XML 형식으로 저장합니다. 애플리케이션 범위 설정의 최상위 XML 요소는 <appSettings>이며, 사용자 범위 설정에는 <userSettings>가 사용됩니다. 애플리케이션 범위 설정과 사용자 범위 설정의 기본값을 모두 포함하는 app.exe.config 파일은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </sectionGroup>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="Cursor" serializeAs="String">
                <value>Default</value>
            </setting>
            <setting name="DoubleBuffering" serializeAs="String">
                <value>False</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
    </applicationSettings>
    <userSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="FormTitle" serializeAs="String">
                <value>Form1</value>
            </setting>
            <setting name="FormSize" serializeAs="String">
                <value>595, 536</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
    </userSettings>
</configuration>

구성 파일의 애플리케이션 설정 섹션에 있는 요소의 정의는 애플리케이션 설정 스키마를 참조하세요.

설정 바인딩

애플리케이션 설정은 Windows Forms 데이터 바인딩 아키텍처를 사용하여 설정 개체와 구성 요소 간의 양방향 통신으로 설정 업데이트를 제공합니다. Visual Studio에서 애플리케이션 설정을 만들어 구성 요소 속성에 할당하면 이러한 바인딩이 자동으로 생성됩니다.

IBindableComponent 인터페이스를 지원하는 구성 요소에만 애플리케이션 설정을 바인딩할 수 있습니다. 또한 구성 요소는 바인딩된 특정 속성에 대한 변경 이벤트를 구현하거나 INotifyPropertyChanged 인터페이스를 통해 속성이 변경되었음을 애플리케이션 설정에 알려야 합니다. 구성 요소에서 IBindableComponent를 구현하지 않고 Visual Studio를 통해 바인딩하는 경우 바인딩된 속성이 처음 설정되지만 업데이트되지는 않습니다. 구성 요소에서 IBindableComponent를 구현하지만 속성 변경 알림을 지원하지 않는 경우 속성이 변경될 때 바인딩은 설정 파일에서 업데이트되지 않습니다.

ToolStripItem과 같은 일부 Windows Forms 구성 요소는 설정 바인딩을 지원하지 않습니다.

설정 직렬화(Serialization)

LocalFileSettingsProvider가 설정을 디스크에 저장해야 하는 경우 다음 작업을 수행합니다.

  1. 리플렉션을 사용하여 ApplicationSettingsBase 파생 클래스에 정의된 모든 속성을 검사하고 ApplicationScopedSettingAttribute 또는 UserScopedSettingAttribute에 적용된 속성을 찾습니다.

  2. 속성을 디스크에 직렬화합니다(serialize). 먼저 유형의 연결된 TypeConverter에서 ConvertToString 또는 ConvertFromString을 호출하려고 시도합니다. 호출하지 못하면 XML serialization을 대신 사용합니다.

  3. 설정의 특성에 따라 어떤 파일에 어떤 설정을 사용할지 결정합니다.

고유한 설정 클래스를 구현하는 경우 SettingsSerializeAsAttribute를 사용하여 SettingsSerializeAs 열거형을 사용하여 이진 또는 사용자 정의 직렬화에 대한 설정을 표시할 수 있습니다. 코드에서 사용자 고유의 설정 클래스를 만드는 방법에 대한 자세한 내용은 방법: 애플리케이션 설정 만들기를 참조하세요.

설정 파일 위치

app.exe.config 및 user.config 파일의 위치는 애플리케이션을 설치하는 방법에 따라 다릅니다. Windows Forms 기반 애플리케이션을 로컬 컴퓨터에 복사한 경우 app.exe.config는 애플리케이션의 주 실행 파일의 기본 디렉터리와 동일한 디렉터리에 있고, user.config는 Application.LocalUserAppDataPath 속성에 지정된 위치에 있습니다. ClickOnce를 사용하여 애플리케이션을 설치한 경우 이 두 파일은 모두 %InstallRoot%\Documents and Settings\username\Local Settings 아래의 ClickOnce 데이터 디렉터리에 있습니다.

사용자가 로밍 프로필을 사용하도록 설정한 경우 한 도메인 내에서 다른 컴퓨터를 사용할 때 다른 Windows 및 애플리케이션 설정을 정의할 수 있으므로 이러한 파일의 스토리지 위치는 약간 다릅니다. 이 경우 ClickOnce 애플리케이션과 ClickOnce가 아닌 애플리케이션에서는 모두 app.exe.config 및 user.config 파일이 %InstallRoot%\Documents and Settings\username\Application Data에 저장되어 있습니다.

애플리케이션 설정 기능이 새로운 배포 기술을 통해 작동하는 방법에 대한 자세한 내용은 ClickOnce 및 애플리케이션 설정을 참조하세요. ClickOnce 데이터 디렉터리에 대한 자세한 내용은 ClickOnce 애플리케이션의 로컬 및 원격 데이터 액세스를 참조하세요.

애플리케이션 설정 및 보안

애플리케이션 설정은 인터넷이나 인트라넷에서 호스팅되는 Windows Forms 애플리케이션의 기본적인 제한된 환경인 부분 신뢰 환경에서 작동하도록 설계되었습니다. 기본 설정 공급자를 포함한 애플리케이션 설정을 사용하는 데에는 부분 신뢰 권한만 필요합니다.

ClickOnce 애플리케이션에서 애플리케이션 설정을 사용하면 user.config 파일이 ClickOnce 데이터 디렉터리에 저장됩니다. 애플리케이션의 user.config 파일 크기는 ClickOnce에서 설정된 데이터 디렉터리 할당량을 초과할 수 없습니다. 자세한 내용은 ClickOnce 및 애플리케이션 설정을 참조하세요.

사용자 지정 설정 공급자

애플리케이션 설정 아키텍처에는 ApplicationSettingsBase에서 파생된 애플리케이션 설정 래퍼 클래스와 SettingsProvider에서 파생되어 연결된 설정 공급자 또는 공급자 간에 느슨하게 결합되어 있습니다. 이러한 연결은 래퍼 클래스 또는 해당 개별 속성에 적용된 SettingsProviderAttribute에서만 정의됩니다. 설정 공급자가 명시적으로 지정되지 않으면 기본 공급자인 LocalFileSettingsProvider가 사용됩니다. 따라서 이 아키텍처는 사용자 지정 설정 공급자를 만들고 사용할 수 있도록 지원합니다.

예를 들어 Microsoft SQL Server 데이터베이스에 모든 설정 데이터를 저장하는 공급자인 SqlSettingsProvider를 개발하여 사용한다고 가정합니다. SettingsProvider 파생 클래스는 Initialize 메서드에서 이 정보를 System.Collections.Specialized.NameValueCollection 형식의 매개 변수로 수신합니다. 그런 다음, GetPropertyValues 메서드를 구현하여 데이터 저장소에서 설정을 검색하고 SetPropertyValues를 구현하여 저장합니다. 공급자는 GetPropertyValues에 제공된 SettingsPropertyCollection을 사용하여 속성의 이름, 유형, 범위에 더해 해당 속성에 대해 정의된 기타 설정 특성을 결정할 수 있습니다.

공급자는 구현이 분명하지 않은 속성 하나와 메서드 하나를 구현해야 합니다. ApplicationName 속성은 SettingsProvider의 추상 속성입니다. 다음을 반환하도록 프로그래밍해야 합니다.

public override string ApplicationName
{
    get
    {
        return (System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }
    set
    {
        // Do nothing.
    }
}
Public Overrides Property ApplicationName() As String
    Get
        ApplicationName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
    End Get
    Set(ByVal value As String)
        ' Do nothing.
    End Set
End Property

또한 파생 클래스는 인수를 사용하지 않고 값을 반환하지 않는 Initialize 메서드도 구현해야 합니다. 이 메서드는 SettingsProvider에 의해 정의되지 않았습니다.

마지막으로, 설정을 새로 고치고, 이 설정을 기본값으로 되돌리고, 애플리케이션 버전 간에 설정을 업그레이드할 수 있도록 공급자에 IApplicationSettingsProvider를 구현합니다.

공급자를 구현하고 컴파일했으면 설정 클래스에서 기본값 대신 이 공급자를 사용하도록 지시해야 합니다. SettingsProviderAttribute를 통해 이 작업을 수행합니다. 공급자를 전체 설정 클래스에 적용했으면 해당 클래스에서 정의하는 각 설정에 이 공급자를 사용하고, 개별 설정에 적용했으면 애플리케이션 설정 아키텍처에서 해당 설정에만 이 공급자를 사용하고 나머지 설정에는 LocalFileSettingsProvider를 사용합니다. 다음 코드 예제에서는 사용자 지정 공급자를 사용하도록 설정 클래스에 지시하는 방법을 보여 줍니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace ApplicationSettingsArchitectureCS
{
    [SettingsProvider("SqlSettingsProvider")]
    class CustomSettings : ApplicationSettingsBase
    {
        // Implementation goes here.
    }
}
Imports System.Configuration

<SettingsProvider("SqlSettingsProvider")> _
Public Class CustomSettings
    Inherits ApplicationSettingsBase

    ' Implementation goes here.
End Class

한 공급자를 여러 스레드에서 동시에 호출할 수 있지만, 공급자가 항상 동일한 스토리지 위치에 쓰므로 애플리케이션 아키텍처는 공급자 클래스의 단일 인스턴스만 인스턴스화합니다.

중요

공급자가 스레드로부터 안전하며 구성 파일에 쓸 수 있는 스레드를 한 번에 하나씩 허용하는지 확인해야 합니다.

공급자가 System.Configuration 네임스페이스에 정의된 모든 설정 특성을 지원할 필요는 없지만 최소한 ApplicationScopedSettingAttributeUserScopedSettingAttribute를 지원해야 하고 DefaultSettingValueAttribute도 지원해야 합니다. 지원하지 않는 특성에 대해서는 공급자가 알림 없이 실패해야 하며 예외를 throw하면 안됩니다. 그러나 설정 클래스가 동일한 설정에 ApplicationScopedSettingAttributeUserScopedSettingAttribute를 적용하는 것과 같이 잘못된 속성 조합을 사용하는 경우 공급자는 예외를 throw하고 작업을 중지해야 합니다.

참고 항목