본문 바로가기
IT-개발,DB

[개발] [asp.net] ResourcesManager를 이용한 GlobalResource 사용하기

by SB리치퍼슨 2010. 10. 26.

private void Page_Load(object sender, System.EventArgs e)
{
    string fullName = "SampleProject.Resources.AppResources";

    System.Reflection.Assembly Assem = System.Reflection.Assembly.GetExecutingAssembly();
    ResourceManager appResourceMgr = new ResourceManager(fullName, Assem);

    Button1.Text = appResourceMgr.GetString("Msg.Click");
    Label1.Text = appResourceMgr.GetString("Msg.Welcome");
}

 

 

실제 Resx 파일로부터 데이터를 가져오기 위해서 필요한 핵심 클래스는 바로 ResourceManager 입니다. 이 친구가 특정 resx 파일로부터 우리가 원하는 데이터를 뽑아올 수 있도록 도와주는 클래스이거든요. 이 클래스의 더욱 구체적인 설명은 MSDN에서 한번 찾아보시길 권해드립니다.

일단, ResourceManager 클래스는요. 사용법이 간단합니다. 클래스의 인스턴스를 만들면서 생성자에 2가지의 매개변수를 지정해 주시면 되거든요. 즉, 우리가 사용하려는 리소스 파일의 논리적인 이름(전체 이름)을 첫번째 인자로 그리고, 사용하려는 리소스 파일이 들어있는 어셈블리를 두번째 인자로 지정해 주시면 되는 것입니다.

그렇다면, 우리가 사용하려는 리소스 파일의 논리적인 이름 즉, 루트 이름은 어떻게 알 수 있을까요? 이 이름은 네임스페이스를 포함한 리소스의 명칭을 말하는 것이잖습니까? 그렇기에, 일단 그 명칭의 시작은 프로젝트의 네임스페이스인 SampleProject. 으로 시작하겠죠? 그리고, 현재 Resources 라는 폴더안에 들어있으므로, 완전한 명칭은 SampleProject.Resources.AppResources이 될 것입니다.

물론, 이것은 C#인 경우 그런 것이구요. VB.NET으로 프로젝트를 만드셨다면 이야기가 약간 달라집니다. 왜냐하면, C#은 기본적으로 컴파일 시에, 폴더가 있으면 그 폴더 이름을 네임스페이스에 추가해서 달고 가는 반면, VB.NET은 그 폴더명을 무시하거든요. 즉, 현재의 경우 C# 프로젝트이고, 우리가 사용하려는 리소스 파일이 Resources 폴더 안에 있으니,

SampleProject.Resources.AppResources

가 완전한 리소스 파일의 논리적인 이름이 되겠지만, VB.NET의 경우는 폴더명을 무시하기에

SampleProject.AppResources

가 된다는 것입니다. ^^;; (맨 뒤에 .resx가 없는 것에 주의하세요 ^^)

 

근데, 왜 그림에서는 경로의 마지막에 .resources 라는 것이 붙어있냐고 물어보시려 하시는구려~

그것은 이것이 리소스 파일이기 때문에 붙여지는 것이랍니다. 원래 우리눈에 보기에 .resx 였던 것의 본명이 제대로 붙여진 것이지요 ^^;; 하지만, ResourceManager 클래스를 이용해서 리소스 파일을 로드하는 경우에는 전체 경로에서 .resources 라는 부분은 무시하셔도 됩니다. 왜냐하면, ResourceManager 를 이용하면 이 친구는 알아서 .resources로 끝나는 리소스들을 찾게 되니까요 ^^

자. 장황하긴 했지만 특정 리소스 파일의 논리적인 루트경로를 어떻게 알아낼 수 있는지 이야기를 해 보았습니다. 이제 다시 원래의 소스코드로 돌아가서 이야기를 계속해 보겠습니다. 우리의 소스 코드의 두번째 라인은 다음과 같았습니다.

System.Reflection.Assembly Assem = System.Reflection.Assembly.GetExecutingAssembly();

