Posted
Filed under .NET/ASP.NET

.NET Execution Model

그렇다면 먼저 .NET 코드의 실행 모델을 그림으로 우선 만나보자.

위의 그림은 코드 실행의 구조를 아주 잘 나타내 주고 있다. 모든 .NET 언어로 작성된 소스 코드는 언어에 따르는 컴파일러를 통해서 MSIL 이라는 중간언어로 만들어 진다. 여기까지를 우리는 Compilation 단계라고 부른다. 이 단계의 결과물로는 중간 언어인 MSIL과 그 중간 언어에 대한 여러가지 정보를 가지고 있는 MetaData 라는 것이 생긴다. 중간 언어로 존재한다고 하더라도 우리 눈에 보여지는 이 결과 파일의 확장자는 DLL 이나 EXE 이다. 조심할 것은 이 확장자로 인해 이 파일이 라이브러리 파일이거나 실행파일이라고 착각하는 것이다. 안타깝게도 이들은 단지 그러한 확장자를 가진 중간언어이다.  CLR의 도움 없이는 아무것도 할 수 없는...

이러한 중간적인 상태로 존재하던 파일들이 이제 실행시점에 들어가게 되면 CLR 내의 JIT(Jitter 라고도 호칭함)라는 컴파일러에 의해 다시금 컴파일되고, 그 결과 실제로 실행가능한 플랫폼 기반의 Native Code 가 생성되어지게 된다. 여기까지의 단계를 Execution 단계라고 부른다.

모든 .NET 코드들은 위와 같은 단계를 거쳐서 실행을 하게 된다. .NET 이전의 Windows 시절의 방식과 비교했을 경우에 오히려 거추장스러우면서, 성능의 저하를 가져올 것처럼 느껴지는 단계들이 존재한다고 보일 수도 있다. 하지만, 자못 그렇게 보일 수 있는 단계들이 .NET으로 하여금 여러가지의 막대한 잇점을 갖게 하는데, 그것은 언어 독립성, 교차 언어의 상속가능, 플랫폼 기반의 최적화된 코드의 생성등이다. 어떠한 점이 잇점인지, 그 외에 더 얼마나 많은 잇점을 제공해주기에 이러한 실행구조를 .NET이 갖는지등에 대한 더욱 구체적인 이야기들은 MSDN의 .NET Framework의 소개나, 여러 .NET 관련 언어 서적을 통해서 얻을 수 있을 것이다. .NET 구성과 관계된 서적을 한권쯤은 꼭 정독하여 Microsoft가 .NET이라는 것을 얼마나 면밀히 계획했는지 살며시 들여다보는 것도 개발에 도움이 되리라 생각한다. (태오의 개인적인 추천서적으로는 2002년 4월에 번역 출간되는 Wrox의 PROFESSIONAL .NET FRAMEWORK을 추천한다. 물론, Ms Press의 것은 말할 것도 없다.)

.NET의 실행 모델은 사실상 Java 것과도 비슷하다고도 볼 수 있지만, 진화된 환경이란 이전 환경의 좋은 점들을 모두 추출하여, 그 것을 기반으로 발전시켜 나가는 것이라고 볼 때, .NET은 Java의 진화 발전형이라고 볼 수도 있을 것이다.

위의 실행 모델은 ASP.NET 뿐 아니라 모든 .NET의 코드들에 적용된다. 사실 ASP.NET의 경우는 위의 기본적인 모델을 따르면서 약간은 자신만의 단계들이 존재하고 있지만, 여전히 기본은 위의 모델이다.

위에서 Execution 단계를 관할하는 것이 바로 CLR 이다. CLR은 누누히 강조했지만, 위처럼 코드의 실행을 관리하는 역할을 한다. 그래서 CLR이 .NET 프레임워크의 가장 중요한 부분중의 하나라고 이야기 했던 것이다. (사실, .NET 프레임워크의 가장 중요한 다른 하나는 .NET 프레임워크 클래스 라이브러리이지만, 이 둘이 바로 .NET 프레임워크 이니...  CLR이 가장 중요하네~ 라는 식의 말은 강조를 위한 말장난같아 보일 수 있음을 인정한다. ^^)

실행 모델의 간단한 구성에 대해서 알아보았다. 그러나, 역시 뭔가 부족한 느낌이 있다. 그렇다면, 조금 더 세분화하여 실행모델을 구체적으로 살펴보도록 하자. 이 실행 모델을 이해하는 것은 매우 중요하다. 지금 이를 확인하지 않고 넘어갈 수는 있겠지만, 그렇게 되면 차후에 쓸쓸히, 아주 외롭게 남들은 중급적인 내용을 공부할 때, 자신만이 다시 이 자리로 돌아와서 실행 모델을 확인하게 될지도 모른다.

다음은 구체적인 Execution Model 이다.

 

어떤가? 이전 그림보다는 구체적이다.

그럼 그림을 하나하나 살펴보도록 하자. 흐름은 좌측 상단에서부터 시작하여 우측 하단으로 흐른다. 먼저 소스코드가 컴파일러와 메타 데이터 엔진에 의해 중간언어인 IL 과 또한 그 IL을 설명하는 메타 데이터로 구성되는 것을 볼 수가 있다. 그렇게 구성되어진 MSIL 은 그 파일과 연결된 다른 어셈블리들이 있을 경우, Linker 라는 것을 통해서, 하나의 EXE 나 DLL 로 만들어지게 되며, 이것이 이전에 말했던 관리 코드이다.

