Posted
Filed under .NET/ASP.NET

이번 강좌에서는 ASP.NET 1.X 시절의 개발과 ASP.NET 2.0 기반의 개발에서 실제 개발자들이 느끼게 되는 차이점과 어떤 식으로 ASP.NET 2.0에서는 개발을 하면 되는 지에 대한 제 개인적인 생각을 사설 식으로 풀어볼까 합니다.

우선 ASP.NET 2.0에 대한 전반적인 새로운 모습들이 궁금하신 분들은 제가 작년에 월간 마소에 기고했던 다음 컬럼을 한번 읽어 보시기 바랍니다.

http://taeyo.net/lecture/NET/AspNet2.asp

그 글을 보시고 나면, 대단히 많은 새로운 기능들이 추가된 모습에 약간은 당황스러우시거나, 혹은 개발이 훨씬 쉬어질 수 있다는 기대에 기쁨이 느껴질지도 모르겠습니다. 컨트롤들을 뚝딱뚝딱 올려놓으면 모든 것이 알아서 다 되니 말입니다.

하지만, 한 가지 기억해야 할 것은 새로운 버전과 함께 제공되는 새로운 기능들이 반드시 필수적으로 사용해야만 하는 것은 아니라는 점입니다. 새로운 제품은 항상 새로운 기능을 제공하는 것이 당연합니다만, 그것들을 선택적으로 상황에 맞게 사용하는 것은 개발자의 몫입니다. 무턱대고 새로운 기능을 남발하는 것이 언제나 최선의 방법은 아니라는 말씀을 드리고 싶습니다. 제가 ASP.NET 2.0 세미나와 강의를 진행하면서 느끼는 것 중 하나는 교육을 받으시는 분들 중에는 ASP.NET 2.0의 수많은 새로운 기능들을 반드시 사용해야만 한다는 압박감에 사로 잡히셔서, 부담을 느끼는 분들이 의외로 많았다는 것입니다.

사실 중압감을 느끼실 필요는 전혀 없습니다. 일단은 시야를 넓게 가지시고, 새롭게 제공되는 기능이 각각 어떤 역할을 하는 지, 그 기능을 이용하면 기존의 개발과 비교했을 경우 어떤 점이 나아지는 지 정도만을 살펴보는 것으로 충분하다고 생각합니다. 즉, 지금 당장 면밀하게 모든 새로운 기능을 다 알 필요는 없다는 의미입니다. 물론, 다 공부할 수 있다면 더할 나위 없이 좋겠지만 그것은 선택일 뿐 필수는 아니라는 것이죠. 새로운 기능들이 대략적으로 어떤 것이고, 어떤 경우에 적용하면 좋은 지를 큰 그림으로 바라보는 것이 현재로서는 더 중요하다고 생각합니다. 보다 상세한 기능과 구현 방법은 그것을 적용할 경우에 배우셔도 크게 늦지 않는다고 생각하기 때문입니다.

제가 느끼기에는 ASP.NET 2.0 기반의 개발도 ASP.NET 1.x 기반의 개발과 크게 다를 것이 없습니다. 많은 기능이 추가되었지만 그것은 사용하기 나름이기 때문입니다.

요즘 원서로 나오는 책들을 보면 ASP.NET 2.0의 새로운 기능만을 나열하고 있을 뿐, 그들을 이용해서 어떻게 효과적으로 웹 어플리케이션을 제작하는 것이 좋은지에 대해서는 그다지 언급하지 않고 있습니다. 그럴 수 밖에 없는 상황(ASP.NET 2.0이 너무 방대해져 버렸기에)을 이해 못하는 것은 아니지만 그래도 뭔가 ASP.NET 2.0을 효과적으로 적용할 수 있는 방법을 제시하는 책이 나와주었으면 했는데 말이죠(그런 책이 곧 나와줄 것이라 계속 기대하고 있는 중이긴 합니다).

자. 듣고 보니 기분이 훨씬 가벼워졌죠? 그렇다면, 다행입니다. 원래 뭔가 새로운 것을 시작할 때는 그런 첫 마음이 매우 중요합니다. 그렇다면, 이제 시작해 보겠습니다. ^^

ASP.NET 2.0을 개발하려면 물론 예전처럼 텍스트 편집기로 작업이 가능하지만 그래도 Visual Studio 2005가 최적의 도구임을 부인할 사람은(남편할 사람도) 아무도 없을 것입니다. 해서, 강좌도 그 툴을 이용해서 진행합니다.

가장 먼저 Visual Studio 2005로 새롭게 웹 프로젝트를 하나 만들어 보겠습니다. 웹 프로젝트를 새롭게 만드는 시점부터 뭔가 재미난 것을 볼 수 있는데요. 그것은 VS 2005 부터는 웹 프로젝트를 만들기 위해 더 이상 IIS가 필수적으로 요구되지 않는다는 것입니다. 즉, 일반 폴더를 마치 가상 디렉터리처럼 사용할 수 있다는 것이죠. VS 2005 자체가 가상 웹 서버를 내장하고 있어서 일반 폴더에 있는 파일을 실행해도 그 순간 해당 폴더를 가상 디렉터리처럼 만들어서 페이지를 실행해 줍니다. 이는 개발 시에 상당한 이점이 되어줄 것입니다.

