Microsoft Windows Script 5.6과 VBScript 5.6

등록일시: 2002-03-15 이전,  수정일시: 2018-04-07 06:19
조회수: 19,306
본문은 최초 작성 이후, 약 22년 이상 지난 문서입니다. 일부 내용은 최근의 현실과 맞지 않거나 동떨어져 있을 수 있으며 문서 내용에 오류가 존재할 수도 있습니다. 또한 본문을 작성하던 당시 필자의 의견과 현재의 의견에 많은 차이가 존재할 수도 있습니다. 이 점, 참고하시기 바랍니다.

Microsoft Windows Script 5.6을 설치한 뒤의 VBScript의 변화에 대해서 알아보기 전에 잠시 재미있는 사실을 집고 넘어가기로 한다. 다음의 표는 Microsoft Windows Script 5.6의 도움말 내용 중 VBScript의 버전 정보에 관한 표를 발췌한 것이다.

호스트 응용 프로그램 1.0 2.0 3.0 4.0 5.0 5.5 5.6
Microsoft Internet Explorer 3.0 0            
Microsoft Internet Information Server 3.0   0          
Microsoft Internet Explorer 4.0     0        
Microsoft Internet Information Server 4.0     0        
Microsoft Windows Scripting Host 1.0     0        
Microsoft Outlook 98     0        
Microsoft Visual Studio 6.0       0      
Microsoft Internet Explorer 5.0         0    
Microsoft Internet Information Services 5.0         0    
Microsoft Internet Explorer 5.5           0  
Microsoft Visual Studio.NET             0

이 표는 마이크로소프트사의 응용 프로그램들 중, VBScript를 설치하고 사용하는 몇몇 중요한 응용 프로그램들과 해당 응용 프로그램이 설치될 때 부수적으로 같이 설치되는 VBScript의 버전 정보를 보여주고 있다. 가령, Microsoft Windows Script 5.6을 별도로 설치하지 않더라도 Microsoft Visual Studio.NET을 설치하면 자연스럽게 VBScript 5.6 버전이 설치된다. 여기에서 주의해서 볼 부분은 VBScript 5.0 부분이다. 이 표에 따르면 Microsoft Internet Explorer 5.0을 설치하거나 Microsoft Internet Information Services 5.0을 설치하면 VBScript 5.0이 함께 설치된다. 그런데, 한 번 가만히 생각해보기 바란다. Microsoft Internet Explorer 5.0과 Microsoft Internet Information Services 5.0이라면 뭔가 생각나는 공통점이 있지 않은가? 그렇다. 바로 Microsoft Windows 2000이다. Microsoft Windows 2000은 기본적으로 VBScript 5.0 Script Engine을 포함하고 있다.

그렇다면, Microsoft Windows 2000의 경우 반드시 Microsoft Windows Script 5.6으로 업그레이드 해야만 하는 것일까? 단지 0.6의 차이밖에는 나지 않는 마이너 업그레이드인데도 말이다. 사실, 이런 부분들이야 말로 서버 관리자분에게는 매우 민감한 사항이다. 결론부터 말하자면 '권장사항이기는 하지만 필수사항은 아니다.'라는 것이 필자의 생각이다. 단, 이 경우 '서버의 운영체제가 Windows 2000 인 경우'라는 단서가 붙는다.

그러나 운영하고 있는 서버의 운영체제가 Microsoft Windows NT Server 4.0이라면, Microsoft Windows Script 5.6으로의 업그레이드는 거의 절대적인 '필수사항'이다. 만약, 여러분이 ASP 프로그래머라면 서버 관리자들이 반대하더라도 반드시 관철시켜서 업그레이드하기 바란다. 일단 업그레이드 후에는 간단한 코드 수정만으로도 ASP 프로그램에서 매우 의미있는 성능 개선 효과를 얻을 수 있을 것이다.

Microsoft Windows NT Server 4.0의 Microsoft Windows Script 5.6 업그레이드의 효과는 다음의 표를 통해서 명백히 증명된다. 이 표 역시, 위의 표와 마찬가지로 Microsoft Windows Script 5.6의 도움말에서 발췌하여 중요한 부분만을 편집한 것으로, 각각의 VBScript 버전에서 추가된 기능들에 대하여 나타내고 있다. 표를 좀 더 간단히 하기 위해서 버전 1.0에서 버전 3.0까지의 언어 요소들에 관한 컬럼은 생략했다.

