My를 사용하는 이유
My 살펴보기
My.Application
My.Computer 및 My.User
사용자 프로젝트의 설정, 리소스 및 기타 항목에 대한 액세스 제공
결론
처음에는 Visual Basic 2005에 대한 이야기로 기사를 쓰기 시작했지만 그 범위가 너무 방대했습니다. 전체 기능 목록을 두루 살펴보거나, 편집하며 계속하기와 같은 멋진 IDE 기능과 IntelliSense 코드 조각 또는 예외 도우미에 대한 몇 가지 정보를 제공하거나, generic, partial 클래스, 부호 없는 형식 등 고급 언어 기능을 개략적으로 살펴보거나 아니면 Windows Forms, 데이터 바인딩, ClickOnce 배포 등의 뛰어난 Microsoft .NET Framework 개선 사항을 간략하게 설명할 수도 있었습니다. 그러나 결국 이러한 흥미로운 기능을 모두 뒤로하고 Visual Basic 2005의 가장 멋진 기능 중 하나인 My 네임스페이스에 대해 자세히 설명하기로 결정했습니다..
My를 사용하는 이유
프로그래머가 직면하는 가장 큰 문제 중 하나는 .NET의 방대한 범위로 인해 특정 작업에 맞는 최적의 클래스를 찾기가 상당히 어렵다는 것입니다. 여러 뉴스 그룹 게시물을 읽으면서 .NET에 이미 있는 함수를 Visual Basic .NET 또는 C# 코드에서 Win32 API 함수로 호출하기 위해 애쓰는 개발자가 많다는 것을 알 수 있었습니다. 개발자들이 API를 호출하려는 이유는 무엇일까요? 이것은 Framework의 이미 있는 부분을 찾거나 식별하거나 또는 이해하지 못하기 때문입니다. My 네임스페이스는 일상적인 실제 작업과 개념에서 만나는 문제를 해결하기 위해 쉽게 이해할 수 있는 루트 개체를 통해 기존 .NET 기능을 제공하는 직관적인 탐색 계층을 지원합니다.
멋지게 들리긴 하지만 무슨 의미인지 쉽게 이해되지 않을 수도 있습니다. 그런 분들의 이해를 돕기 위해 GotDotNet에서 자주 볼 수 있는 "텍스트 파일의 전체 내용을 하나의 문자열로 읽는 방법은 무엇입니까?"라는 질문을 통해 My 네임스페이스의 이점을 살펴보겠습니다. .NET Framework 1.1의 경우 이 질문의 답은 다음과 같습니다.
Dim sr As New IO.StreamReader("c:\mytextfile.txt")
contents = sr.ReadToEnd
sr.Close()
코드가 복잡하지는 않지만 쉽게 이해되지도 않을 것입니다. StreamReader에 대한 경로를 사용하면 바로 Stream 클래스와 연결되는 것으로 생각하는 경우가 많지만 앞서 코드 조각에서는 FileStream 클래스 등 여러 클래스를 사용해야 합니다. Visual Basic 2005에서도 이와 동일한 코드를 사용할 수 있지만 다음과 같이 My를 사용하면 훨씬 빠르게 같은 정보에 액세스할 수 있습니다.
contents = My.Computer.FileSystem.ReadAllText("c:\mytextfile.txt")
My 언어 확장에는 My.Computer.FileSystem 클래스 외에도 많은 클래스가 포함되어 있으므로 우선 어떠한 클래스를 사용할 수 있는지 잘 알아야 합니다.
My 네임스페이스는 .NET Framework을 위한 빠른 액세스 기능이라고 할 수 있습니다. 올바른 작업을 찾아 실행하기 쉽도록 하는 이러한 유형의 단순화는 일반적인 프로그래밍 기법입니다. 필자의 경우에는 본인이나 개발 팀에서 자주 사용하는 여러 단계의 프로세스가 있으면 보통 도우미 함수를 만듭니다. 일반적으로 도우미 함수는 가장 많이 사용되는 중요한 매개 변수를 받고 여러 단계로 이루어진 프로세스를 자동으로 수행함으로써 개발 프로세스를 원활하게 하는 간단한 호출입니다. 이러한 도우미 함수는 대부분의 소프트웨어 개발 회사에서 사용되며 도우미 함수의 그룹을 코드 조각 집합이나 MyCompany.Utilities 또는 Duncan.NetworkUtilities와 같은 공유 라이브러리 형식으로 결합하는 것 역시 일반적인 기법입니다.
모든 개발 그룹에서 공통적으로 사용되는 함수가 많기 때문에 이러한 라이브러리를 일일이 만드는 것은 비효율적입니다. 이러한 맥락에서 Visual Basic과 함께 제공되는 My 네임스페이스를 사용하면 다양한 기능을 제공하는 도우미 함수를 더욱 새로운 차원으로 활용할 수 있습니다. 쉽게 말해서 직접 작성하지 않아도 기본으로 생산성 향상 코드 라이브러리가 제공되는 것입니다.
My 살펴보기
My 네임스페이스는 My.Application, My.Computer, My.Forms, My.Resources, My.Settings, My.User 및 My.WebServices의 7가지 일반 영역 중 하나로 다양한 함수를 분류한 몇 가지 개별 클래스를 제공합니다.
일반적으로 My에 포함된 클래스를 사용하면 기본 Framework 또는 현재 프로젝트의 요소에 있는 정보에 손쉽게 액세스할 수 있습니다. My.Application, My.Computer 및 My.User는 Framework 기능에 초점을 맞추고 있는 반면 My.Forms, My.Resources, My.Settings 및 My.WebServices는 현재 프로젝트의 내용을 처리하는 데 사용됩니다. 여기에서는 기본 Framework에 초점을 맞춘 클래스부터 시작하여 각 클래스에 포함된 속성 및 클래스에 대한 정보와 함께 간단한 예도 소개할 것입니다.
앞에서 설명한 대로 .NET Framework을 사용할 때는 필요한 기능을 정확히 찾아내기가 어려울 수 있습니다. 그러나 필요한 기능을 찾는 것 외에도 문제가 있습니다. 예를 들어 필요한 클래스를 찾은 후에도 해당 클래스를 준비하기 위해 필요한 세부적인 단계와 생성자 매개 변수 코드가 너무 길어서 이해하기 어려운 경우도 있습니다. Framework에 초점을 맞춘 My 클래스(My.Application, My.Computer 및 My.User)는 필요한 클래스를 바로 탐색하고 설정하여 작업에 사용할 수 있도록 설계되었습니다.
My.Application
My.Application은 응용 프로그램 정보와 서비스를 이해하기 쉽게 그룹화합니다. My.Application의 개별 노드에는 Info(응용 프로그램의 저작권, 제목, 설명 등), OpenForms(현재 프로젝트에서 열려 있는 모든 폼의 모음), Log(System.Diagnostics 클래스에 통합되며 다양한 기능을 제공하고 세부적인 구성이 가능한 로깅 기능) 등이 있습니다.
My.Application.Log 클래스를 사용하면 손쉽게 예외를 로깅할 수 있습니다. 다음과 같이 코드를 작성할 수 있다면 진정한 코드 개발자로서 자부심을 느낄 수 있을 것입니다.
Dim winINIFile As String
Try
winINIFile = My.Computer.FileSystem.ReadAllText("c:\windows\wind.ini")
Catch ex As IO.FileNotFoundException
My.Application.Log.WriteException(ex, TraceEventType.Error,
"Error Accessing INI File")
End Try
Visual Basic 6.0 및 이전 버전 사용자에게 가장 절실하게 필요했던 여러 기능 요구 사항 중 하나가 OpenForms 컬렉션을 추가함으로써 해결되었습니다. Visual Basic 6.0에서 Forms라는 키워드를 통해 사용할 수 있는 이 기능은 전역 목록을 직접 유지 관리하지 않고도 다음과 같이 응용 프로그램에서 현재 열려 있는 모든 폼을 대상으로 손쉽게 루프 작업을 수행할 수 있도록 해줍니다.
For Each f As Form In My.Application.OpenForms
Debug.WriteLine(f.Text)
f.WindowState = FormWindowState.Minimized
Next
My.Computer 및 My.User
My.Computer는 호스트 컴퓨터와 관련된 서비스 및 데이터를 탐색할 수 있도록 합니다. 이 클래스의 기능만으로도 충분히 별도의 기사로 작성할 수 있지만 여기서는 몇 가지 중요한 내용만 소개하겠습니다.
FileSystem 클래스는 파일에 대한 작업을 수행하고 조회하는 매우 간단한 API를 제공하여 FileSystemObject 라이브러리를 사용할 때의 지루한 작업 시간을 단축해줍니다. 다음은 FileSystem 클래스를 사용하여 현재 사용자의 My Pictures 폴더에 있는 그림을 모두 새 폴더(C:\Desktop Wallpaper)로 복사하고 파일 복사 작업을 완료하는 데 다소 시간이 걸리는 경우에는 진행률 표시줄을 표시하는 코드입니다.
Dim myPics As String = _
My.Computer.FileSystem.SpecialDirectories.MyPictures
My.Computer.FileSystem.CopyDirectory( _
myPics, "C:\Desktop Wallpaper", _
FileIO.UIOption.AllDialogs, _
FileIO.UICancelOption.DoNothing)
MessageBox.Show(My.Computer.FileSystem.GetFiles( _
myPics, FileIO.SearchOption.SearchAllSubDirectories, _
"*.jpg", "*.bmp").Count)
.NET Framework 1.1에서 이와 같은 파일 복사 작업을 수행하려면 훨씬 더 복잡한 코드(그림 1 참조)가 필요할 뿐 아니라 진행률 대화 상자를 표시하는 기능도 없기 때문에 직접 만들어야 합니다.
My.Computer.Ports는 직렬 포트의 읽기 및 쓰기 작업을 간단한 프로세스로 수행할 수 있도록 해줍니다. 이러한 작업은 현재 버전의 .NET Framework에서 가장 많이 사용되면서도 수행하기 어려운 작업 중 하나입니다. 아래에 소개하는 코드 조각을 작성하기 위해 이전에는 전체 기사의 단계를 수행해야 했습니다(Serial Comm: Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications (영문) 참조).
Dim comport As IO.Ports.SerialPort
comport = My.Computer.Ports.OpenSerialPort("COM1")
AddHandler comport.ReceivedEvent, AddressOf DataReceived
My.Computer.Audio 클래스는 다음 코드와 같이 PlaySound API의 P/Invoking 사용하던 관행을 따르지 않고도 사용자 정의 소리나 시스템 소리를 재생할 수 있도록 해줍니다.
Dim musicFile As String
musicFile = My.Computer.FileSystem. _
GetFiles("C:\WINDOWS\Media", _
FileIO.SearchOption.SearchAllSubDirectories, _
"*.wav")(0)
My.Computer.Audio.Play(musicFile)
My.Computer.Network는 시스템과 원격 컴퓨터 간의 Ping 전송 및 수신, 파일 업로드 또는 다운로드, 현재 연결 상태 확인 등을 비롯하여 다양한 네트워킹 호출을 쉽게 사용할 수 있도록 해줍니다.
If My.Computer.Network.IsAvailable Then
If My.Computer.Network.Ping("www.duncanmackenzie.net") Then
Debug.WriteLine("Site Available")
My.Computer.Network.DownloadFile( _
"http://www.duncanmackenzie.net/Articles/", _
System.IO.Path.Combine( _
My.Computer.FileSystem.SpecialDirectories.MyDocuments, _
"articles.html"))
End If
End If
My.Computer.Keyboard, My.Computer.Registry, My.Computer.Screen 등 여기에서 소개하지 못한 클래스가 많이 있으므로, 이러한 클래스에 대해서는 직접 살펴보시기 바랍니다.
My.User는 My에 포함된 클래스 중 가장 단순하지만 동시에 상당히 유용한 클래스입니다. 이 클래스는 응용 프로그램의 현재 사용자에 관한 여러 가지 유용한 정보에 액세스할 수 있도록 해줍니다. 이러한 기능에는 역할 구성원 자격을 쿼리하는 메서드와 IsAuthenticated와 같은 상태 함수가 포함됩니다.
If My.User.IsAuthenticated Then
If My.User.IsInRole("BUILTIN\Administrators") Then
MsgBox("tsk, tsk... running as Admin are we?")
End If
End If
My.User 속성 및 메서드는 기본적으로 Windows 인증을 사용하지만 사용자 지정 보안 인프라에서도 문제없이 작동하므로 사용하는 인증 유형에 관계없이 동일한 코딩 모델을 유지할 수 있습니다.
사용자 프로젝트의 설정, 리소스 및 기타 항목에 대한 액세스 제공
My에 포함된 클래스 중 프로젝트에 초점을 맞춘 클래스에는 Settings, Resources, WebServices 및 Forms가 있습니다. 이 중 Settings와 Resources는 프로젝트에 연결된 데이터를 처리하며, 이름으로도 그 기능을 쉽게 알 수 있는 Forms와 WebServices 클래스는 프로젝트에 추가한 폼과 웹 서비스에 직접 액세스할 수 있도록 해줍니다.
Visual Studio 2005의 IDE에서 그림 2에 나와 있는 디자이너 인터페이스를 사용하여 응용 프로그램의 다양한 리소스 요소 및 사용자 또는 응용 프로그램 수준 설정의 강력한 형식 그룹을 구성할 수 있습니다.

