configSource 어트리뷰트의 실용적인 활용 사례

app.config 파일이나 web.config 파일은 닷넷 기반 응용프로그램에서 응용프로그램의 동작이나 세세한 설정을 제어하는 유용한 파일입니다. 특히 web.config 파일은 ASP.NET 사이트 구축과 활용에 있어서 키 포인트가 되곤 하지요. 하지만 실전에서 web.config 파일은 생각보다 자주 바뀌어야 하고 그 때마다 번번히 동적 컴파일이 일어난다면 생각보다 용이하지 않고 불편할 것입니다. (특히 세션 서버를 외부에 배치하지 않고 In-Process 모드로 이용하여 구축한 경우 동적 컴파일이 발생할 때 마다 모든 사용자가 로그아웃되는 불상사가 발생하기도 합니다.)


이러한 문제점을 해결해주는 것이 configSource 어트리뷰트입니다. configSource 어트리뷰트를 이용하여 특정 Configuration Section의 Subset을 다른 XML 파일로부터 가져오도록 처리할 수 있으며, 해당 XML 파일의 내용이 바뀌더라도 동적 컴파일이 발생하지 않도록 유연성을 확보할 수 있습니다. 다음의 예시를 살펴보기로 하겠습니다. 바꿔야 할 상황이 상대적으로 많은 appSettings 섹션과 connectionStrings 섹션을 예로 들어봅니다.


<appSettings configSource=”App_DataAppSettings.xml”/>
<connectionStrings configSource=”App_DataConnectionStrings.xml”/>


매우 간단합니다! configSource에 상대 경로만 지정해주면 동적 컴파일에 대한 걱정 없이 편리하게 내용을 바꿀 수 있습니다. 그러면 실제로 App_DataAppSettings.xml 파일과 ConnectionStrings.xml 파일의 내용을 살펴보도록 하겠습니다.



<!– AppSettings.xml 파일 예시 –>
<?xml version=”1.0″ encoding=”utf-8″ standalone=”no” ?>
<appSettings>
    <!– Session 위조/변조를 막기 위하여 사용합니다. –>
    <add key=”SessionValidationKey” value=”4BD283757A7F42E3B76A79DB87A6865DB5117E17F20D4B5CADCC953714C9668B4623B2E0E369485A8C7CD06B2B2CC3F4″ />


    <!– 저작권 시작 연도 표기입니다. (종료 연도는 자동으로 현재 서버 시스템 날짜를 기준으로 확장됩니다.) –>
    <add key=”CopyrightBeginYear” value=”2008″ />


    <!– 저작권자 명칭입니다. –>
    <add key=”CopyrightOrgName” value=”rkttu” />


    <!– 저작권자 웹 사이트 주소입니다. –>
    <add key=”CopyrightOrgUrl” value=”” />
   
    <!– 관리자 E-MAIL 주소입니다. –>
    <add key=”AdminContact” value=”” />


    <!– 첨부 파일 저장 경로입니다. –>
    <add key=”ResourceFilePath” value=”C:Contents” />


    <!– 야후 API 키입니다. –>
    <add key=”YahooAPIKey” value=”k_LUIAbV34H9SK4UdGAN.LKVC9urWOfxKjXe00eQ2IsO_e4RsoO8djl1gfc-” />


    <!–
        클라이언트가 지원할 경우 GZIP이나 Deflate 압축을 사용할지 여부입니다.
        GZIP과 Deflate 압축을 동시에 지원하는 경우 GZIP을 사용하도록 설계되었습니다.
        NOTE: 서버의 자체적인 GZIP이나 Deflate 압축을 사용하는 경우 아래 설정을 False로 지정하십시오.
        –>
    <add key=”CompressEnabled” value=”False” />
</appSettings>



<!– ConnectionStrings.xml 파일 예시 –>
<?xml version=”1.0″ encoding=”utf-8″ standalone=”no” ?>
<connectionStrings>
    <add
        name=”MyConnectionString”
        connectionString=”Data Source=localhost;Initial Catalog=pubs;Persist Security Info=True;User ID=sa;Password=tiger”
        providerName=”System.Data.SqlClient” />
</connectionStrings>


기본 XML 파일의 형식을 유지한채 해당 Section의 내용을 Root로 삼아 각각의 파일의 내용이 들어있는 것을 확인하실 수 있습니다. standalone 어트리뷰트를 no로 표기한 것은 개인적인 편의를 위하여 사용한 것이므로 실제로는 중요하지 않습니다. (asp.net 처리기에는 영향이 없는 사항입니다. ^^)


이 파일들을 App_Data 폴더 안에 보관한 이유는 단순합니다. 이러한 형태의 XML 파일이 배치되기에 제일 적당하고, 내용이 노출되어서는 안될 사항들이므로 App_Data 폴더 밑에 배치한 것입니다. 실제로 이들 XML 파일을 찾기 위하여 URI를 입력해보면 403 또는 404 오류 코드가 반환되는 것을 보실 수 있습니다.


