디자인 패턴 – 초보자를 위한 MVC 패턴 샘플

게시 됨: 2016-04-15

MVC Pattern이란 무엇이며 ASP.NET MVC Framework는 어떻게 작동하는지 설명합니다. 또한 ASP.NET MVC 페이지 수명 주기 및 ASP.NET MVC 기능 버전에 대해 설명합니다.

샘플은 초보자가 ASP.NET MVC를 쉽게 이해하고 능숙해질 수 있도록 현명한 단계를 제공했습니다.

우리 모두는 많은 디자인 패턴을 알고 있고 이를 응용 프로그램에서 비즈니스 구성 요소 및 서비스를 구현하는 데 사용하지만 여전히 응용 프로그램과 관련된 문제/도전에 직면할 것입니다. 또한 비즈니스 요구 사항과 우선 순위는 날마다 변할 것입니다. 우리가 직면하고 있는 여러 문제, 결함 및 과제를 면밀히 관찰하면 UI 및 프레젠테이션 계층에 있습니다. 일부 결함은 비즈니스 논리 및 비즈니스 규칙과 관련이 있지만 UI 및 프레젠테이션 계층에서 비즈니스 논리를 긴밀하게 통합할 수 있으므로 UI ​​및 프레젠테이션 계층에서 이를 수정해야 할 수도 있습니다. 그 이유는 애플리케이션에서 올바른 디자인 패턴을 구현하는 데 집중하지 않았기 때문입니다. 단계별로 살펴보고 응용 프로그램에서 프레젠테이션 패턴을 구현하고 사용하는 방법을 이해하겠습니다.

문제 설명:
  1. 이미 응용 프로그램에서 다른 패턴을 사용하고 있지만 여전히 응용 프로그램을 유지 관리하는 것은 어렵습니다.
  2. VS Test, NUnit, MBUnit 등을 사용하여 비즈니스 로직 레이어를 테스트하지만 프레젠테이션 레이어와 관련된 비즈니스 로직으로 응용 프로그램에 여전히 몇 가지 결함이 있습니다.
  3. 응용 프로그램에서 프레젠테이션 계층, 비즈니스 논리 계층, 데이터 액세스 계층을 사용했지만 다른 모듈이나 다른 사용 사례를 사용하거나 호출하기 위해 프레젠테이션 계층에 중복 코드를 작성해야 하는 경우가 있습니다.
  4. 통합 모듈을 일부 변경하면 통합 결함이 주입됩니다.
  5. 결함 수정 및 개선은 프레젠테이션 계층 논리 및 통합 종속성을 분석하는 데 더 많은 시간이 걸리고 새로운 결함을 발생시킵니다.
  6. UI가 복잡하기 때문에 ASP.NET MVC를 선택할 수 없습니다.
문제의 근본 원인:

프레젠테이션 레이어에서

  1. 페이지 또는 양식에는 응용 프로그램 도메인 데이터를 표시하는 컨트롤이 포함되어 있습니다. 사용자는 데이터를 수정하고 변경 사항을 제출할 수 있습니다. 페이지는 도메인 데이터를 검색하고, 사용자 이벤트를 처리하고, 이벤트에 대한 응답으로 페이지의 다른 컨트롤을 변경하고, 변경된 도메인 데이터를 제출합니다. 웹 페이지에 이러한 기능을 수행하는 코드 포함 또한 동일한 동작을 요구하는 웹 페이지 간에 코드를 공유하기 어렵습니다. 클래스가 복잡하고 유지 관리하기 어렵고 테스트하기 어렵습니다.
  2. UI Layer, UI Logic, Presentation Logic, Business Logic은 밀접하게 결합되어 있습니다.
  3. 프레젠테이션 계층은 모듈 또는 사용 사례 통합을 담당합니다.