그림 2 설정 디자이너
두 경우 모두 My를 통해 해당 클래스를 사용하려면 설정이나 리소스를 구성해야 하지만 일단 프로젝트에 설정이나 리소스를 추가한 다음에는 My.Settings 및 My.Resources 클래스를 사용하여 해당 유형의 정보와 손쉽게 상호 작용할 수 있습니다. 다음 루틴에서는 저장된 사용자 설정 값을 검색하여 수정한 다음 My.Resources 클래스를 사용하여 메시지 상자에 사용할 지역화된 문자열을 가져옵니다. 이러한 문자열은 그림 3에 표시된 IDE 도구를 사용하여 작성합니다.
Dim lastRun As Date My.Settings.LastRun
My.Settings.LastRun = Now()
Dim myMessage As String = _
String.Format(My.Resources.LastRunMessage, _
lastRun.ToShortDateString)
MsgBox(myMessage)

그림 3 리소스 편집
지금 설명한 두 가지 영역 외에도 프로젝트의 모든 폼은 My.Forms를 통해 사용할 수 있으며 프로젝트에서 참조한 모든 웹 서비스는 My.WebServices 클래스를 통해 표시됩니다. 즉, 웹 서비스의 경우 수동으로 인스턴스를 만들지 않고도 직접 참조할 수 있음을 의미합니다. 예를 들어 webservicex.net에서 WeatherForecast 서비스에 대한 참조를 추가한 후에는 다음 코드를 사용하여 현재 온도를 검색할 수 있습니다.
Dim tempService As New net.webservicex.www.WeatherForecast()
Dim wf As net.webservicex.www.WeatherForecasts
wf = tempService.GetWeatherByZipCode("98052")
MsgBox(wf.ToString())
이는 다음과 같이 보다 간단하게 나타낼 수 있습니다.
MsgBox(My.WebServices.WeatherForecast.GetWeatherByZipCode("98052").ToString())
My.Forms는 이러한 클래스의 현재 열려 있는 인스턴스가 아니라 각 사용자 Form 클래스의 기본 인스턴스를 나타내므로 앞에서 설명한 My.Application.OpenForms 컬렉션과는 다릅니다. Visual Basic 6.0 또는 이전 버전을 사용한 프로그래밍에 대한 배경 지식이 있다면 이러한 기본 인스턴스는 Form의 클래스 이름을 직접 사용하여 폼을 표시하거나 숨기거나 액세스하도록 하므로 매우 유용합니다.
Private Sub showForm2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles showForm2.Click
My.Forms.Form2.Show()
End Sub
Private Sub updateForm2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles updateForm2.Click
My.Forms.Form2.Text = "Updated..."
End Sub
이는 .NET Framework가 릴리스되기 전까지 Visual Basic의 표준 동작이었으므로 Visual Basic 6.0의 프로그래밍 스타일에 익숙한 개발자에게는 이러한 기능 복원이 반가운 일일 수 있습니다.
결론
Visual Basic 2005의 My 네임스페이스를 사용하면 개발자가 선택한 방법으로 Framework를 직접 사용할 수 있으면서 .NET Framework의 고급 기능 영역에 쉽고 빠르게 액세스할 수 있습니다. Forms 컬렉션과 같은 My의 일부 영역에서는 Framework 기능을 제공하는 것은 물론 Visual Basic 이전 버전의 익숙하고 편리한 프로그래밍 개념을 다시 사용할 수 있도록 해줍니다. Visual Studio 2005와 Visual Basic 2005 Express에서 이 네임스페이스를 직접 사용해보면 이 네임스페이스가 얼마나 유용한지 알 수 있을 것입니다.
