ASP.NET MVC - Model(2)



이렇게 글쓰면서 이런 경험 처음이야~ 를 느낀 저는.. 제글을 읽는 모든 분에게 고합니다;;;
제 글을 봐주시는건 참으로 고맙습니다. 허나, 제 글을 본인글처럼해서 블로그에 올리신다면.. 저는 어떻게 해야할까요? 그러지말아주세요. 꼭 부탁드립니다. 찔리시는 분이 있다면 삭제바랍니다. 삭제를 계속 안하신다면 신고해야겠죠? 이런기분 훌훌털고 다시 집중하도록 하겠습니다.


지난 시간에 이은 모델 생성이야기 두번째 글입니다. 이번시간은 LINQ to SQL을 이용해보도록 하죠^^

LINQ to SQL로 모델클래스 생성하기

지난시간 '엔티티 프레임워크로 모델 생성하기' 때에 데이터베이스와 테이블을 생성하였습니다. 그것을 그대로 사용하겠습니다. 궁금하시면 지난 포스팅을 참고하여주세요.

LINQ to SQL 클래스 생성하기

먼저, 모델클래스를 생성하겠습니다. 모델 폴더에서 마우스 우번튼클릭! Add->New Item 클릭!
Data 템플릿을 선택후 LINQ to SQL Classes를 선택합니다. 이름은 TelDir.dbml로 하겠습니다.


Add를 클릭하여 마치시면, Object Relational Desinger 창이 뜹니다. 창에 써있는 글을 읽어보면 자기는 Object Relational Designer이고 비쥬얼하게 클래스를 보여준다네요. 어떻게하면? 지난번에 만들어 놓은 테이블을 끌어다 놓으면요.


서버 탐색기 창에서 TelDir 테이블을 끌어다 놓겠습니다.


TelDir 모델이 지난시간 엔티티 프레임워크에서 사용하였기에 이름을 바꾸도록 하겠습니다. TelDirLQ로 한후, 위의 만족스러운 그럼처럼 보인다 싶으면 Save 아이콘을 클릭하여 저장하도록 하겠습니다.

일단 보자(View)

저는 Home2Controller를 새롭게 생성하여 진행하도록 하겠습니다. HomeController는 이미 사용하였으니까요.. 버려~!

Home2Controller를 생성하였으면 Index() 메쏘드를 수정하도록 하겠습니다. 우선, 디비 커넥션부분을 추가하여야겠죠? LINQ to SQL은 DataContext 클래스를 사용합니다. 좀전에 TelDir.dbml 클래스를 생성하였을때, TelDir.desinger.cs 파일이 생성되는 것을 확인할수 있습니다. 열어보시면,


DataContext 클래스를 상속받아 TelDirDataContext를 생성하는 것을 보실수 있습니다. DataContext와 Linq to Sql 에 대해 조금의 의문점이 생기신다면 여기 를 따라가 주세요. 보시면 LINQ to SQL이 데이터베이스에 연결하는 것도 나오고.. 암튼 보세요^^;;

그래서  Home2Controller 소스는 다음과 같습니다.


TelDir.desinger.cs 파일에서 보셨듯이, TelDrDataContext()로 데이터베이스에 커넥션을 합니다.
dataContext가 TestDB 데이터베이스와 매핑이 되고, TelDirLQs가 TelDir 테이블이 매핑이 됩니다. 그래소, 소스를 보시면.. 'TelDir 테이블에서 가져와~', '그것을 telDirs에다 넣어~' 로 보이시죠?^^;

액션메쏘드가 생성되었으니 이제는 뷰를 만들시간이네요. 메쏘드에서 우버튼클릭후 Add View 하시면 다음과 같은 팝업창이 뜹니다.


위처럼 하세요.^^; 그리고 Add 를 클릭합니다. 만약 View data class에서 TelDirLQ가 보이지 않으시다면!!! 그건 빌드를 안해서입니다. 모델클래스가 생성되면 꼭!! 빌드를 해주세요.