클래스 관련 언어 요소
언어 요소 4.0 5.0 5.5 5.6
Class 개체0
Initialize 이벤트0
Terminate 이벤트0
Class 문0
PropertyGet 문0
PropertyLet 문0
PropertySet 문0
정규 표현식 관련 언어 요소
언어 요소 4.0 5.0 5.5 5.6
RegExp 개체0
Match 개체0
Matches 컬렉션0
SubMatches 컬렉션0
Replace 메서드0
Execute 메서드0
Test 메서드0
Pattern 속성0
IgnoreCase 속성0
Global 속성0
Length 속성0
Value 속성0
FirstIndex 속성0
기타 언어 요소
언어 요소 4.0 5.0 5.5 5.6
With 문0
Execute 문0
ExecuteGlobal 문0
Eval 함수0
GetLocale 함수0
GetRef 함수0
SetLocale 함수0
Timer 함수0

이와 같이 표를 정리해보면 왜 Microsoft Windows NT Server 4.0의 경우 Microsoft Windows Script 5.6으로의 업그레이드가 필수적인지, 반면 왜 Microsoft Windows 2000의 경우는 Microsoft Windows Script 5.6으로의 업그레이드가 단지 추천사항일 뿐인지가 명확하게 드러난다.

위의 표를 근거로 VBScript 5.0 이상의 버전에서만 사용 가능한 새로운 기능들에 관하여 간단히 알아보자.

가장 먼저, 클래스 관련 언어 요소부터 살펴보자. 이 기능은 따로 설명할 필요가 없을 정도로 매우 명확한 의미를 갖고 있다. 그러나, 아쉽게도 기대와는 달리 VBScript가 지원해주는 클래스의 기능은 Microsoft Visual Basic 6.0의 클래스 기능처럼 매우 미약하다. 당연하지 않은가? Microsoft Visual Basic 6.0의 클래스 기능이 미약한데 VBScript의 클래스 기능이 그보다 더 뛰어나기를 바란다면 그것은 너무 과한 욕심이다.

그렇지만 VBScript에서 제공하는 클래스는 그 나름대로의 의미를 갖고 있다. 일반적으로 VBScript의 클래스 기능이 미약하다고 평가받는 원인의 상당 부분은 '클래스'라고 말할 때 보편적으로 머리속으로 떠올리는 클래스, 즉 C++이나 Java의 클래스와 그 성능을 비교하기 때문이다. 단일/다중상속성, 다형성 등을 논하고 들자면 당연히 이들 언어와는 비교 자체가 안된다. 이런 기능들은 Visual Basic.NET에서나 기대할 수 있는 기능들이다.

따라서, VBScript의 클래스의 의미는 이런 전통적인 클래스의 영역에서 찾으면 안된다. VBScript의 클래스는 Windows Script Component의 기초가 되며, 특히 Remote Scripting을 위해서는 필수적인 기능이다. 이 두 가지 기술에 관해서 잘 모르는 분들을 위해 간단히 설명을 하면, Windows Script Component는 VBScript나 JScript만으로 COM 컴포넌트를 작성할 수 있는 기술이고, Remote Scripting은 웹 페이지의 갱신 없이 클라이언트측의 스크립트만으로 서버의 자료를 가져오거나 갱신할 수 있는 기술이다. 이 두 가지 기술은 그에 관한 별개의 글을 따로 마련할 생각이므로 이 글에서는 더 이상 거론하지 않는다.

정규 표현식 관련 언어 요소는 그야말로 진작부터 당연히 지원되었었어야 마땅한 기술이다. 물론, 정규 표현식의 강력함을 제대로 느껴보려면 Perl을 사용해 보는 것이 가장 좋겠지만, VBScript 5.0 버전에서부터는 비록 일부나마 정규 표현식을 강력함을 맛볼 수 있게 된 것이다. 만약, 정규 표현식에 관하여 잘 모르시는 분들이 계시다면 주변에서 Perl을 하시는 분들에게 시험삼아 한 번 여쭤보기 바란다. 아마 족히 한 시간은 정규 표현식의 강력함과 유용함에 대한 설명을 들을 수 있을 것이다.

정규 표현식이라는 기술 자체가 생소한 분들을 위해 한 가지 매우 사소한 예를 들어 보기로 한다. 문자열을 치환하면서

게시물의 내용 중, Micro라는 단어를 Macro로 바꾸고 싶다. 그러나, 모든 Micro라는 단어를 바꾸는 것이 아니라, 바로 앞에 Test라는 단어가 있고 뒤에는 soft라는 단어가 있는 Micro만 모두 바꾸고 싶다.

라거나...