해결책:
  1. 최고의 Presentation Layer Pattern을 선택하여 UI Layer, UI Logic 및 Presentation Logic과 Business Logic을 별도의 레이어로 분리하여 코드를 더 쉽게 이해하고 유지 관리할 수 있도록 합니다.
  2. 모듈 또는 사용 사례를 개발하는 동안 느슨한 결합을 활성화합니다.
  3. 자동화로 테스트할 수 있는 코드를 극대화합니다. (보기는 테스트하기 어렵습니다.)
  4. 동일한 동작이 필요한 페이지 간에 코드를 공유합니다.
  5. 시각적 표시 및 이벤트 처리 동작에 대한 책임을 각각 보기와 발표자 또는 컨트롤러 또는 ViewModel이라는 이름의 다른 클래스로 분리합니다.
프레젠테이션 패턴 사용의 이점:
  1. 모듈화
  2. 테스트 중심 접근 방식 – 자동화로 테스트할 수 있는 코드 최대화
  3. 우려의 분리
  4. 페이지와 양식 간의 코드 공유
  5. 유지보수 용이

사용 가능한 프레젠테이션 레이어 패턴은 무엇입니까?

MVC(모델 보기 컨트롤러)

MVP(모델 보기 발표자) 또는 (모델 수동 보기, 감독자 컨트롤러)

MVVM(모델 보기 ViewModel)

MVC 대 MVP 대 MVVM:
  1. Model과 View는 위의 3가지 패턴 모두에서 동일하게 나타납니까?

  2. 위의 3가지 패턴에서 Controller, Presenter, ViewModel의 용도는 모두 동일한가요?

  3. Model, View와 Controller, Presenter, ViewModel의 통신과 흐름은 동일합니까?

    아니오 , 이것이 이 3가지 패턴이 존재하는 이유입니다.

  4. 이러한 패턴이 PL(Presentation Layer), BLL(Business Logic Layer) 및 DAL(Data Access Layer)을 대체합니까?

    아니요 , 이러한 패턴은 UI 및 UI 로직을 Presentation Logic에서 분리하기 위한 것이며 느슨한 결합을 가능하게 합니다.

최고의 프레젠테이션 레이어 패턴 선택:

MVP

  1. 데이터 컨텍스트를 통한 바인딩은 불가능합니다.
  2. 복잡한 UI 디자인
  3. Windows Forms, ASP.NET Web Forms 및 Sharepoint 응용 프로그램에 가장 적합

MVC

  1. 간단한 UI를 사용하는 ASP.NET에 가장 적합
  2. 연결 해제된 모델(다른 모든 레이어와 분리된 보기)

참고: 여기서는 MVC VM(MVC3의 MVC ViewModel) 및 종속성 주입이 포함된 ASP.NET MVVM에 중점을 두지 않습니다.

MVVM

  1. 데이터 컨텍스트를 통한 바인딩 가능
  2. 연결된 모델
  3. WPF 및 Silverlight 애플리케이션에 가장 적합
ASP.NET Web Forms 대 ASP.NET MVC:

ASP.NET 웹 양식

  1. 라드
  2. 더 쉬운 개발
  3. 풍부한 제어 생태계
  4. Windows Forms 개발에 대한 개발 접근 방식에 익숙함
  5. ViewState 및 포스트백 지원 없음

ASP.NET MVC

  1. SoC(Clean Separation of Interest)
  2. 전체 마크업 제어
  3. TDD(테스트 주도 개발) 활성화
  4. REST를 활성화하고 쉽게 만듭니다.
  5. 보다 쉬운 클라이언트 측 통합(Javascript)
  6. 멀티뷰 엔진(정말 멋지네요!)
  7. ViewState 및 포스트백 지원 없음
  8. 확장 가능 및 WEB 2.0 사용 가능