좋다. 여기까지가 컴파일 단계이다.

   어셈블리 (Assembly)란?

이는 컴파일된 관리 코드들이 저장되는 단위로써, 기존의 EXE 나 DLL 파일과 비슷하다고 볼 수 있지만, 어셈블리는 이전 EXE, DLL 과는 다르게 자신을 설명하는 메타 데이터를 가지고 있다. 이것이 중요한 차이점이다.

그리고, 하나의 EXE 나 DLL 로써 존재하고 있던 관리 코드들은 실행시가 되면 이제 CLR에 의해서 실행 파일이 되기 위한 다시 한번의 컴파일 과정을 거치기 위한 준비들을 하는데, 그 첫번째가 바로 CLR의 Class Loader 에 의해 클래스의 레이아웃이 잡히고, 로드되는 단계이다. 이 때, Base Class Library 로부터 여러가지 기본적인 클래스들도 같이 로드하는 것을 볼 수 있다.  이렇게 클래스가 로드되면 그것을 Jitter('지터'라고 발음함) 로 컴파일을 하게 되고 그로인해 원시코드는 탄생하게 되는 것이다. 그리고, 즉시 실행을 시작한다. 여기까지가 실행 단계이다.

이제 여러분은 .NET 언어로 제작한 특정 파일이 두번의 컴파일 단계를 거친다는 사실과, 전체적인 실행 구조에 대해서 알아보았다. 이 지식이 지금 당장 여러분에게 눈에 보이는 어떤 도움이 될 것으로 기대되지는 않지만, 차후 분명 도움이 될 지식임은 자명하다. 이해가 가지 않는다고 하더라도 가급적 기억은 하고 있기를 바란다.


ASP.NET Execution Model

자. 이제 ASP.NET으로 고개를 돌려보자. 그렇다고 지금 ASP.NET 코드를 작성해 보자는 의미는 아니다. 아직 우리는 ASP.NET 이라는 새로운 기술을 제대로 시작하기 위한 준비를 하고 있는 단계에 있다. 그렇다면, ASP.NET의 어떠한 것을 이야기하고자 하는 것인가? 바로 ASP.NET의 실행 모델이다.

다음 그림은 ASP.NET의 실행 구조를 나타내고 있는 그림이다.

 

호오. 좀 복잡하게 보인다. 하지만, 이전 .NET의 실행 모델을 머리속에 두고 생각해 보면, 이 흐름이 그리 어렵게 느껴지지 않을 것이다. 그럼 이전 지식들을 뇌의 메모리에 올린 다음에 태오와 같이 이 흐름에 대해서 알아보도록 하자.

먼저, 클라이언트는 서버로 특정 aspx (ASP.NET 페이지)를 호출한다.  taeyo.aspx 라는 페이지를 달라는 클라이언트의 호출을 받은 웹 서버는 이 파일을 찾고, 이 파일의 확장자를 확인한다.

만일, 이 파일의 확장자가 htm 이라면 서버는 찾은 파일을 클라이언트에게 넘겨주기만 하는 역할일 뿐이겠지만, 파일의 확장자가 aspx 라는 것을 확인하면, 서버는 이 확장자와 연결되어져 있는 DLL (ASP.NET) 에게 이 파일의 처리를 의뢰한다. (ASP 때 그러하였던 것처럼 말이다)

ASP.NET은 이 파일을 받아서 일단 파싱하는 작업을 한다. 라인 단위의 파싱작업을 끝낸 다음에 이 파일은 서버에 의해서 일단 컴파일이 되어진다. 그림으로는 현재 우측 상단까지 진행되어 온 것이다. 컴파일이 되어지면 MSIL과 MetaData로 만들어지고, 이는 관리 코드인 Assembly IL 이라는 것으로 만들어 진다. 확장자는 DLL 이나 EXE 가 될 것이다. 나중에 실제 이렇게 만들어져 있는 어셈블리 IL을 확인해 볼 것이다.

일단, 관리 코드로 만들어진 것들은 어셈블리 캐쉬라는 공간에 쌓여지게 된다. 이 부분은 기존의 .NET 실행 모델과는 조금 다른데, 이것은 ASP.NET 이라는 웹 프로그래밍의 특성으로 인해 제공되는 것이다. 즉, 일단 컴파일되어진 aspx 페이지들은 그 중간완성품을 캐쉬에 저장해 놓고, 이후 여러 사용자들이 같은 aspx 페이지를 요청할 경우, 새롭게 컴파일을 해서 IL을 만들어 내는 것이 아니라, 이 캐쉬에 이미 존재하는 IL을 재사용하게 하는 것이다. 이로 인해 상당한 속도의 증가효과를 얻어낼 수 있다는 감이 마구 올 것이다.

일단, 어셈블리 캐쉬에 올라와 있는 IL 들은 요청에 대한 응답을 기다리고 있는 사용자들에게 결과물을 건네어주어야 하기에 실행을 실시한다. 캐쉬에 있던 IL 은 메모리로 올라가게 되고, 이것은 CLR의 Jitter 에 의해 다시 한번 컴파일되어지며, 그 결과 만들어지는 결과물들(대부분의 경우 동적으로 생성된 HTML)을 클라이언트의 브라우저에게 넘겨주게 되는 것이다.