게시물의 내용 중에서 yy-mm-dd라는 형식으로 된 모든 날짜 관련 문자열을 mm/dd/yyyy로 바꾸고 싶다.

와 같은 생각을 해본 적이 있는가? 그리고, VBScript를 사용해서 직접 이런 기능을 구현해 본 경험이 있는가? VBScript의 Replace() 함수 등을 사용해서 이런 기능을 직접 구현한다면 꽤나 골치아픈 작업이 될 것이다. 그러나, 정규 표현식을 사용할 경우 이 모든 처리가 불과 서너 줄의 코딩만으로 끝나버린다.

또한, 정규 표현식은 ASP를 넘어서 .NET을 준비한다는 관점에서도 반드시 공부하고 넘어가야 한다. .NET의 Common Language Rutime에서는 System.Text.RegularExpressions 네임스페이스를 통해서 기본적으로 다양한 정규 표현식 관련 기능들을 지원하고 있으며, ASP.NET의 경우 <asp:RegularExpressionValidator> 태그를 사용하는 RegularExpressionValidator라는 유효성 검사 컨트롤도 제공하고 있다.

마지막으로 기타 언어 요소들 중에서 가장 먼저 눈에 띄는 기능은 바로 With 문이다. 이 With 문을 이용하면 다음과 같은 코딩이 가능해진다. 아마 Microsoft Visual Basic 6.0을 사용해본 경험이 있는 분들은 이미 잘 알고 계실 것이다.

With Response
    .Write "<script language=""JavaScript"">" & vbCRLF
    .Write "alert(""Test 입니다."");" & vbCRLF
    .Write "</script>" & vbCRLF
    .Flush
End With

'** 또는 

With DbRec
    For i = 1 To .RecordCount
        Var_A = .Fields("Column01").Value
        Var_B = .Fields("Column02").Value
        Var_C = .Fields("Column03").Value
        Var_D = .Fields("Column04").Value
        .MoveNext
    Next i
End With

이처럼 With 문은 코딩을 간단하게 해줄뿐만 아니라, Response 객체의 Buffer 기능과 잘 조합해서 사용할 경우 ASP 프로그램의 가시적 성능 향상에 큰 도움을 준다. 특히, 이런 효과는 루프문의 전후에서 더욱 두드러지는데 With 문을 사용하지 않고 루프문의 프로그래밍을 할 경우 임의의 객체에 대하여 참조를 얻고 풀고를 반복하게 된다. 그러나, With 문을 사용하면 End With 문을 호출할 때까지 지정한 객체에 대한 참조를 계속 유지할 수 있으므로 불필요한 CPU 사이클을 줄일 수 있다.

그러나, 이는 어디까지나 이론적인 얘기일뿐으로 실제로 필자가 간단히 테스트 해본 결과로는 경우에 따라 With 문을 사용한 경우가 오히려 사용하지 않았을 경우보다 0.5초 ~ 1초 가량 더 느렸다. 필자가 테스트 한 방법은 단순히 Response.Write() 메서드와 Response.Flush() 메서드의 조합을 For ... Next Loop를 사용해서 10만번 ~ 30만번 정도 루프를 돌리고 그 수행시간을 체크하는 방법이었다.

다만, Recordset.Fields.Count 같이 다중 중첩된 객체를 With 문으로 잡은 다음(With Recordset.Fields 같이...) 동일한 테스트를 수행한 경우에는 With 문을 사용했을 때가 사용하지 않았을 때보다 2초 ~ 3초 가량 더 빨랐으나, 사실 실무에서 이런 예를 보기는 힘들기 때문에 그다지 의미있는 결과는 아니라고 생각한다. 결론적으로 필자의 생각으로는 적어도 VBScript, 즉 ASP 프로그램상에서는 With 문을 사용하던지 사용하지 않던지 아주 특이한 경우를 제외하고는 성능이 크게 향상되거나 혹은 크게 저하되지는 않는 것으로 보이며, 다만 개인의 코딩 취향에 따라 편의를 도모할 수는 있을 것이라고 생각한다.

다음으로 Execute 문과 ExecuteGlobal 문, 그리고 Eval() 함수 역시 매우 유용한 기능으로, 이 세 가지 요소는 사실상 하는 일이 거의 동일한데 JavaScript의 eval() 문과 제공하는 기능이 같다. 사실, JavaScript의 eval() 문을 좀더 세분화해서 구현했다고 보는 편이 맞을 것이다. 그 밖에 기타 언어 요소의 다른 요소들은 기타 언어 요소에 관해 자세히 다루는 차후의 다른 글에서 다시 상세하게 설명하기로 한다.