저는 C:\WebSites(별도로 이러한 폴더를 만들어 주세요)라는 폴더의 하위로 ASPNET2라는 폴더를 웹 프로젝트의 경로로 지정해 보았습니다. 여러분도 그렇게 만들어 보시겠어요? 그림과 같이 말입니다.

그러면, 해당 폴더가 실제로 가상 디렉토리가 아닌 로컬 파일 시스템에 만들어지는 것을 볼 수가 있습니다. 하지만, 실행을 하게 되면 마치 가상 디렉터리에 존재하는 웹 페이지들이 실행되는 것처럼 동작하게 됩니다. 물론, 이는 VS 2005의 기능일 뿐 ASP.NET 2.0의 기능과는 아무런 상관이 없다는 것은 기억해 주세요 ^^

자. 이제 새롭게 ASPNET2 웹 프로젝트에 웹 폼을 하나 추가해 보도록 하겠습니다. 메뉴 중 [파일][새 파일]을 선택(단축키는 Ctl+N)하셔서 파일을 추가하시는 데요. 당연한 이야기지만 웹 폼을 추가하셔야 합니다. 폼의 이름은 Main.aspx로 주시고, 다음과 같이 [다른 파일에 코드 입력]에 체크 표시를 하도록 하세요. 그래야 코드 비하인드(code behind)를 사용하는 것이 된 답니다. 그리고, 사용 언어는 C#으로 하도록 하겠습니다. (VS 2005부터는 각 폼 별로 언어를 각기 사용할 수 있습니다)

추가된 Main.aspx 페이지는 겉으로 보기에는 ASP.NET 1.x 시절의 웹 폼과 큰 차이가 없습니다. 그렇습니다. 내부적으로는 다소간의 변화가 있었지만, 겉으로 보기에는 큰 차이가 없습니다. 굳이 차이점을 이야기 하라면 다음과 같은 것들이 있긴 하지만요.

1. 클래스 선언 부에 partial 이라는 키워드가 추가되었다.
2. 클래스 안에 컨트롤 선언 코드들과 이벤트 매핑 코드들이 사라졌다.
   (기존 1.x에서는 [Web Form 디자이너에서 생성한 코드] 라는 구역이 있었는데 그 부분이 아예 없어졌습니다)

이는 의미하는 바가 크기에 설명을 하지 않을 수가 없습니다.

partial이란 것은 어떤 의미일까요? 그 단어가 의미하듯이 이는 일부분이라는 의미입니다. 즉, 현재 선언하고 있는 클래스는 전체 클래스의 일부분이라는 의미인 것입니다. C# 2.0에서 새롭게 추가된 partial이라는 키워드는 하나의 클래스를 물리적으로 다른 두 개의 파일에 담을 수 있게 하는 기능입니다. 그리고, 물리적으로 분리되어 있으나 하나의 클래스인 이 들은 컴파일 시에 하나로 합쳐져서 컴파일되는 것이죠. 이는 많은 개발자들이 요구해왔던 기능 중에 하나였고 그래서 .NET 2.0에서 추가되었습니다. 이 기능이 왜 필요한 지는 다음 글을 참고해 보세요. 드원 소프트웨어의 유경상 수석님이 2005년 5월에 월간 마이크로소프트웨어에 기고한 글인데 맘에 들어서 인용을 해 봤습니다.

partial type이 정말로 유용해 지는 것은 웹 서비스 참조나 형식화된 데이터셋과 같이 비주얼 스튜디오가 관련된 코드를 생성해 주는 경우이다. 이전 버전의 비주얼 스튜디오에서 웹 서비스를 참조하면 웹 서비스에 대한 클라이언트 프록시 코드가 생성되곤 했다. 이 프록시 코드는 별도의 .cs 소스 파일로(대개 Reference.cs라는 이름으로) 존재했다. 문제는 이 프록시 코드에 개발자가 별도의 코드를 추가하고자 할 때이다. 자동으로 생성된 소스 파일을 수정하는 것까지는 문제가 없지만 웹 서비스 참조를 갱신(update)하는 경우, 개발자가 추가해 놓은 코드는 모두 유실되어 버린다. 이 때문에 웹 서비스 프록시 클래스를 상속하는 별도의 클래스를 만들고 이 클래스에 코드를 추가하는 우회 방법을 쓰곤 했다. 이러한 우회 방법도 완전하지 않은 것이, 클래스가 특성(attribute)을 추가해야 한다거나 클래스의 private 필드를 액세스해야 하는 경우, 난감한 상황이 발생하곤 했다.