모델, 뷰 및 컨트롤러

  • 모델 : 모델 개체는 응용 프로그램의 데이터 도메인에 대한 논리를 구현하는 응용 프로그램의 일부입니다. 종종 모델 객체는 데이터베이스에서 모델 상태를 검색하고 저장합니다. 예를 들어, Product 개체는 데이터베이스에서 정보를 검색하고 이에 대해 작업한 다음 업데이트된 정보를 SQL Server의 Products 테이블에 다시 쓸 수 있습니다.
  • 보기 : 보기는 애플리케이션의 UI(사용자 인터페이스)를 표시하는 구성 요소입니다. 일반적으로 이 UI는 모델 데이터에서 생성됩니다. 제품 개체의 현재 상태를 기반으로 텍스트 상자, 드롭다운 목록 및 확인란을 표시하는 제품 테이블의 편집 보기를 예로 들 수 있습니다.
  • 컨트롤러 : 컨트롤러는 사용자 상호 작용을 처리하고 모델과 함께 작업하며 궁극적으로 UI를 표시하는 렌더링할 보기를 선택하는 구성 요소입니다. MVC 응용 프로그램에서 보기는 정보만 표시합니다. 컨트롤러는 사용자 입력 및 상호 작용을 처리하고 응답합니다. 예를 들어 컨트롤러는 쿼리 문자열 값을 처리하고 이 값을 모델에 전달하고 모델은 해당 값을 사용하여 데이터베이스를 쿼리합니다.
ASP.NET MVC 고급 페이지 수명 주기?

ASP.NET MVC High Level Page Life Cycle

ASP.NET MVC 저수준 페이지 수명 주기?

ASP.NET MVC Low Level Page Life Cycle

MVC2.0의 새로운 기능

1. 템플릿 도우미:

Templated Helpers는 편집 및 표시를 위한 HTML 요소를 데이터 유형과 자동으로 연결하는 데 도움이 됩니다.

예를 들어 System.DateTime 유형의 데이터가 보기에 표시되면 날짜 선택기 UI 요소가 자동으로 렌더링될 수 있습니다.

이는 ASP.NET Dynamic Data에서 필드 템플릿이 작동하는 방식과 유사합니다.

2. 지역:

영역 사용 큰 웹 응용 프로그램의 복잡성을 관리하기 위해 큰 프로젝트를 여러 개의 작은 섹션으로 구성할 수 있습니다.

각 섹션("영역")은 일반적으로 대규모 웹 사이트의 별도 섹션을 나타내며 관련 컨트롤러 및 보기 집합을 그룹화하는 데 사용됩니다.

[xhtml]
지역
관리자
컨트롤러
모델
견해
이니알라 클레임
컨트롤러
모델
견해
[/xhtml]

3. 비동기 컨트롤러 지원:

ASP.NET MVC2를 사용하면 컨트롤러가 요청을 비동기적으로 처리할 수 있습니다.

이는 네트워크 요청과 같은 차단 작업을 자주 호출하는 서버가 대신 비차단 상대를 호출하도록 허용하여 성능을 향상시킬 수 있습니다.

4. Action-Method 매개변수에서 DefaultValueAttribute 지원:

System.ComponentModel.DefaultValueAttribute 클래스를 사용하면 인수 매개 변수에 대해 작업 메서드에 대한 기본값을 제공할 수 있습니다.

예를 들어 다음 기본 경로가 정의되어 있다고 가정합니다.

[암호]
{컨트롤러}/{액션}/{id}
[/암호]

또한 다음 컨트롤러 및 작업 메서드가 정의되어 있다고 가정합니다.

[암호]
공개 클래스 ArticleController
{
공개 ActionResult 보기(int id, [DefaultValue(1)]int 페이지)
{
}
}
[/암호]

다음 요청 URL은 이전 예에서 정의된 View 작업 메서드를 호출합니다.

  • /기사/보기/123
  • /Article/View/123?page=1 (이전 요청과 사실상 동일)
  • /Article/View/123?page=2
5. 모델 바인더와 바이너리 데이터 바인딩 지원:

이진 값을 base-64로 인코딩된 문자열로 인코딩하는 Html.Hidden 도우미의 두 가지 새로운 오버로드가 있습니다.

[암호]
public static string Hidden(이 HtmlHelper htmlHelper, 문자열 이름, 바이너리 값);
public static string Hidden(이 HtmlHelper htmlHelper, 문자열 이름, byte[] 값);
[/암호]