중요한 것은 사용자들은 서버에서 어떠한 일이 일어나는지 모른다는 것이다. 여러분도 이 강의를 듣기전에는 전혀 알지 못했다. (물론, 예습을 통해서 알고 있었던 분도 있을 것이기는 하다) 사용자는 단지 aspx 페이지를 요청했고, 그 요청에 의해 결과로 HTML을 돌려받았다. 그게 전부이다. 사용자는 단순하다. 사용자가 요청한 결과만 주면, 그것으로 충분히 만족한다.

하지만, 이러한 흐름을 다루어야 할 여러분, 개발자들은 다르다. 서버측에서 발생하는 모든 흐름에 대해 이해하고 있어야만 하고, 그 흐름에 맞추어 프로그램을 작성해야만 한다. 이것이 ASP.NET의 실행구조를 이해해야만 하는 이유이며, .NET 이라는 기술을 이해해야만 하는 이유이다.

자. 정리해 보자. 위의 그림은 어떤 특정 페이지를 사용자가 처음 요청했을 경우의 모습을 보여주고 있다. 혼동해서는 안되는 것중 하나는 이러한 컴파일과정이 매번 사용자마다 발생하는 것은 아니라는 것이다. 우리 서버에는 taeyo.aspx 라는 파일이 존재하고 있고, 이 파일을 요청하는 사용자는 수십명에서 수천만명에 이르를 수 있다. 위의 코드 컴파일, Jit 컴파일은 매 사용자마다 발생하는 작업이 아니다. taeyo.aspx 라는 페이지를 처음 요청한 사용자의 의해 이는 코드 컴파일이 이루어지게 되고, 그 결과 관리코드가 어셈블리 캐쉬에 올라가게 된다. 그리고 나면, 다른 수백만명의 사용자가 taeyo.aspx 페이지를 요청할 경우, 어셈블리 캐쉬에 이미 존재하고 있는 관리 코드를 가져다가 사용하게 되는 것이다.

고로, 서버의 모든 aspx 페이지는 누군가가 처음 요청할 경우만 코드 파싱, 컴파일을 수행하고 그 후 어셈블리 캐쉬에 존재하게 하기에 처음 페이지를 요청한 사용자는 조금 느리게 결과물을 받을 수 있겠지만, 그 이후의 사용자들은 대단히 빠르게 어셈블리 캐쉬에 이미 존재하는 관리코드를 통해서 결과를 확인할 수 있다는 것이다.

다음 그림은 첫 요청에 의해 aspx 페이지가 어셈블리 캐쉬에 올라가 있어, 그 이후의 요청에는 빠르게 응답할 수 있는 바로 그러한 실행 흐름을 보여준다.

그림에서 볼 수 있다시피, 일단 첫 요청에 의해 어셈블리 캐쉬에 관리 코드가 존재하게 되면, 두번째 요청부터는 캐쉬로부터 빠르게 응답을 해 줄 수 있게 된다. 이것이 .NET의 장점인 것이다.

그렇다면, 만일 taeyo.aspx 페이지의 소스를 개발자가 수정하였다면 어떻게 될까? taeyo.aspx 라는 것의 컴파일된 관리 코드가 이미 어셈블리 캐쉬에 있는데, 원본 소스는 수정되었다. 이럴 경우 사용자는 수정된 소스에 의한 결과가 아닌 수정되기 이전의 결과를 볼 수 있다는 이야기인가?

그럴 경우, 현명한 ASP.NET은 수정사항을 감지하고, 어셈블리 캐쉬에 있던 해당 IL을 삭제하게 된다. 그리고, 수정된 taeyo.aspx 페이지의 첫 요청시 다시 처음부터 흐름을 시작하게 된다. 즉, 컴파일 단계를 다시금 거쳐서 어셈블리 캐쉬에 수정된 IL을 다시 올려놓는다는 이야기이다.

이 얼마나 현명한 ASP.NET 인가?

단, 만일 aspx 페이지가 코드 비하인드로 구성되어진다면, 그러한 경우, 클래스 파일이 수정될 경우는 개발자가 직접 그 클래스 파일을 컴파일해야 한다. 코드 비하인드에 대해서는 이후 자세하게 이야기할 것이니 지금은 그런 경우도 있다는 것만 알아두도록 하자.

결과적으로, 대부분의 aspx 페이지의 첫 요청은 개발자인 여러분들이 결과를 확인하면서 이루어질 것이다. 고로, 다른 일반 사용자들은 언제나 어셈블리 캐쉬에 있는 관리코드를 사용하게 될 것이고, 상당히 빠르게 결과를 받아볼 수 있게 될 것이다. 이것이 ASP.NET 이 빠르다는 근거인 것이다.

물론, 위의 실행 구조에서 빠진 부분이 하나 있다. 그것은 Output Cache 라는 것인데, 이는 위의 흐름보다 더욱 빠르게 사용자에게 응답을 해주기 위한 방법이다. Output Cache도 한 챕터를 차지할 만큼의 분량이기에 여기서 자세하게 이야기하기에는 무리가 따르지만, 간략히 설명하자면, 이는 사용자에게 최종으로 넘겨줄 두번째 컴파일 버전의 결과물을 캐쉬에 저장해 두는 방법이다. Output Cache 라는 특별한 캐쉬구역에 저장해 두게 되면, 사용자의 요청은 파싱, 코드 컴파일 단계, 런타임 컴파일 단계등을 거치지 않고, Output Cache 구역에 존재하고 있는 결과물로써 대단히 빠르게 응답해 줄 수 있게 된다. 그림으로 설명하자면 다음과 같은 흐름을 가지게 된다.