이 코드는 무엇을 의미하는 것일까요? 이는 .NET 리플렉션이라는 기법을 이용하고 있는 것인데요. 이 코드의 의미는 바로 현재 구동중인 어셈블리 자체를 얻어오는 것입니다. 우리가 사용하고자 하는 리소스 파일이 현재 실행되고 있는 어셈블리에 들어있으므로, 이를 .NET 리플렉션을 이용해서 얻어오는 것이죠. 말은 어려울지 모르지만 코드는 매우 간단합니다.

즉, System.Reflection.Assembly.GetExecutingAssembly() 라는 코드를 이용하시면 현재 실행중이 DLL이나 EXE 어셈블리 자체를 얻어올 수가 있게 됩니다. 왜 이 어셈블리를 얻어오냐구요? 음.... 앞에서 집중을 조금 덜 하셨었군여!!!

ResourceManager 클래스의 생성자가 요구하는 두번째 인자라 뭐라고 했었죠? 바로 사용하려는 리소스 파일이 들어있는 어셈블리라고 했었죠? 그렇습니다. 그렇기 때문에 이렇게 어셈블리를 얻어오는 것입니다. ^^

 

 

참고 : 리플렉션이란?

MSDN을 참고해 보면 말입니다. MSDN에서는 리플렉션을 다음과 같이 설명하고 있습니다.

리플렉션을 사용하여 형식의 인스턴스를 동적으로 만들거나, 형식을 기존 개체에 바인딩하거나, 기존 개체에서 형식을 가져올 수 있습니다. 그리고 나서 형식의 메서드를 호출하거나 형식의 필드 및 속성에 액세스할 수 있습니다. 리플렉션의 일반적인 용도는 다음과 같습니다.

Assembly를 사용하여 어셈블리를 정의 및 로드하고, 어셈블리 매니페스트에 나열된 모듈을 로드하며, 이 어셈블리에서 형식을 찾아 형식의 인스턴스를 만듭니다.

MethodInfo를 사용하여 메서드의 이름, 반환 형식, 매개 변수, public 또는 private 같은 액세스 한정자, 추상 또는 가상 같은 구현 정보를 검색합니다. Type의 GetMethods 또는 GetMethod 메서드를 사용하여 특정 메서드를 호출합니다.

FieldInfo를 사용하여 필드의 이름, 액세스 한정자, public 또는 private 같은 액세스 한정자, static 같은 구현 정보를 검색하고, 필드 값을 가져오거나 설정합니다.

.... (이후 생략)

* 위의 글은 MSDN(VS.NET 한글 도움말)에서 인용한 것임을 밝힙니다.

 

이제, 필요한 두가지 인자가 모두 준비되었으니 ResourceManager 클래스의 인스턴스를 생성해 보겠습니다. 코드의 3번째 라인이 바로 그 작업을 하고 있죠?

ResourceManager appResourceMgr = new ResourceManager(fullName, Assem);

그렇습니다. 이것으로 모든 준비는 끝난 것입니다. 이제 appResourceMgr 라는 변수명을 이용해서 맘껏 리소스 파일안의 데이터들을 불러올 수가 있게 된 것입니다.

데이터를 불러오기 위해서는 꼴랑~ GetString라는 메서드를 사용해 주시면 됩니다. ^^ 이미지나 이진 데이터를 불러오기 위해서 GetObject라는 메서드도 이용할 수 있긴 합니다만, 현업에서는 주로 문자열 메시지들을 담게 될 것이기에... GetString 만을 기억하고 계셔도 무난합니다 ^^.. 예를 들면, 다음 코드처럼 말이죠

Button1.Text = appResourceMgr.GetString("Msg.Click");

GetString 메서드의 인자로는 불러오고자 하는 메시지의 키 값을 적어주시면 됩니다. 그러면 그에 해당하는 값을 뽑아낼 수 있는 것이죠 ^^;; 쉽지 않습니까?

뭔가 초기 세팅이 복잡해 보일 수도 있는데요. 한번 해보고 나면 한개두 안 복잡합니다.

그리고, 컴포넌트 개발에 익숙하신 분이라면 위의 코드 중 공통적인 부분을 따로 빼서... 별도의 헬퍼 클래스를 만들어서 ResourceManager를 좀 더 사용하기 쉽게 만드실 수도 있겠네요 ^^

반응형

댓글