모델, 보기 및 컨트롤러 이해(VB)

작성자 : Stephen Walther

모델, 뷰 및 컨트롤러에 대해 혼동을 주시나요? 이 자습서에서 Stephen Walther는 ASP.NET MVC 애플리케이션의 다양한 부분을 소개합니다.

이 자습서에서는 ASP.NET MVC 모델, 뷰 및 컨트롤러에 대한 개략적인 개요를 제공합니다. 즉, ASP.NET MVC의 M', V' 및 C'를 설명합니다.

이 자습서를 읽은 후 ASP.NET MVC 애플리케이션의 여러 부분이 함께 작동하는 방식을 이해해야 합니다. 또한 ASP.NET MVC 애플리케이션의 아키텍처가 ASP.NET Web Forms 애플리케이션 또는 Active Server Pages 애플리케이션과 어떻게 다른지 이해해야 합니다.

샘플 ASP.NET MVC 애플리케이션

ASP.NET MVC 웹 애플리케이션을 만들기 위한 기본 Visual Studio 템플릿에는 ASP.NET MVC 애플리케이션의 여러 부분을 이해하는 데 사용할 수 있는 매우 간단한 샘플 애플리케이션이 포함되어 있습니다. 이 자습서에서는 이 간단한 애플리케이션을 활용합니다.