Index.aspx 소스는 다음과 같습니다.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcModelTest1.Models.TelDirLQ>>"
%>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Index</h2>
    <table>
        <tr>
            <th></th>         
            <th>
                NAME
            </th>
            <th>
                PHONE
            </th>
            <th>
                WDATE
            </th>
        </tr>
    <% foreach (var item in Model) { %>   
        <tr>
            <td>
                <%= Html.ActionLink("Edit", "Edit", new { id=item.ID }) %> |
                <%= Html.ActionLink("Details", "Details", new { id=item.ID })%>
            </td>           
            <td>
                <%:item.NAME %>
            </td>
            <td>
                <%:item.PHONE %>
            </td>
            <td>
                <%:String.Format("{0:g}", item.WDATE) %>
            </td>
        </tr>
    <% } %>
    </table>
    <p>
        <%= Html.ActionLink("Create New", "Create") %>
    </p>
</asp:Content>

F5를 클릭하여 /Home2 를 보셔야겠죠? 우리가 지금 만들어 본것은 Home2Controller니까요. 확인이 되셨으면. 오케이!!

Repository 패턴 사용하기

현재 LINQ to SQL 클래스를 사용하여 컨트롤러 클래스의 액션메쏘드에 직접 디비를 연결하고 쿼리를 했습니다. 이는 지금의 테스트의 경우처럼 간단한 어플리케이션에서는 위처럼 할 수 있지만, 좀더 크고 복잡한 어플리케이션에서는 문제를 발생시킵니다. 어떤 문제인고 하니, DB액세스 기술을 변경하는 것에 대한 어려움이 있습니다.  예를들어, 전에 해본 엔티티 프레임워크와 지금 해본 LINQ to SQL의 경우를 봤을때, 컨트롤러가 직접적으로 디비 액세스를 담당한다면 변경시 액세스 부분이 있는 모든 컨트롤러를 수정해야겠죠? 아흑! 짜증.
유닛테스트 시에도 어려움이 있죠. 테스트의 경우 직접적으로 디비에 액세스를 할 필요가 없는데 컨트롤러에서 액세스를 직접적으로 하게되면 계속 수정작업이 발생하죠. 리파지터리 패턴을 통해 모든 디비 액세스 로직을 포함하는 인터페이스를 생성하도록 하겠습니다.

먼저 TelDir 리스트를 가져오는 인터페이스를 생성하겠습니다.


그리고, ITelDirRepository를 구현한 TelDirRepository 클래스를 생성하겠습니다.


이렇게 인터페스를 구현하는 리파지터리 클래스들을 생성함으로 데이터베이스 액세스 방법에 따라 리파지터리만 수정하므로, 전처럼 데이터베이스 액세스하는 소스가 포함된 모든 컨트롤러를 수정하는 것이 아닌 간단한 처리로 할수 있게되죠.

이제 리파지터리를 이용한 컨트롤러로 수정해보겠습니다.


컨트롤러 소스를 보시면, 먼저 생성자가 2개가 있는 것을 볼수 있습니다. 애플리케이션이 시작하고 처음에 컨트롤러가 호출되면 인자가 없는 생성자가 호출이 되어지고 바로 리파지터를 파라미터로 받는 생성자가 호출이 됩니다.
컨트롤러 자체에 직접적으로 데이터베이스에 액세스하는 부분이 없으므로 액세스하는 방식이 변경될때 컨트롤러를 수정할 필요가 없게되는거죠. ㅎㅎ

유닛테스트 시에도 데이터 액세스를 하지않는 리파지터리를 생성하여 테스트하면 되겠죠?
다음에 유닛테스트에 대해서도 알아보는 시간 갖도록 하겠습니다.

참고 : http://www.asp.net/learn/mvc/tutorial-10-cs.aspx

'.NET > MVC Basic' 카테고리의 다른 글

ASP.NET MVC - Validation(2)  (0) 2010.05.25
ASP.NET MVC - Validation(1)  (0) 2010.05.24
ASP.NET MVC - Model(1)  (0) 2010.03.31
ASP.NET MVC - View(4)  (0) 2009.12.11
ASP.NET MVC - View(3)  (0) 2009.12.02