이 방법에는 한 가지 문제점이 존재하는데, Visual Studio의 웹 프로젝트 – 또는 – Visual Web Developer와의 호환성 문제입니다. Service Pack 1 버전을 이용하면 완화되지만 초기 버전의 경우 이렇게 configSource로 분리 지정하였을 경우 .NET Framework 3.5와 연결되도록 설정하였음에도 이를 인지하지 못하고 강제로 web.config 파일의 내용을 채워버립니다.


configSource 어트리뷰트가 지정된 섹션은 XML 규약 상으로는 올바르지만 asp.net 처리기의 입장에서 수용할 수 없는 설정으로 바뀝니다. 즉, configSource 어트리뷰트와 일반 설정을 동시에 포함할 수 없는 것이 현재의 한계입니다. (좀 더 신경을 썼다면 configSource의 내용을 먼저 읽고 나중에 지정된 설정을 따로 읽어 override하는 것으로 간주하는 것이 좋을것 같은데 아쉬운 부분입니다.) 이로 인하여 asp.net 프로젝트가 꼬이는 경우가 있을 수 있으니 버전이 낮은 개발 도구를 이용하여 웹 사이트 프로젝트를 열지 않도록 신경써주시기 바랍니다.


또한, Custom Tag를 포함하는 내용이나 Namespace Include 설정은 Visual Studio의 인텔리센스 기능을 자주 활용하시는 분이라면 별도로 분리하지 마시고 가급적 web.config 파일 안에 그대로 두시기 바랍니다. 인텔리센스가 다행히 이를 잘 처리해주기는 하나, 속도가 많이 느립니다.


이쯤에서 유용한 리스팅 하나를 공개하고 글을 마치겠습니다. configSource 어트리뷰트를 지원하는 XML 요소들을 나열해 보겠습니다. (완전하지 않을 수 있습니다만 보편적인 사례를 들어서 써봅니다.)



  • /configuration/appSettings

  • /configuration/configProtectedData

  • /configuration/connectionStrings

  • /configuration/system.codedom

  • /configuration/system.net/connectionManagement

  • /configuration/system.net/settings

  • /configuration/system.net/requestCaching

  • /configuration/system.net/authenticationModules

  • /configuration/system.net/defaultProxy

  • /configuration/system.net/webRequestModules

  • /configuration/system.net/mailSettings/smtp

  • /configuration/system.web/anonymousIdentification

  • /configuration/system.transactions/defaultSettings

  • /configuration/system.transactions/machineSettings

  • /configuration/system.web/authentication

  • /configuration/system.web/authorization

  • /configuration/system.web/caching/cache

  • /configuration/system.web/caching/outputCache

  • /configuration/system.web/caching/outputCacheSettings

  • /configuration/system.web/caching/sqlCacheDependency

  • /configuration/system.web/clientTargets

  • /configuration/system.web/compilation

  • /configuration/system.web/customErrors

  • /configuration/system.web/deployment

  • /configuration/system.web/deviceFilters

  • /configuration/system.web/globalization

  • /configuration/system.web/healthMonitoring

  • /configuration/system.web/hostingEnvironment

  • /configuration/system.web/httpCookies

  • /configuration/system.web/httpHandlers

  • /configuration/system.web/httpModules

  • /configuration/system.web/httpRuntime

  • /configuration/system.web/identity

  • /configuration/system.web/machineKey

  • /configuration/system.web/membership

  • /configuration/system.web/mobileControls

  • /configuration/system.web/pages

  • /configuration/system.web/processModel

  • /configuration/system.web/profile

  • /configuration/system.web/roleManager

  • /configuration/system.web/securityPolicy

  • /configuration/system.web/sessionState

  • /configuration/system.web/sessionStatePolicy

  • /configuration/system.web/siteMap

  • /configuration/system.web/trace

  • /configuration/system.web/trust

  • /configuration/system.web/urlMappings

  • /configuration/system.web/webControls

  • /configuration/system.web/webParts

  • /configuration/system.web/webServices

  • /configuration/system.web/xhtmlConformance

  • /configuration/system.web.extensions/scripting/scriptResourceHandler

  • /configuration/system.web.extensions/scripting/webServices/jsonSerialization

  • /configuration/system.web.extensions/scripting/webServices/authenticationService

  • /configuration/system.web.extensions/scripting/webServices/profileService

  • /configuration/system.web.extensions/scripting/webServices/roleService

  • /configuration/system.windows.forms

  • /configuration/system.xml.serialization/dateTimeSerialization

  • /configuration/system.xml.serialization/schemaImporterExtensions

  • /configuration/system.xml.serialization/xmlSerializer

참고로, IIS 7.0에서 사용하는 <system.webServer> 섹션은 configSource 어트리뷰트를 지원하지 않는 IIS 7.0만의 고유한 설정입니다.

댓글 남기기