자. 이제 ASP.NET의 Execution Model 에 대한 이야기도 여러분이 충분히 이해한 것 같다. 물론, 여러분이 빨리 ASP.NET 코드를 작성하고 싶어하는 마음은 때오도 알고 있다. 하지만, 누누히 강조하였지만 이러한 기본적인 지식이 없이는 반쪽짜리 프로그램밖에 작성할 수 없다는 사실을 인지하기 바라는 마음이다.


ASP.NET Development Model

ASP.NET의 실행 구조를 알아보았으니, 이번에는 개발 흐름에 대해서 알아보도록 하자. 사실 대단한 것은 없다. 위의 실행 흐름을 이해했다면, 개발 흐름도 아주 쉽게 받아들여질 것이다.

이를 위해 먼저 이전 ASP.NET이었던 ASP 경우의 개발 흐름을 한번 보도록 하자. 만일, ASP 를 전혀 모르는 사용자라면 한번 그랬었구나 하는 마음으로 보아도 좋을 것이다.

ASP 때의 경우는 컴파일 언어가 아닌 인터프리트 언어를 사용했었기에, 컴파일이라는 단계가 필요하지 않았다. 단지 개발자의 몫은 단지 ASP 소스 코드를 수정하고 그냥 놔두기만 하면 되었다. 모든 ASP 페이지는 사용자의 요청시 서버에서 매번 인터프리트되었고, 그 결과를 클라이언트에게 건네어 주었다. 그로 인해, 매 페이지는 매번 파싱, 인터프리트 단계를 거치는 불합리함이 있었다. 하지만, 개발자의 입장에서는 단지 해당 소스만을 수정하면 그것으로 전부였기에 개발하기는 상당히 편리하였다.

ASP.NET으로 들어서면 이제는 컴파일 단계가 요구되어진다. 그것도 2번이나. 코드 컴파일 단계와 런타임 컴파일 단계를 거치고, 코드 컴파일이 되어진 관리 코드는 어셈블리 캐쉬에 올라가게 되어 이후 더욱 빠르게 서비스를 제공할 수 있게 된다. 해서 ASP.NET에서의 개발 흐름은 다음과 같은 모습을 띄게 된다.

이미 ASP.NET Execution Model을 이해하고 난 여러분은 개발상의 흐름을 이해하는 것이 전혀 어렵지 않다. 그렇지 않은가? 좋다. 이제 얼마남지 않았다. 여러분은 이제 곧 멋진 ASP.NET 의 코드들을 지겹도록 만나게 될 것이다.

출처 : (Taeyo.pe.kr)

2007/03/13 22:50 2007/03/13 22:50
Posted
Filed under .NET

.NET

.NET 이라는 개념자체는 상당히 모호한 개념임에는 틀림이 없다. 아마도 이것은 모호한 개념으로 하여금 하나의 무형의 메이커를 만들어내는 MS의 뛰어난 전략의 산물이 아닐까 싶다. 기술적으로 이야기하자면, .NET은 Microsoft의 다양한 기술들을 설명하는 포괄적인 용어이다. 16 비트 개발 플랫폼에서 32 비트로 전환한 이래, 마이크로소프트 개발 플랫폼 역사 상 가장 중대한 변화중의 하나이며 .NET은 윈도우즈 프로그래밍을 위한 전혀 새로운 개발환경이며, 새로운 API(Application Programming Interface)라고 볼 수 있다.

마이크로소프트는 근 10년이 넘는 기간동안 업그레이드되는 하드웨어 기술에 맞추어 그에 따르는 윈도우즈의 기술들을 계속적으로 발표해 왔다. 1990년 Windows 를 세상에 알린 이후, 계속적으로 이전 Windows와 버전을 호환하면서, 개발도구와 언어들을 확장시켜 온 것이다. 하지만, 그러한 확장작업을 언제까지 계속할 수는 없는 노릇이기에, 이제 Microsoft는 그러한 모든 것을 진화시킨, 새로운 강력한 개발도구와 언어를 내놓았다. 물론, 기존 버전들과의 호환성까지 유지하면서 말이다.

마이크로소프트가 내놓은 .NET에 포함되는 기술들은 크게 다음과 같이 분류할 수 있다.

    - .NET 프레임워크(Framework)
    - .NET 엔터프라이즈 서버(Enterprise Servers)
    - .NET 언어와 언어 도구

물론, 바라보는 위치에 따라 이 분류는 달라질 수 있겠지만, 개발자의 관점에서라면 크게 무리는 없을 것이다. 그리고, 당연한 이야기이지만, 이러한 .NET 기술들은 기존보다 더욱 안정성 있고, 확장성 있고, 성능이 뛰어난 어플리케이션을 개발하는 데에 포커스를 두고 있다.

또한, .NET 이란 전략에 대해서 개념적으로는 이렇게 표현하기도 한다.

    - Microsoft의 새로운 네트워크 전략
    - 제 3세대 인터넷에 대한 마이크로소프트의 비전
    - 인터넷 환경을 혁신적으로 바꿀 MS의 제품군과 기술의 총칭
    - 서비스로서의 소프트웨어 (Software as Service)
    - 차세대 인터넷 환경을 사용자에게 제공하는 Software Platform
    - 인터넷 자체를 OS의 개념으로 확장한 개념

