개인적인 사이트라면 모를까.. 점점 사이트 규모가 커지면 그곳에 필요한 설정 정보들 또한 굉장히 많이 늘어나게 될겁니다. Web.Config 라인수가 200 라인 넘어가게 되면 이거 영~ 찾기도 힘들고…
 
그럼 어떻게 하면 될까… Web.Config 를 여러 개의 파일로 쪼개어 연관성 있는 정보들만 묶으면 되지 않을까? 좋다.. 또는 관련된 섹션끼리 묶을 수 없을까??
그럼 한번 해보자..
 
다음과 같이 실습에 필요한 Config 파일을 만들어 봅시다.
Web.Config
기본 생성되는 파일
Umc.Core.Config
Core 모듈에 설정이 들어가는 파일
Umc.Message.Config
Message 관련 설정이 들어가는 파일
 
그리고 다음과 같이 Web.Config 에 추가해봅시다.
<configuration>
        <configSections>
               <!-- Web.Config 섹션 설정-->
               <sectionname="Umc.Web"type="Umc.Core.Web.UmcConfigurationSectionHandler, Umc.Core"/>
               <sectionname="Umc.Core"type="Umc.Core.Web.UmcConfigurationSectionHandler, Umc.Core"/>
               <sectionname="Umc.Message"type="Umc.Core.Web.UmcConfigurationFileAttributeHandler, Umc.Core"/>
        </configSections>
 
Section name 에서는 섹션의 이름과,
Type 에서는 섹션 처리를 담당할 클래스, 그리고 콤마뒤에는 어셈블리 이름(DLL 을 뺀)을 등록합니다.
 
그럼 위 Web.Config 에서 type 에 등록한 클래스를 만들어 봅시다.
 
UmcConfigurationSectionHandler.cs
using System;
using System.Configuration;
using System.Collections.Generic;
using System.Text;
 
namespace Umc.Core.Web
{
        ///<summary>
        /// Web.Config 의섹션을구성하는핸들러
        ///</summary>
        public class UmcConfigurationSectionHandler : System.Configuration.NameValueSectionHandler
        {
        }
}
 
UmcConfigurationFileAttributeHandler.cs
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Umc.Core.Web
{
        ///<summary>
        /// Web.Config 의file 특성을처리하는핸들러
        ///</summary>
        public class UmcConfigurationFileAttributeHandler
               : System.Configuration.NameValueFileSectionHandler
        {
               public UmcConfigurationFileAttributeHandler()
               {
               }
        }
}
 
줸장~ 보는대로 소스는 텅텅~ 비었습니다.
텅 비었다고 생각하지 말아주세요. 각각 섹션 핸들러를 상속받아 쓰고 우리의 프로젝트에 포함시키려
한 것 뿐입니다^^
이걸로 섹션 처리기는 완성이 되었습니다.
 
그럼 이제 이것을 활용할 수 있도록 클래스를 하나 만들어 보겠습니다.
using System;
using System.Configuration;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Text;
using System.Web;
 
namespace Umc.Core
{
        ///<summary>
        ///환경설정내용을가져온다..
        ///</summary>
        public class UmcConfiguration
        {
               public static string ConnectionString
               {
                       get
                       {
                              return ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
                       }
               }
 
               ///<summary>
               /// Umc.Web Configuration 을가져온다.
               ///</summary>
               public static NameValueCollection Web
               {
                       get
                       {
                              return (NameValueCollection)ConfigurationManager.GetSection("Umc.Web");
                       }
               }
 
               ///<summary>
               /// Umc.Core Configuration 을가져온다.
               ///</summary>
               public static NameValueCollection Core
               {
                       get
                       {
                              return (NameValueCollection)ConfigurationManager.GetSection("Umc.Core");
                       }
               }
 
               ///<summary>
               /// Umc.Message COnfiguration 을가져온다.
               ///</summary>
               public static NameValueCollection Message
               {
                       get
                       {
                              return (NameValueCollection)ConfigurationManager.GetSection("Umc.Message");
                       }
               }
        }
}
 
 
우리는 섹션의 타입을 NameValueSectionHandler 을 상속받은 처리기를 만들었으므로, 리턴값도 NameValueCollection 으로 리턴할 수 있습니다.
 
이제 적당한 config 파일을 만들어 보도록 할게요
<?xmlversion="1.0"?>
<configuration>
               <!-- Web.Config 설정 섹션 -->
               <sectionname="Umc.Web"type="Umc.Core.Web.UmcConfigurationSectionHandler, Umc.Core"/>
               <sectionname="Umc.Core"type="Umc.Core.Web.UmcConfigurationSectionHandler, Umc.Core"/>
               <sectionname="Umc.Message"type="Umc.Core.Web.UmcConfigurationFileAttributeHandler, Umc.Core"/>
        </configSections>
.
.
<!-- Database 연결 -->
        <connectionStrings>
               <addname="ConnectionString"connectionString="server=(Local); database=UmcBlog; uid=sa; pwd=anjfqhk"/>
        </connectionStrings>
        <Umc.Web>
               <addkey="umc"value="엄씨야~~" />
        </Umc.Web>
        <Umc.Core>
 <addkey="umc.core"value="코어관련 셋팅" />
        </Umc.Core>
        <Umc.Messagefile="Umc.Message.Config">
        </Umc.Message>
 
Umc.Message 섹션을 잘 보면, file 속성을 사용하는 것을 볼 수 있습니다.
이것은 지정한 파일을 현재 config로 가져올 수 있습니다. 소위 include 할 수 있다는 것이지요.
 
Umc.Message.Config
<?xmlversion="1.0"encoding="utf-8"?>
<Umc.Message>
        <addkey="umcMessage"value="메시지"></add>
</Umc.Message>
 
이제 마지막으로 샘플 페이지를 만들어 볼게요.
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
               string sectionValue = Umc.Core.UmcConfiguration.Message["umcMessage"];
               Response.Write( sectionValue );
    }
}
 
비쥬얼스튜디오 2005 기준으로 작성이 되었구여.. 2003 버전에서는 GetSection 대신 GetConfig를 사용하시면 됩니다.
어렵지 않게 구현할 수 있는건데, 제가 설명하려니 길어지고 오히려 난해해지네요 ㅋ^^;;
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 음.... 2010.03.17 07:56 신고 Address Modify/Delete Reply

    좋은 내용이네요 잘보고 갑니다^^

  2. smstyle 2010.05.05 14:04 신고 Address Modify/Delete Reply

    댓글로 문의드립니다.
    해당 아티클의 방식을 적용하여 사용중에 있는데요.
    인클루드 시켜 사용하는 파일(여기서는 Umc.Message.Config)의 내용을 변경한 경우,
    그 변경된 내용이 바로 반영되지 않고 iis를 재시작해야만 변경사항이 반영되고 있어서요.

    System.Configuration.ConfigurationManager.RefreshSection("SectionName";);

    처럼 설정파일의 내용을 리프레쉬 시킬수 있는 방법이 없을까요?