6. DataAnnotations 속성 지원:

입력 유효성 검사를 제공하기 위해 모델에 바인딩할 때 RangeAttribute , RequiredAttribute , StringLengthAttributeRegexAttribute 유효성 검사 특성( System.ComponentModel.DataAnnotations 네임스페이스에 정의됨)을 사용합니다.

[암호]
System.ComponentModel.DataAnnotations 사용;
네임스페이스 MvcTmpHlprs
{
[메타데이터 유형(typeof(ProductMD))]
공개 부분 클래스 제품
{
공개 클래스 ProductMD
{
공개 개체 SellStartDate { 가져오기; 세트; }
[UIHint("rbDate")]
공개 개체 SellEndDate { 가져오기; 세트; }
[데이터 유형(데이터 유형.날짜)]
공개 개체 DiscontinuedDate { get; 세트; }
[비계열(거짓)]
공개 개체 ModifiedDate { 가져오기; 세트; }
[비계열(거짓)]
공개 객체 rowguid { get; 세트; }
[비계열(거짓)]
공개 개체 ThumbnailPhotoFileName { 가져오기; 세트; }
}
}
}
[/암호]

7. 모델 검증자 제공자:

모델 유효성 검사 공급자 클래스는 모델에 대한 유효성 검사 논리를 제공하는 추상화를 나타냅니다.

ASP.NET MVC에는 System.ComponentModel.DataAnnotations 네임스페이스에 포함된 유효성 검사 특성을 기반으로 하는 기본 공급자가 포함되어 있습니다.

8. 클라이언트 측 검증:

모델 유효성 검사기 공급자 클래스는 클라이언트 측 유효성 검사 라이브러리에서 사용할 수 있는 JSON 직렬 데이터 형식으로 유효성 검사 메타데이터를 브라우저에 노출합니다.

ASP.NET MVC 2에는 앞서 언급한 DataAnnotations 네임스페이스 유효성 검사 특성을 지원하는 클라이언트 유효성 검사 라이브러리 및 어댑터가 포함되어 있습니다.

9. 새로운 RequireHttpsAttribute 작업 필터:

ASP.NET MVC 2에는 작업 메서드 및 컨트롤러에 적용할 수 있는 새로운 RequireHttpsAttribute 클래스가 포함되어 있습니다.

기본적으로 필터는 비 SSL(HTTP) 요청을 SSL 사용(HTTPS)에 해당하는 요청으로 리디렉션합니다.

10. HTTP 메서드 동사 재정의:

REST 아키텍처 스타일을 사용하여 웹 사이트를 구축할 때 HTTP 동사는 리소스에 대해 수행할 작업을 결정하는 데 사용됩니다.

REST를 사용하려면 애플리케이션이 GET , PUT , POSTDELETE 를 포함하여 일반적인 HTTP 동사의 전체 범위를 지원해야 합니다.

ASP.NET MVC 2에는 작업 메서드에 적용할 수 있고 간결한 구문이 특징인 새로운 특성이 포함되어 있습니다.

이러한 특성을 사용하면 ASP.NET MVC에서 HTTP 동사를 기반으로 작업 메서드를 선택할 수 있습니다.

예를 들어 POST 요청은 첫 번째 작업 메서드를 호출하고 PUT 요청은 두 번째 작업 메서드를 호출합니다.

[암호]
[Http포스트]
공개 ActionResult 편집(int id)

[HttpPut]
public ActionResult 편집(int id, 태그 태그)
[/암호]

이전 버전의 ASP.NET MVC에서는 다음 예제와 같이 이러한 작업 메서드에 더 자세한 구문이 필요했습니다.

[암호]
[AcceptVerbs(HttpVerbs.Post)]
공개 ActionResult 편집(int id)

[AcceptVerbs(HttpVerbs.Put)]
public ActionResult 편집(int id, 태그 태그)
[/암호]