우리는 개발자이기에, 사실상 관심사는 .NET 이라는 것의 사업적인 개념보다는 기술적인 개념에 대해 관심을 가지고 있다. 해서, 많은 .NET 개발용 서적들에서는 .NET 이라는 것을 개발자의 관점에서는 .NET 프레임워크라고 이야기를 하기도 한다. 위에서 보았듯이 사실상 .NET 프레임워크는 .NET 의 일부일지라도, 개발자에게는 .NET 프레임워크를 .NET 이라고 이해해도 크게 문제가 되지는 않을 것이다. 그렇다손 치더라도 .NET 프레임워크가 .NET 자체가 아니라는 사실은 기억하고 우리의 관점을 기술적인 .NET의 구조로 돌려보자.

위의 그림은 .NET을 기술적으로 접근해서 보았을 경우의 그림으로, .NET 프레임워크와 .NET 언어, 그리고 개발도구의 연관성을 보여주고 있다. .NET의 개발 구조라고 볼 수 있는 이 그림을 이제 차근히 한번 살펴보도록 하자.

가장 밑단에는 Windows 라는 OS와 Windows의 핵심 서비스인 COM+ Services 가 자리하고 있으며,
.NET 프레임워크라는 가장 핵심적인 .NET의 기술은 그러한 OS와 서비스의 기반위에 자리하고 있는 것을 볼 수가 있다. 이는 .NET 프레임워크가 독립적으로 존재하는 OS 가 아닌, 플랫폼(Windows OS)기반 위에서 제공되어지는 프레임워크(골격), 구조라는 것이다.

참고로, Windows.NET Server 라는 새로운 OS가 출시를 앞두고 있는데, 이는 .NET 프레임워크를 탑재한 상태로는 최초(?)로 발표되는 OS이다. 고로, 여러분의 OS가 Windows.NET 이 아니라면 반드시 .NET 프레임워크를 설치하여야만 .NET 프로그램들이 동작할 수가 있게된다.

.NET 프레임워크는 Pink 색으로 둘러싸여져 있는 조금은 거대한 모습을 가지고 있다. 그림에서 알 수 있지만 .NET 프레임워크를 구성하는 것으로는 Common Language Runtime, Base Class library, Data & XML, ASP.NET & Web Services, Windows Forms 가 있다. 여기서 중요하게 알 수 있는 것 중에 하나는 우리가 현재 관심을 가지고 공부하고 싶어하는 ASP.NET은 .NET 프레임워크의 일부라는 것이다.

또한, Data & XML 즉, ADO.NET 도 .NET 프레임워크의 일부라는 것도 재미있다. 책으로 쓰자면 각각 족히 1000 여 페이지 이상의 책 한권일만한 ASP.NET 과 ADO.NET 이 .NET 프레임워크의 일부에 불과하다. 여기서 우리는 자못 현기증을 느낀다. 첫번째 현기증은 도대체 .NET 프레임워크라는 것이 얼마나 거대한 것인가라는 대목에서이고, ASP.NET과 ADO.NET이 각각 1000 여 페이지가 넘는 정도의 분량이라는 데에 또 한번 그러할 것이다.

그렇다손 치더라도 여러분이 .NET 프레임워크 자체를 공부하는 일은 그다지(?) 없을 것이다. 여러분은 .NET 프레임워크를 이루는 ASP.NET, ADO.NET, Windows Forms 등을 공부할 것이며, 그로 인해 저절로 .NET 프레임워크를 이해할 수 있게 될 것이다.

.NET 프레임워크에 대해서는 이후 구체적으로 알아볼 것이기에 지금은 잠시 넘어가도록 하고, .NET 프레임워크 윗단에 놓여있는 Common Language Specification(CLS) 을 알아보도록 하자. "공통 언어 명세"라고 번역하는 이는 여러분이나 제 3자가 .NET을 지원하는 타입을 작성하고자 할 경우, 그 기준이 되어주는 일종의 명세서라고 볼 수 있다.

해서 이 명세를 통해서 여러 언어들이 닷넷을 지원하도록 만들 수 있는 것이며 여러분이 실력만 된다면 이 명세에 맞추어 닷넷 지원 언어를 만들수도 있다는 이야기도 된다. 현재 닷넷을 지원하고자 하는 수많은 언어들이 나와있고, 또한 준비중에 있는데 파스칼, 코볼, 파이썬등등.. 한번쯤 들어보았음 직한 언어들이 .NET 버전으로 제공되고 있다.

이  CLS의 위치를 다시금 위의 그림에서 확인해 보자. 그 위치는 .NET 프레임워크와 .NET 언어 사이에 놓여져 있다. 이 이야기는 .NET 프레임워크에서 동작하려 하는 언어들은 모두 CLS 를 따라야 한다는 이야기이다. 사실상 개발하면서 우리가 CLS를 직접적으로 건드릴만한 일은 없을 것이다. 하지만, 역시나 개념적으로는 CLS의 역할에 대해서 기억해 둘 필요가 있다.

자... 이제 제일 윗단을 보도록 하자. 크게 설명이 필요없는 이 부분은 바로 .NET 언어들이 자리하고 있다. CLS를 따르는 .NET 언어들을 통해서 우리는 .NET 프레임워크 기반의 프로그래밍을 작성할 수가 있다. 대표적인 .NET 언어로는 Microsoft가 전폭적으로 지지하는 C# 과 VB.NET 등이 놓여져 있다. 그 외에도 많은 언어들이 현재의 시점에서 제공되어지지만, 대부분의 개발자의 선택은 C# 과 VB.NET 쪽으로 양분화 될 것으로 예상이 된다.

