코드 비하인드로 구현하긴 하였으나, 코드 비하인드 파일을 Start2.aspx 에서 사용했던 그 클래스 파일을 그대로 사용하고 있다. 말 그래도 하나의 비하인드 파일을 공유해서 사용하고 있는 것이다. 우리가 구성해 놓은 하나의 Start.cs 라는 클래스 파일을 Start2.aspx와 Start3.aspx 파일에서 모두 사용하고 있다. 그리고, Start.cs 에서 여러분이 코드를 수정하게 되면 그 내용은 Start2.asp와 Start3.aspx 모두에 반영된다. 그림으로 표현하면 다음과 같다.

하지만, 사실 위의 그림은 여러분들이 이해하기 좋도록 개략적으로 나타낸 그림일 뿐 실제는 이렇지가 않다. 클래스 파일인 Start.cs는 클래스 자체로서는 실행을 할 수가 없다. 클래스는 일종의 설계도 일뿐 이고, 그것이 실행되려면 하나의 실행이 될 수 있는 파일(어셈블리, DLL)로써 존재하고 있어야만 한다.

 

 

즉, 우선적으로 클래스 파일은 컴파일이 되어 있어야 한다는 것이다. 그러나, 우리는 클래스 파일을 컴파일 한 적이 없다. 그럼에도 실행은 제대로 되었다. 이것은 무엇을 의미하는가? 어쩌면 우리가 클래스 파일을 컴파일 하지 않았어도 사실상 내부적으로 이 클래스 파일은 컴파일이 된 것은 아닐까? 그렇다. 아주 정확한 추측이다.

 

ASP.NET은 코드 비하인드 클래스와 연계된 aspx 페이지가 요청될 경우, 아직 그 비하인드 클래스가 컴파일 되지 않았다면, 우선적으로 그 클래스를 컴파일하고, DLL로 만들어 어셈블리 캐쉬 위에 올려놓는다. (이전의 ASP.NET 실행모델에서 설명을 하였었다)

그리고, 이후로는 Start2.aspx 나 Start3.aspx 요청 시 Start.cs의 컴파일 단계 없이 이미 어셈블리 캐쉬에 존재하는 해당 DLL 을 이용하는 것이다. 고로, 이것을 구체적으로 나타내면 다음 그림과 같다고 볼 수 있다.

 

다음 그림은 MSDN 에서 제공하는 ASP.NET Page 의 구성과 실행 모습이다.(우리의 상황에 맞게 약간 편집을 하였다) 지금의 여러분이라면 이해할 수 있을 것이다. 만일 이해가 여전히 가지 않는다면, 일단은 그냥 읽어나가고 여러분이 필자의 책을 모두 정독한 후, 지식의 수준이 상승한 다음 다시 이 그림을 확인해 보기 바란다. 그 때에는 아래의 그림이 여러분의 지식을 깔끔하게 정리 해 줄 것이다

우리가 작성한 Start.cs 라는 비하인드 클래스 파일은 Page 라는 .NET 클래스로부터 상속을 받아 생성되었으며, 이는 초기 컴파일을 통해서 특정 이름의 DLL(그림의 경우는 MyProject.dll)로 만들어지게 된다. 이러한 컴파일은 ASP.NET 이 자동적으로 처리 한다는 것을 기억하자. 물론, 이러한 초기 컴파일은 해당 파일이 처음 요청될 경우에만 발생하는 작업이다. 만일, Start.cs 의 컴파일 결과 DLL 이 이미 만들어져서 어셈블리 캐쉬에 존재하게 되었다면, 이후 요청 시에는 이러한 컴파일 단계를 거치지 않을 것이며, 어셈블리 캐쉬에 이미 존재하는 해당 DLL 을 사용하게 될 것이다. (물론, 이 DLL은 중간 언어인 IL 이다)

만일, Start.cs 라는 클래스 파일이 수정되면 어떻게 될까? 그럴 경우는 예상대로 초기 컴파일부터 다시 수행하게 될 것이고, 그 결과 DLL 을 어셈블리 캐쉬에 올려놓게 될 것이다.

그리고, 이제 위 그림의 우측인 런타임 시를 살펴보자. 런타임 시(클라이언트로부터의 요청 시)는 요청에 의해 UI 페이지인 Start.aspx는 코드 비하인드 파일의 DLL(그림의 경우는 MyProject.dll)과 어우러져서(상속되어) 두 번째 컴파일이 발생하게 된다. 이 런타임 컴파일은 이미 알고 있다시피 Common Language Runtime의 JIT 컴파일러에 의해 수행되어지며, temporary.dll 이라는 원시 코드 파일을 만들어내고, 이에 의해 실행이 일어나게 되는 것이다.

물론, 위에서 예를 든, MyProject.dll 과 temporary.dll은 가상 명칭이다. 실제로는 ASP.NET에 의해서 이름이 랜덤하게 만들어지게 된다. 나중에 살펴보겠지만 그러한 DLL 들은 다음 경로에서 찾아 볼 수 있다. 이 곳이 바로 ASP.NET 을 위한 어셈블리 캐쉬라는 특별한 구역이다.

 

 

 


+ Recent posts