출처 : 마이크로소프트웨어 [2005년 5월]

유경상 수석 컨설턴트의 블로그 : www.simpleisbest.net

그렇다면, ASP.NET 클래스에서는 왜 partial이 사용되는 것일까요? 그것은 위에서 언급한 차이점 2에 그 해답이 있습니다. ASP.NET 2.0부터는 aspx 파일에 서버 컨트롤을 추가하더라도 코드 비하인드에 개체 변수가 생성되지 않습니다. 마찬가지로 이벤트 매핑 코드(this.Load += new EventHandler(..)와 같은)도 추가되지 않습니다. 그러한 코드는 컴파일 시에 동적으로 별도의 partial 클래스로 생성되기 때문입니다. 그리고, 현재의 코드 비하인드 클래스와 하나로 묶여서 컴파일 되어 완전한 하나로 거듭나게 되는 것이죠.

왜 ASP.NET 2.0에서는 그 부분을 partial 클래스로 동적 생성하는 것일까요? 사실, 그 부분은 개발자가 일일이 작성할 필요도 없는 부분인데다가(즉, 자동화 적용이 가능한 부분), 그 부분이 수동으로 편집 가능함으로써 예기치 않은 문제들이 있어왔기 때문입니다. 해서, partial을 적용함으로써 예전 ASP.NET 1.x의 경우에 종종 있어왔던 문제(예를 들면, 배포 후에 실수로 aspx 페이지의 서버 컨트롤 id를 변경한다던가 해서 발생하곤 했던 런타임 오류)를 확실하게 예방하고, 개발자의 노고도 줄여주게 한 것입니다.

해서, ASP.NET 2.0부터는 partial 클래스를 기본적으로 사용하도록 되었습니다. 어떻습니까? Partial이 적용되니 코드 비하인드 클래스도 뭔가 확 다이어트가 되어서 정갈하고 깔끔한 느낌이 들지 않나요? ^^

일단 ASP.NET 페이지만을 놓고 바라봤을 경우에, 개발자들에게 직접적으로 느껴지는 ASP.NET 1.x와 2.0의 차이점은 이 정도입니다. 그 외에 개발하는 방식 자체는 사실 기존과 크게 다르지 않습니다. ^^ 기타 차이점이나 새로운 기능들은 이후 강좌를 통해서 더 설명을 드리겠지만, 그 부분은 ASP.NET 페이지 자체와는 크게 차이가 없는 부분이기에 지금은 설명을 참고(?) 있는 것입니다. (아까부터 배가 아픈데 참느라 힘듭니다)

ASP.NET 2.0의 내부가 기존과 어떻게 달라졌는지가 매우 궁금하신 분들은 다음의 MSDN 링크(한글판)에서 그 자세한 정보를 얻어보시기 바랍니다.

http://www.microsoft.com/korea/msdn/library/ko-kr/dev/aspdotnet/internals.aspx

그렇다면, 이제 화면을 간단하게나마 마저 구성해 볼까요?

다음 그림과 같이 버튼과 레이블을 각각 하나씩 폼 위에 올려서 우리만의 멋진 사이트를 완성해 보도록 하겠습니다.

그리고, 버튼을 더블 클릭하여, 코드 비하인드 페이지의 코드를 다음과 같이 완성하도록 하겠습니다.

public partial class Main : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = DateTime.Now.ToString();
    }
}

다 되었다면, 다음과 같이 [솔루션 탐색기]에서 Main.aspx 페이지를 실행해 보세요 ^^

그러면, 다음 그림과 같이 VS 2005의 가상 웹 서버가 동작을 하기 시작하면서 트레이 아이콘에 웹 서버가 올라오는 것을 볼 수 있습니다. 하하하. 재미있죠?

그리고, 웹 페이지는 제대로 동작하여 다음과 같이 화려하고 멋진 결과가 나오는 것을 볼 수 있을 것입니다.

호오~ 멋지죠?

페이지의 결과는 나왔습니다만, 현재 상태로는(VS 2005의 도움이 없이는) 브라우저만으로 페이지를 실행할 수가 없습니다. 웹 페이지가 실제로 IIS 상에서 서비스되는 것이 아니기 때문이죠.

현재의 방식은 VS 2005를 이용해서 IIS 없이 개발자 PC에서 개발할 경우의 시나리오이고요. 실제로 개발이 끝난 다음에는 이를 IIS에 배포를 해야 할 것입니다. 물론 배포를 하는 것은 예전과 같은 방식으로 수동으로 파일을 복사해서 배포할 수도 있을 것입니다만, VS 2005을 이용하면 이러한 배포로 매우 쉽게 가능합니다. ^^ 더불어, 소스(HTML 포함)를 전혀 노출하지 않는 상태로의 배포도 가능하죠.

출처: Taeyo.pe.kr

2007/08/08 11:54 2007/08/08 11:54