기존의 ASP 프로그래머들은 이미 VBScript를 통해서 VB 문법에 대단히 익숙해져 있기에 VB.NET 쪽으로 흐를 가능성이 상당하다. VB는 매우 공부하기 쉬운 언어였다는 특징이 더욱 그러한 흐름을 촉진할 것이다. 그러나, 여러분도 그렇게 생각하고 있다면 한가지 중요한 포인트를 잊지말자. 만일, 여러분이 쉬울 것이라는 기대로 인해 VB.NET을 선택한다면 그것은 조금은 잘못된 선택이다. VB.NET은 VB 처럼 쉽지 않다. 만만하게 보다간 프로그래밍의 재미를 떨어뜨릴 수 있다. 선입견을 버리라는 이야기를 하고 싶은 것이다.

태오가 추천하는 언어는 C# 이다. 모든 C# 책들이 그렇겠지만 태오도 C#을 최고의 언어라 믿어 의심치 않는 바이다. 이는 .NET 프레임워크의 많은 부분이 C# 으로 작성되어졌다는 보고때문일 수도 있지만, 그 외에도 여러가지 C# 언어만의 장점이 많기 때문이다. 물론, 개별적으로 각각의 .NET 언어들이 자신만이 가진 장점들을 가지고 있지만, C# 이 그중 가장 탁월하다는 생각은 때오만의 생각은 아닌 것 같다.

그러나, 이것은 개인적인 추천일뿐, 언급했듯이 그 어떠한 언어라 할지라도 CLS을 따르는 언어는 .NET 프로그래밍에서 자유롭게 사용할 수 있다. ASP.NET 은 물론 윈도우즈 프로그래밍에서도 특정 언어에 대한 제약은 없다. 말 그대로 언어 독립적인 세상이 온 것이다.

마지막으로 그림의 우측에는 OS 단 부터 .NET 언어에 이르기까지 폭넓게 자리하고 있는 Visaul Studio.NET 이라는 것이 존재하고 있다. 통합 개발환경으로 등장한 VS.NET은 이렇게 전반적인 개발을 용이하게 해주는 Microsoft의 대표 개발 툴이다. 이를 통해 여러분은 쉽고, 빠르고, 안정적이며, 확장성있는 솔루션을 만들어 낼 수 있을 것이다.

전반적인 .NET의 개발환경에 대해서 알아보았다. 하지만, 조금은 미진한 부분이 있었으니 그 것은 바로 .NET의 핵심이며, 개발자에게있어 .NET 이라고 표현할 수 있는 .NET Framework 이다.


.NET 프레임워크

.NET 프레임워크도 사실상 간단하게 설명하기는 조금 곤란한 환경이다. 그렇다. 환경이라고 볼 수 있다. 개념적으로 .NET 프레임워크를 설명하자면 다음처럼 나타내 볼 수도 있다.

    - Application을 개발, 배치하는 것을 단순화, 현대화 시킨 새로운 플랫폼.
    - 공개표준 프로토콜을 사용, 지원하는 인터넷 지향 어플리케이션 제작을 위해 설계.
    - 풍부한 클래스 라이브러리를 제공.
    - 모든 언어를 사용 가능하게 하는 언어 중립적인 플랫폼.
    - COM, DLL으로 제작된 기존 컴포넌트를 상호운용하도록 지원.
    - 새로운 운영체제(Operating System)가 아닌, 관리된 런타임 환경을 의미.
    - 독립적인 관리 환경인 Common Language Runtime을 통해 코드실행을 지원.

.NET 프레임워크가 ASP.NET 개발에 필수적인 기술임은 자명하다. 하지만, 이는 ASP.NET 뿐 아니라 윈도우즈 어플리케이션의 개발까지도 모두 관여하는 기본적인 시스템 서비스들을 제공한다. 다시 말해, .NET 프레임워크는 여러번 언급했다시피 OS 에 add-on 되어져서 .NET 기술에 대한 기본 지원 시스템 서비스들을 제공해 준다는 이야기이다.

이제 기술적으로 한번 바라보자. .NET 프레임워크는 크게는 두 부분으로 이야기할 수 있다.

    - 공통 언어 런타임(Common Language Runtime)
    - .NET 프레임워크 클래스 라이브러리(.NET Framework class library)

다시 위의 그림에서 .NET 프레임워크 부분을 살펴보면,  Common Language Runtime과 Base Class library 그리고, Data & XML 과 ASP.NET & Web Services, Windows Forms 로 구성되어져 있음을 확인할 수도 있다.

Base Class Library는 I/O, 문자열, 네트웍 보안, 스레딩, 텍스트, 리플렉션, 컬렉션등의 기본적인 클래스를 제공하는 기본 클래스 라이브러리이며, DATA & XML 은 데이터 액세스와 관계한 ADO.NET과 XML 부분을 제공하는 역할을 한다. ASP.NET과 웹 서비스는 분산 웹 어플리케이션을 구축하는 근간을 제공하며 또한, Windows Forms 는 윈도우즈 어플리케이션을 구축하는 기반이 되어준다. 이들 또한 매우 중요하지만, 이 들도 크게는 .NET 클래스 라이브러리에 포함되어진다고 볼 수 있다.

해서 필자는 .NET 프레임 워크를 크게 두 부분으로 나눌 수 있다고 이야기한 것이다.