브라우저는 GETPOST HTTP 동사만 지원하기 때문에 다른 동사가 필요한 작업에 게시할 수 없습니다. 따라서 모든 RESTful 요청을 기본적으로 지원하는 것은 불가능합니다.

그러나 POST 작업 중 RESTful 요청을 지원하기 위해 ASP.NET MVC 2에는 새로운 HttpMethodOverride HTML 도우미 메서드가 도입되었습니다.

이 메서드는 양식이 모든 HTTP 메서드를 효과적으로 에뮬레이트하도록 하는 숨겨진 입력 요소를 렌더링합니다.

예를 들어 HttpMethodOverride HTML 도우미 메서드를 사용하여 양식 제출이 PUT 또는 DELETE 요청으로 나타나도록 할 수 있습니다.

HttpMethodOverride 의 동작은 다음 특성에 영향을 줍니다.

  • HttpPostAttribute
  • HttpPutAttribute
  • HttpGetAttribute
  • HttpDeleteAttribute
  • AcceptVerbsAttribute
11. 템플릿 헬퍼를 위한 새로운 HiddenInputAttribute 클래스:

새로운 HiddenInputAttribute 속성을 모델 속성에 적용하여 편집기 템플릿에 모델을 표시할 때 숨겨진 입력 요소를 렌더링해야 하는지 여부를 나타낼 수 있습니다(속성은 HiddenInput 의 암시적 UIHint 값을 설정합니다).

속성의 DisplayValue 속성을 사용하면 값이 편집기 및 표시 모드에 표시되는지 여부를 지정할 수 있습니다.

DisplayValue 가 false로 설정되면 일반적으로 필드를 둘러싸는 HTML 마크업을 포함하여 아무 것도 표시되지 않습니다.

DisplayValue 의 기본값은 true입니다.

다음 시나리오에서 HiddenInputAttribute 특성을 사용할 수 있습니다.

  • 보기에서 사용자가 개체의 ID를 편집할 수 있고 값을 표시하고 컨트롤러에 다시 전달할 수 있도록 이전 ID가 포함된 숨겨진 입력 요소를 제공해야 합니다.
  • 보기에서 사용자가 타임스탬프 속성과 같이 표시해서는 안 되는 이진 속성을 편집할 수 있는 경우.

이 경우 값과 주변 HTML 마크업(예: 레이블 및 값)이 표시되지 않습니다.

예:

[암호]
공개 클래스 ProductViewModel
{
[HiddenInput] // [HiddenInput(DisplayValue=true)]와 동일
공개 정수 ID { 가져오기; 세트; }

공개 문자열 이름 { get; 세트; }

[숨겨진 입력(디스플레이 값=거짓)]
공개 바이트[] 타임스탬프 { get; 세트; }
}
[/암호]

12. Html.ValidationSummary 도우미 메서드는 모델 수준 오류를 표시할 수 있습니다.

항상 모든 유효성 검사 오류를 표시하는 대신 Html.ValidationSummary 도우미 메서드에 모델 수준 오류만 표시하는 새로운 옵션이 있습니다.

이를 통해 검증 요약에 모델 수준 오류를 표시하고 각 필드 옆에 필드별 오류를 표시할 수 있습니다.

13. Visual Studio의 T4 템플릿은 .NET Framework의 대상 버전에 특정한 코드를 생성합니다.

응용 프로그램에서 사용하는 .NET Framework 버전을 지정하는 ASP.NET MVC T4 호스트의 T4 파일에 새 속성을 사용할 수 있습니다.

이를 통해 T4 템플릿은 .NET Framework 버전과 관련된 코드와 마크업을 생성할 수 있습니다.

Visual Studio 2008에서 값은 항상 .NET 3.5입니다. Visual Studio 2010에서 값은 .NET 3.5 또는 .NET4입니다.

14. API 개선:

Controller 클래스에 보호된 가상 CreateActionInvoker 메서드를 추가했습니다.

이 메서드는 Controller의 ActionInvoker 속성에 의해 호출되며 호출자가 아직 설정되지 않은 경우 호출자의 지연 인스턴스화를 허용합니다.