Visual Studio 2008을 시작하고 메뉴 옵션 파일, 새 프로젝트를 선택하여 MVC 템플릿을 사용하여 새 ASP.NET MVC 애플리케이션을 만듭니다(그림 1 참조). 새 프로젝트 대화 상자의 프로젝트 형식(Visual Basic 또는 C#)에서 즐겨 찾는 프로그래밍 언어를 선택하고 템플릿에서 ASP.NET MVC 웹 애플리케이션 을 선택합니다. 확인 단추를 클릭합니다.

새 프로젝트 대화 상자

그림 01: 새 프로젝트 대화 상자(전체 크기 이미지를 보려면 클릭)

새 ASP.NET MVC 애플리케이션을 만들면 단위 테스트 프로젝트 만들기 대화 상자가 나타납니다(그림 2 참조). 이 대화 상자를 사용하면 ASP.NET MVC 애플리케이션을 테스트하기 위한 별도의 프로젝트를 솔루션에 만들 수 있습니다. 아니요, 단위 테스트 프로젝트를 만들지 않음 옵션을 선택하고 확인 단추를 클릭합니다.

단위 테스트 만들기 대화 상자

그림 02: 단위 테스트 만들기 대화 상자(전체 크기 이미지를 보려면 클릭)

새 ASP.NET MVC 애플리케이션을 만든 후 솔루션 탐색기 창에 여러 폴더와 파일이 표시됩니다. 특히 Models, Views 및 Controllers라는 세 개의 폴더가 표시됩니다. 폴더 이름에서 짐작할 수 있듯이 이러한 폴더에는 모델, 뷰 및 컨트롤러를 구현하기 위한 파일이 포함됩니다.

Controllers 폴더를 확장하면 AccountController.vb라는 파일과 HomeController.vb라는 파일이 표시됩니다. Views 폴더를 확장하면 Account, Home 및 Shared라는 세 개의 하위 폴더가 표시됩니다. 홈 폴더를 확장하면 About.aspx 및 Index.aspx라는 두 개의 추가 파일이 표시됩니다(그림 3 참조). 이러한 파일은 기본 ASP.NET MVC 템플릿에 포함된 샘플 애플리케이션을 구성합니다.

솔루션 탐색기 창

그림 03: 솔루션 탐색기 창(전체 크기 이미지를 보려면 클릭)

메뉴 옵션 디버그, 디버깅 시작을 선택하여 샘플 애플리케이션을 실행할 수 있습니다. 또는 F5 키를 누를 수 있습니다.

ASP.NET 애플리케이션을 처음 실행하면 디버그 모드를 사용하도록 권장하는 그림 4의 대화 상자가 나타납니다. 확인 단추를 클릭하면 애플리케이션이 실행됩니다.

디버깅 사용 안 함 대화 상자

그림 04: 디버깅 사용 안 함 대화 상자(전체 크기 이미지를 보려면 클릭)

ASP.NET MVC 애플리케이션을 실행하면 Visual Studio가 웹 브라우저에서 애플리케이션을 시작합니다. 샘플 애플리케이션은 인덱스 페이지와 정보 페이지의 두 페이지로만 구성됩니다. 애플리케이션이 처음 시작되면 인덱스 페이지가 나타납니다(그림 5 참조). 애플리케이션의 오른쪽 위에 있는 메뉴 링크를 클릭하여 정보 페이지로 이동할 수 있습니다.

인덱스 페이지

그림 05: 인덱스 페이지(전체 크기 이미지를 보려면 클릭)

브라우저의 주소 표시줄에서 URL을 확인합니다. 예를 들어 정보 메뉴 링크를 클릭하면 브라우저 주소 표시줄의 URL이 /Home/About로 변경됩니다.

브라우저 창을 닫고 Visual Studio로 돌아가면 홈/정보 경로가 있는 파일을 찾을 수 없습니다. 파일이 없습니다. 어떻게 가능한가요?

URL이 페이지와 같지 않음

기존 ASP.NET Web Forms 애플리케이션 또는 Active Server Pages 애플리케이션을 빌드하는 경우 URL과 페이지 간에 일대일 대응이 있습니다. 서버에서 SomePage.aspx라는 페이지를 요청하는 경우 SomePage.aspx라는 디스크에 더 나은 페이지가 있습니다. SomePage.aspx 파일이 없으면 404 - 페이지를 찾을 수 없음 오류가 발생합니다.

반면 ASP.NET MVC 애플리케이션을 빌드할 때 브라우저의 주소 표시줄에 입력하는 URL과 애플리케이션에서 찾은 파일 사이에는 대응이 없습니다. ASP.NET MVC 애플리케이션에서 URL은 디스크의 페이지 대신 컨트롤러 작업에 해당합니다.

기존 ASP.NET 또는 ASP 애플리케이션에서 브라우저 요청은 페이지에 매핑됩니다. 반면 ASP.NET MVC 애플리케이션에서는 브라우저 요청이 컨트롤러 작업에 매핑됩니다. ASP.NET Web Forms 애플리케이션은 콘텐츠 중심입니다. 반면 ASP.NET MVC 애플리케이션은 애플리케이션 논리 중심입니다.

ASP.NET 라우팅 이해

브라우저 요청은 ASP.NET 라우팅이라는 ASP.NET 프레임워크의 기능을 통해 컨트롤러 작업에 매핑 됩니다. ASP.NET 라우팅은 ASP.NET MVC 프레임워크에서 들어오는 요청을 컨트롤러 작업으로 라우팅 하는 데 사용됩니다.

ASP.NET 라우팅은 경로 테이블을 사용하여 들어오는 요청을 처리합니다. 이 경로 테이블은 웹 애플리케이션이 처음 시작될 때 만들어집니다. 경로 테이블은 Global.asax 파일에서 설정됩니다. 기본 MVC Global.asax 파일은 목록 1에 포함되어 있습니다.

목록 1 - Global.asax

' Note: For instructions on enabling IIS6 or IIS7 classic mode, 
' visit https://go.microsoft.com/?LinkId=9394802

Public Class MvcApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

        ' MapRoute takes the following parameters, in order:
        ' (1) Route name
        ' (2) URL with parameters
        ' (3) Parameter defaults
        routes.MapRoute( _
            "Default", _
            "{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = ""} _
        )

    End Sub

    Sub Application_Start()
        RegisterRoutes(RouteTable.Routes)
    End Sub
End Class

ASP.NET 애플리케이션이 처음 시작되면 Application_Start() 메서드가 호출됩니다. 목록 1에서 이 메서드는 RegisterRoutes() 메서드를 호출하고 RegisterRoutes() 메서드는 기본 경로 테이블을 만듭니다.

기본 경로 테이블은 하나의 경로로 구성됩니다. 이 기본 경로는 들어오는 모든 요청을 세 개의 세그먼트로 나눕니다(URL 세그먼트는 슬래시 사이의 모든 항목임). 첫 번째 세그먼트는 컨트롤러 이름에 매핑되고, 두 번째 세그먼트는 작업 이름에 매핑되고, 최종 세그먼트는 ID라는 작업에 전달된 매개 변수에 매핑됩니다.

예를 들어 다음 URL을 가정해 봅니다.

/Product/Details/3

이 URL은 다음과 같은 세 가지 매개 변수로 구문 분석됩니다.

컨트롤러 = 제품

작업 = 세부 정보

ID = 3

Global.asax 파일에 정의된 기본 경로에는 세 매개 변수 모두에 대한 기본값이 포함됩니다. 기본 컨트롤러는 홈이고, 기본 작업은 인덱스이고, 기본 ID는 빈 문자열입니다. 이러한 기본값을 염두에 두고 다음 URL을 구문 분석하는 방법을 고려합니다.

/Employee

이 URL은 다음과 같은 세 가지 매개 변수로 구문 분석됩니다.

컨트롤러 = 직원

작업 = 인덱스

Id =

마지막으로 URL(예 http://localhost: )을 제공하지 않고 ASP.NET MVC 애플리케이션을 열면 URL은 다음과 같이 구문 분석됩니다.

컨트롤러 = 홈

작업 = 인덱스

Id =

요청은 HomeController 클래스의 Index() 작업으로 라우팅됩니다.

컨트롤러 이해

컨트롤러는 사용자가 MVC 애플리케이션과 상호 작용하는 방식을 제어합니다. 컨트롤러는 ASP.NET MVC 애플리케이션에 대한 흐름 제어 논리를 포함합니다. 컨트롤러는 사용자가 브라우저 요청을 할 때 사용자에게 다시 보낼 응답을 결정합니다.

컨트롤러는 단지 클래스(예: Visual Basic 또는 C# 클래스)입니다. 샘플 ASP.NET MVC 애플리케이션에는 Controllers 폴더에 있는 HomeController.vb라는 컨트롤러가 포함되어 있습니다. HomeController.vb 파일의 콘텐츠는 목록 2에서 재현됩니다.

목록 2 - HomeController.cs

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index()
        ViewData("Title") = "Home Page"
        ViewData("Message") = "Welcome to ASP.NET MVC!"

        Return View()
    End Function

    Function About()
        ViewData("Title") = "About Page"

        Return View()
    End Function
End Class

HomeController에는 Index() 및 About()라는 두 가지 메서드가 있습니다. 이러한 두 메서드는 컨트롤러에서 노출하는 두 작업에 해당합니다. URL /Home/Index는 HomeController.Index() 메서드를 호출하고 URL /Home/About은 HomeController.About() 메서드를 호출합니다.

컨트롤러의 모든 공용 메서드는 컨트롤러 작업으로 노출됩니다. 당신은 이것에 대해 조심해야합니다. 즉, 컨트롤러에 포함된 모든 공용 메서드는 브라우저에 올바른 URL을 입력하여 인터넷에 액세스할 수 있는 모든 사용자가 호출할 수 있습니다.

뷰 이해

HomeController 클래스인 Index() 및 About()에서 노출하는 두 컨트롤러 작업은 모두 보기를 반환합니다. 보기에는 브라우저로 전송되는 HTML 태그 및 콘텐츠가 포함됩니다. 보기는 ASP.NET MVC 애플리케이션으로 작업할 때 페이지와 동일합니다.

올바른 위치에 보기를 만들어야 합니다. HomeController.Index() 작업은 다음 경로에 있는 뷰를 반환합니다.

\Views\Home\Index.aspx

HomeController.About() 작업은 다음 경로에 있는 보기를 반환합니다.

\Views\Home\About.aspx

일반적으로 컨트롤러 작업에 대한 뷰를 반환하려면 컨트롤러와 동일한 이름의 Views 폴더에 하위 폴더를 만들어야 합니다. 하위 폴더 내에서 컨트롤러 작업과 동일한 이름의 .aspx 파일을 만들어야 합니다.

목록 3의 파일에는 About.aspx 보기가 포함되어 있습니다.

목록 3 - About.aspx

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>About</h2>
    <p>
        Put content here.
    </p>
</asp:Content>

목록 3의 첫 번째 줄을 무시하는 경우 보기의 나머지 대부분은 표준 HTML로 구성됩니다. 여기에 원하는 HTML을 입력하여 보기의 내용을 수정할 수 있습니다.

보기는 활성 서버 페이지 또는 ASP.NET Web Forms 페이지와 매우 유사합니다. 보기에는 HTML 콘텐츠 및 스크립트가 포함될 수 있습니다. 원하는 .NET 프로그래밍 언어(예: C# 또는 Visual Basic .NET)로 스크립트를 작성할 수 있습니다. 스크립트를 사용하여 데이터베이스 데이터와 같은 동적 콘텐츠를 표시합니다.

모델 이해

컨트롤러에 대해 논의했으며 보기에 대해 논의했습니다. 마지막으로 논의해야 할 항목은 모델입니다. MVC 모델이란?

MVC 모델에는 보기 또는 컨트롤러에 포함되지 않은 모든 애플리케이션 논리가 포함됩니다. 모델에는 모든 애플리케이션 비즈니스 논리, 유효성 검사 논리 및 데이터베이스 액세스 논리가 포함되어야 합니다. 예를 들어 Microsoft Entity Framework를 사용하여 데이터베이스에 액세스하는 경우 Models 폴더에 Entity Framework 클래스(.edmx 파일)를 만듭니다.

뷰에는 사용자 인터페이스 생성과 관련된 논리만 포함되어야 합니다. 컨트롤러는 올바른 보기를 반환하거나 사용자를 다른 작업(흐름 제어)으로 리디렉션하는 데 필요한 최소 논리만 포함해야 합니다. 다른 모든 항목은 모델에 포함되어야 합니다.

일반적으로, 지방 모델 및 스키니 컨트롤러에 대 한 노력 해야 합니다. 컨트롤러 메서드에는 몇 줄의 코드만 포함되어야 합니다. 컨트롤러 작업이 너무 뚱뚱해지면 Models 폴더의 새 클래스로 논리를 이동하는 것이 좋습니다.

요약

이 자습서에서는 ASP.NET MVC 웹 애플리케이션의 다양한 부분에 대한 개략적인 개요를 제공했습니다. ASP.NET 라우팅이 들어오는 브라우저 요청을 특정 컨트롤러 작업에 매핑하는 방법을 알아보았습니다. 컨트롤러가 뷰를 브라우저로 반환하는 방법을 오케스트레이션하는 방법을 알아보았습니다. 마지막으로 모델에 애플리케이션 비즈니스, 유효성 검사 및 데이터베이스 액세스 논리가 포함된 방법을 알아보았습니다.