.NET 프레임워크의 가장 중요한 부분중에 하나는 역시 C.L.R 이다. 그렇다고, .NET 클래스 라이브러리가 덜 중요하다는 것은 아니다. 만일, .NET 프레임워크 클래스 라이브러리가 제공되지 않는다면,  .NET 프로그래밍을 포기할 수도 있을 정도로 이 또한 중요한 것이다. 이 라이브러리가 어쩌면 프로그래밍의 전부라고도 이야기 할 수 있으니 말이다.

둘은 각각 맡은 분야가 틀리다. CLR은 일종의 코드의 관리환경이다. 이러한 환경을 통해 여러분은 안정적이고, 확장성 있는 솔루션을 개발해 낼 수가 있다. 일종의 플랫폼의 실행 하부구조를 제공하는 의미라고 보면 되겠다. 클래스 라이브러리는 여러분이 프로그래밍에서 사용할 수 있는 모든 기본적인 클래스들을 제공해 주며, 이러한 클래스들을 .NET 언어로 잘 엮어서 멋진 솔루션을 또한 만들어 낼 수 있다.

그렇다면, 이제 이들에 대해서 조금씩 더 구체적으로 알아보도록 하자.


Commmon Language Runtime

일단, CLR을 이해하려면 그 구조를 먼저 살펴보아야 한다. CLR은 무엇을 하는 것인가라는 질문의 답은 CLR이 어떠한 것들로 구성되어져 있는가를 통해서 얻어낼 수 있는 것이니 말이다. 다음 그림은 이러한 CLR의 구성을 이해하기 쉽게 나타낸 그림이다.

일단 첫 모습은 만만치 않아보인다. 하지만, 속을 들여다보면 반드시 그렇지 만도 않다. 이들 자체에 대한 깊은 내용은 여러분이 .NET 프레임워크 관련 서적을 통해서 구체적으로 배울 수 있을 것이다. 이 강좌는 ASP.NET 관련이라는 것을 기억해내라. 언제나 중용은 어려운 법이다. 태오는 이 강좌에서 너무 많은 욕심을 부리는 모습은 보이고 싶지 않다.

CLR은 MFC나 ATL 같은 개발을 돕는 라이브러리가 아니라, 프로그램이 실행되고, 관리되는 환경이다. 이 이야기는 무엇보다 중요하다. MFC나 ATL 같은 개발을 돕는 라이브러리의 역할은 .NET 프레임워크 클래스 라이브러리와 Windows Forms 쪽에서 담당한다. 이 둘을 헛갈리는 것은 곤란하다. CLR은 어플리케이션의 개발을 쉽게 하고, 튼튼하고 안전한 실행환경을 제공한다. 또한, 다중 언어들을 지원하며, 어플리케이션의 배포와 관리를 쉽게 해준다는 장점을 가지고 있다.

자.. 그럼 CLR을 구성하는 요소들 각각에 대해서 알아보자. CLR의 모든 구성요소들에 대해서 알게되면 CLR이 무엇을 하는 친구인지 더 잘 이해가 될 것이다.

CLR의 가장 밑단에는 Class Loader가 위치하고 있다. 이는 메타 데이터(데이터를 나타내는 데이터, 차후 이야기될 것이다)를 관리하며, 클래스들의 레이아웃과 로드를 관리하는 역할을 한다.

그 위로는 IL to Native Compiler 가 위치하고 있는데, 이는 코드가 컴파일되어져 만들어진 중간언어를 Native 코드로 컨버트 시켜주는 역할을 담당한다.  지금 여기서 잠시 엉? 하시는 분들이 있다. 그도 그럴 것이 여러분은 아직 컴파일을 하는데 왜 중간언어라는 것이 만들어지는지, 중간언어라는 것은 무엇인지에 대한 그 어떠한 이야기도 이 강좌의 전에서는 들어본 적이 없기 때문이다.

간단하게 이야기하면, 여러분이 .NET 언어로 작성한 모든 코드들은 컴파일되어지면, 그 때 실행파일이 만들어지는 것이 아니라, Common Language Runtime내의 JIT(Just-In-Time) 라는 컴파일러에 의해 재 컴파일이 되어질 수 있는 중간적인 언어(IL 혹은 MSIL : Microsoft Standard Intermediate language) 로 만들어지게 된다. 여러분이 작성한 코드는 각 언어 컴파일러에 의해 중간 언어로 컴파일되며, 이 MSIL은 런타임에 의해 또는 처음 실행될 때 Just-In-Time(JIT)에 의해 원시 코드(native code)로 컴파일된다.

해서 그렇게 개발자가 작성해서 컴파일 해 놓은 중간언어를 원시코드로 컨버트시키는 역할을 담당하는 역할을 CLR의 IL to Native Compiler 가 담당하는 것이다. 이해가 조금 어려울 수도 있다. 자 ~ 그러한 궁금증은 조만간 풀릴 것이다. 그러므로 조금은 답답한 면이 있다하더라도 지금은 각각의 설명에 집중하도록 하자.

  관리 코드(Managed Code)란?

MSIL로 컴파일되어 CLR 에 의해 관리되는 코드를 관리 코드(managed code)라고 한다. 관리 코드는 런타임에 의해 개체의 생성과 초기화, 메모리 할당, 가비지 컬렉션과 같은 코드 실행이 전반적으로 관리되어 진다.

그 옆으로는 Code Manager와 Garbage Collector가 존재하고 있다. 코드 매니저는 말 그대로 코드의 실행을 관리하는 역할을 하며, 가비지 컬렉터는 어플리케이션을 위해 자동으로 메모리를 관리하는 역할을 한다. 이는 매우 중요한 CLR의 역할 중에 하나인데, 이를 통해서 모든 메모리는 자동적으로 관리가 이루어지게 된다. 가비지 컬렉터의 제공으로 개발자들은 객체를 생성한 후에, 자원을 해제할 필요가 없어졌다. 이전 컴포넌트 개발시 자원을 미처 해제하지 못한 코드들로 인해 발생했던 메모리 누수를 겪어본 개발자들이라고 한다면 이 기능이 매우 반가울 것이다.

가바지 컬렉터는 개체가 더 이상 참조되지 않거나 사용되지 않으면 자동으로 그것들을 버려서 메모리 누수(Memory leak)현상을 방지하는 역할을 한다. 이는 사실상 수시로 그러한 수집작업을 하는 것은 아니고, 메모리가 일정치이상 높아질 경우 수집작업을 수행한다. 가비지 컬렉터에 대한 심화는 고급 프로그래밍쪽의 서적에서 다룰 만한 이야기이므로 메모리와 관계된 깊숙한 이야기가 궁금하신 분들은 C# 관련 M.O.C 교재나 .NET 프레임워크와 관계된 전문적인 서적을 참고하시기 바란다.

그리고 또한, CLR은 Security Engine과 Debug Engine를 제공하고 있다. 보안 엔진은 사용자뿐 아니라 코드 자체를 기반으로 하는 보안까지 제공하는 엔진을 나타내며, 디버그 엔진은 코드의 실행을 추적하거나 어플리케이션을 디버그할 수 있도록 해주는 엔진을 의미한다.

그리고, Type Checker은 강력한 형의 안정성을 체크하는 기능을 제공하며, 초기화 되지 않은 변수나 불안전 형 변환을 막도록 해주는 역할을 하며, Exception Manager는 강력하게 예외 및 에러를 관리하는 기능을 제공한다.

Thread Support는 멀티 쓰레드를 가진 프로그래밍이 가능하도록 클래스와 인터페이스를 제공해 주는 역할을 가지고 있으며, COM Marchaller 를 통해서 COM으로의 마샬링(서로 다른 프로세스간의 COM 개체의 통신)을 가능하게 해준다.

이 모든 기능이 CLR 에서 제공하는 기능이다. 이제서야 여러분은 CLR이라는 것이 코드의 실행을 관리하는 런타임 환경이라는 말을 이해할 수 있을 것이며, 이러한 기능이 얼마나 중요한 것인지 새삼 느낄 수 있을 것이다. .NET 코드들이 아주 원할하고, 강력하게 동작할 수 있도록 안정성있는 환경을 제공하는 공통 언어 런타임을 제일 상단에 .NET 기본 클래스 라이브러리를 지원할 수 있도록 하는 Base Class Library Support를 제공하고 있어서, 모든 .NET 언어가 .NET 기본 클래스 라이브러리를 사용할 수 있도록 해주고 있다.


.NET Framework Class Library

기본 클래스 라이브러리와 ASP.NET, ADO.NET, Windows Forms를 포함하는 .NET 프레임워크 클래스 라이브러리는 이전의 Windows API에 의해서 가능했던 모든 작업들에 관한 기능들을 제공하는 클래스들의 거대한 집합이며, 매우 사용하기 쉽고, 문서화도 잘 되어 있다. 사실상 .NET 언어의 몫이라는 것이 .NET 클래스 라이브러리를 가져다가 꾸밈을 넣어 사용하는 것에 불과하다라고 말할 수 있을 정도로 이 클래스 라이브러리는 중요하다. 간단하게 이러한 .NET 클래스 라이브러리에는 어떠한 것들이 포함되어져 있는지 확인해 보자. 그들을 보면 아마도 .NET 클래스 라이브러리없이는 그 어떠한 프로그램도 작성하고 싶지 않아질 것이다.

    - .NET 에서 제공하는 모든 Data Type
    - Windows Graphics User Interface와 Controls
    - ASP.NET의 Web Forms
    - ADO.NET의 Data Ascess
    - Directory Access
    - File System & Registry Access
    - Networking and Web Browsing
    - .NET Attributes and Reflection
    - Windows 환경 변수 Access
    - COM 상호운용
    - GDI+ (Windows Graphics Device Interface +)

거의 모든 부분에 클래스 라이브러리는 관여하고 있다. 만일 모든 클래스들과 그 클래스들의 목록을 알고 싶다면, 여러분은 다음 사이트에서 그 클래스들을 브라우징 할 수 있다.

http://samples.gotdotnet.com/quickstart/aspplus/samples/classbrowser/vb/classbrowser.aspx

만일, 여러분이 Vosual Studio.NET을 설치한 뒤, [시작] [모든 프로그램] [Microsoft .NET Framework SDK] 의 "샘플 및 퀵 스타트 자습서" 를 통해서 QuickStart 를 여러분의 개발 PC에 설치했다면 로컬의 다음 경로에서도 .NET Framework Class Browser 를 확인해 볼 수 있다.

http://localhost/QuickStart/aspplus/samples/classbrowser/cs/classbrowser.aspx

출처 : (taeyo.pe.kr)

2007/03/13 22:46 2007/03/13 22:46