슬라이드 1

Download Report

Transcript 슬라이드 1

ASP.NET MVC Framework
장현희
ASP/ASP.NET MVP
Senior Developer / MySpace Korea
www.bullog.net
MVC Pattern - Overview
• Web Presentation Pattern 중 하나
• Model, View, Controller 등의 컴포넌트로
구성
• Model: Entity 클래스를 이용한 비즈니스
로직을 수행
• View: 모델의 로직이 수행된 결과를 보여
주는 역할
• Controller: 모델과 뷰 사이의 중재자 역할
을 수행
ASP.NET vs. ASP.NET MVC
Classic ASP.NET
Request Model
Data Model
ASP.NET MVC
Postback
REST
Code-Behind
MVC
알고 계십니까?
예로부터 MVC 패턴에서 컨트롤러를
구현하는 두 가지 방법이 전해졌는데…
Page Controller
Front Controller
MVC Pattern – Page Controller
• Page Controller 패턴: 각각의 페이지를 처
리하는 개별적인 컨트롤러를 구현
– ASP.NET 웹 폼 모델에 적용
– 빠르고 간편하게 개발 가능
– 코드 재사용이 용이
– Tightly Coupled
– 기반 프레임워크에 대한 의존도 높음
MVC Pattern – Page Controller
HTTP Request
Controller
Model
Controller
Controller
View
View
View
MVC Pattern – Front Controller
• 모든 HTTP 요청을 처리하는 하나의 컨트
롤러를 구현
– ASP.NET MVC 프레임워크에 적용
– 모든 비즈니스 로직의 중앙 집중화
– 기반 프레임워크에 대한 의존도 낮음
– Loosely Coupled
– 컨트롤러의 복잡도 증가
– 요청에 대한 병목
MVC Pattern – Front Controller
HTTP Request
View
Model
Front
Controller
View
View
ASP.NET MVC 프레임워크의 특징
• HTTP 요청의 의미 변화
– 라우팅 엔진을 통해 SEO 및 REST에 적합한 형태
의 URL을 지원
– URL은 리소스에 대한 요청이 아니라 컨트롤러의
특정 액션에 대한 요청으로 의미 변화
• 포스트 백은 없다
– ASP.NET의 최대 단점이었던 단일 서버 폼,
ViewState 개념 삭제
• 페이지의 역할 변화
– 페이지와 사용자 정의 컨트롤은 뷰 템플릿으로 사
용
ASP.NET MVC 프레임워크의 특징
• TDD의 손쉬운 적용
– 현존하는 모든 .NET 프레임워크용 단위 테스
트 프레임워크 지원
– 컨트롤러의 액션 메서드 호출을 통해 ASP.NET
런타임을 통하지 않고도 손쉽게 애플리케이션
기능을 테스트할 수 있음
• ASP.NET과의 호환성
– 기존의 ASP.NET의 기능들을 모두 활용 가능
Front Controller 패턴 다시 보기
HTTP Request
Routing
Engine
Controller
Object
Model
View
Handler
Front
Controller
View
Command
View
URL Routing in ASP.NET MVC
• HTTP 요청을 분석하여 해당 요청을 처리
할 컨트롤러와 액션 메서드를 선택하는 중
요한 모듈
• Front Controller 패턴에서 핸들러의 역할
을 수행
• 지정된 페이지로의 Redirection을 수행하
는 URL Rewriting과는 다른 개념
• 모델, 뷰, 컨트롤러와 완전히 독립적으로
동작.
• ASP.NET에도 적용 예정
Routing Rule의 설정
• 기본적으로 Global.asax.cs 파일에서
Application.Start 이벤트에서 설정
• 키워드는 {keyword}와 같이 표기
• controller와 action 키워드는 반드시 필요
• controller와 action 이외의 키워드는 해당 액션
메서드의 매개 변수로 전달됨
• RouteCollection.Add 메서드나 MapRoute 확장
메서드를 사용
• 가장 먼저 등록된 라우팅 규칙부터 비교
• 가장 먼저 일치하는 규칙이 사용 됨.
Routing Rule의 설정
routes.Add(
new Route(
"{controller}/{action}/{id}",
new MvcRouteHandler()
){
Defaults = new {
controller = “Home”, action = "index"
}
}
);
routes.MapRoute(
"Default",
“{controller}/{action}",
new { controller = “Home", action = “Index" }
);
Routing Rule의 사용 예
Routing Patterns
{controller}/{action}
{controller}/{action}/{id}
Product/{action}{category}
Help/{action}/{language}{country}
Sample URLs
Home/Index
Home/Index/3 또는
Home/Index?id=3
Product/List/C1 또는
Product/List?category=C1
Help/MVC/ko-KR 또는
Help/MVC?language=ko&coun
try=KR
• 각 키워드에 할당된 값들은 RouteData 클
래스를 이용하여 접근할 수도 있음
Routing 규칙에서의 네임스페이스 사용
• 대형 프로젝트의 경우 MVC 애플리케이션
프로젝트에 모든 컨트롤러를 구현하기 어
려움
• 이를 위해 별도의 어셈블리에 구현된 컨트
롤러를 지정하기 위한 기능
• ControllerBuilder 클래스의
DefaultNamespaces 컬렉션에 컨트롤러
객체를 탐색할 네임스페이스를 지정
• 혹은 라우팅 규칙에 대해 개별적으로 지정
가능
Routing 규칙에서의 네임스페이스 사용
ControllerBuilder.Current.DefaultNamespaces.Add(
“MyWebApps.Weblog.Controllers”);}
var dataTokens = new RouteValueDictionary();
dataTokens.Add(“namespaces”, new HashSet<string>(
new string[] {
“MyWebApps.Weblog.Controllers”,
“YourApps.Blog.Controllers”
}));
routes.Add(
new Route(“{controller}/{action}/{id}”, new MvcRouteHandler()) {
Defaults = new RouteValueDictionary(
new { controller = “Home”, action = “index”, id = (string)null}
);
DataTokens = dataTokens
});
Routing Constraint
• 액션 메서드 실행에 대한 제약을 설정
• IRouteConstraint 인터페이스를 구현한 모
든 클래스는 라우팅 제약으로 사용 가능
• 현재 HttpMethodConstraint 클래스가 제
공되는 유일한 라우팅 제약
• HttpMethodConstraint 클래스를 이용하면
특정 패턴의 URL 요청에 사용할 HTTP 메
서드를 선택할 수 있음
HTTP 요청에 대한 제약 설정하기
routes.MapRoute(
"Default",
“{controller}/{action}",
new { controller = “Home", action = “Index" },
new { httpMethod = new HttpMethodConstraint(
“GET”, “POST”
)}
);
• 액션 메서드를 GET 또는 POST 방식으로 요청한 경우에
만 실행
• 제약에 위반되는 요청의 경우 HTTP 404 오류 반환
Model
• 데이터와 관련된 로직을 수행하여 데이터
를 조작하는 일련의 객체들
• Entity라고도 부르며 애플리케이션의 요구
사항에 따라 적절한 Entity 클래스들을 구
성할 필요가 있다.
• 최근에는 다양한 ORM (Object-Relational
Mapping) 도구들의 도움을 받을 수 있다.
– LINQ to SQL
– LINQ to Entity
– NHibernate
Model 컴포넌트 구현을 위한 방법들
DataSet
LINQ to SQL
3rd Party ORM
Custom Entity
• 가장 간단한 방법
• 요구사항의 변경에 능동적으로 대응 가능
• .NET Framework의 일부이며 사용이 편리
• 성능 및 튜닝 포인트에 대한 공방
• NHibernate, DataObjects.NET…
• 추가 학습이 필요
• 요구사항에 가장 잘 대응할 수 있는 방법
• 나머지 방법들에 비해 높은 개발 비용
Controller
• 인바운드 요청을 처리하는 MVC 패턴의 핵
심 컴포넌트
• ASP.NET MVC 프레임워크에서 컨트롤러는
요청 URL에 해당하는 액션 메서드를 통해
비즈니스 로직을 실행
• Model 컴포넌트와의 협업
• 실행 결과를 렌더링 할 적절한 뷰를 선택
하는 역할
Controller
• Controller 클래스를 상속하는 모든 클래스의
public 인스턴스 메서드를 액션 메서드로 사용
• 액션 메서드로 사용하고 싶지 않은 메서드에는
[NonAction] 특성 사용
public class Home {
public ActionResult Index() {
…
}
}
[NonAction]
public string SayHello() {
return “Hello, World!”;
}
Controller
• [AcceptVerbs] 특성을 통해 HTTP 요청 메서드의
종류에 따라 재정의된 액션 메서드를 선택적으
로 호출 가능
public ActionResult Index() {
// GET 방식으로 호출될 경우 실행될 코드
}
[AcceptVerbs(HttpVerbs.Post) {
// POST 방식으로 호출될 경우 실행될 코드
}
Controller 클래스의 동작 과정
• MvcRouteModule 클래스가 요청 URL을
분석
• MvcHandler 클래스를 이용하여 해당 요청
을 처리할 컨트롤러 객체를 생성하고
Execute 메서드를 호출
• Execute 메서드는 ControllerActionInvoker
클래스를 이용하여 컨트롤러의 액션 메서
드를 호출
• 액션 메서드의 리턴 값에 따라 적당한 동
작을 수행
Action Results
• 모든 액션 메서드는 ActionResult 클래스
를 상속하는 클래스를 리턴.
• 리턴 값이 없는 액션 메서드에 한해 void
리턴 타입 사용 가능
• ActionResult는 추상 클래스이며
Controller 클래스의 메서드에 따라 다양한
결과를 리턴할 수 있음
Action Results
• 액션 메서드는 ActionResult 클래스를 상속하
는 6개의 클래스 중 하나를 리턴
• 각각의 ActionResult 클래스는 Controller 클
래스의 메서드 호출에 의해 리턴 됨
• 액션 메서드가 null을 리턴하거나 리턴 타입
이 void인 경우에는 묵시적으로 EmptyResult
객체를 리턴
• Content 메서드: ContentResult 객체를 리턴.
지정된 문자열을 응답 스트림에 출력
• Json 메서드: JsonResult 객체를 리턴. 지정된
객체를 JSON 문자열로 변환하여 응답 스트림
에 출력
Action Results
• PartialView 메서드: 지정된 뷰를 현재 뷰에 렌더
링하는 메서드. PartialViewResult 객체를 리턴
• Redirect 메서드: 지정된 URL로 이동하는 메서드.
RedirectResult 객체를 리턴
• RedirectToAction 메서드:
RedirectToActionResult 객체를 리턴. 지정된 액
션 메서드를 호출
• RedirectToRoute 메서드:
RedirectToRouteResult 객체를 리턴. 지정된 경로
로 라우팅 됨
• View 메서드: 지정된 뷰를 렌더링. 뷰를 렌더링
하는 유일한 메서드
컨트롤러에서 뷰로의 데이터 전달
• 컨트롤러와 뷰 사이의 데이터 교환은
ViewDataDictionary 클래스를 통해 이루어
짐
• ViewDataDictionary 클래스는 Controller
및 ViewPage 클래스에 ViewData 속성을
통해 접근 가능
• Dictionary<string, object> 타입을 상속하
므로 모든 종류의 객체를 담을 수 있음
컨트롤러에서 뷰로의 데이터 전달
public class Home {
public ActionResult Index() {
ViewData[“TotalItems”] = GetTotalItems();
ViewData[“DataContainer”] = GetLists();
}
}
protected override void OnLoad(EventArgs e) {
this.repeater1.DataSource = ViewData[“DataContainer”];
this.totalItemsLabel.Text = ViewData[“TotalItems”].ToString();
}
컨트롤러에서 뷰로의 데이터 전달
• Dictionary 기반이므로 모든 타입의 데이
터를 컨트롤러에서 뷰로 전달 가능
• 그러나 Object 타입이므로 형 변환 및
Boxing/Unboxing으로 인한 성능 문제 발
생 가능
• ViewPage<T> 클래스를 이용하여 강력한
타입의 뷰 데이터 교환 가능
View
• Model과 Controller의 비즈니스 로직 실행
결과를 보여주기 위한 컴포넌트
• ASP.NET MVC 프레임워크에서는 ASPX및
ASCX 파일을 뷰 템플릿으로 사용
• 모든 ASPX 페이지에 대한 직접적인 요청
은 HTTP Forbidden 핸들러가 처리
• 페이지 라이프 사이클 이벤트들은 여전히
사용 가능
• 서버 폼이 필요 없는 서버 컨트롤들 역시
여전히 사용 가능
View
• Controller.View 메서드에 지정된 뷰의 이
름과 동일한 이름의 ASPX 혹은 ASCX 파일
을 생성해야 함
• 뷰가 렌더링 될 때 뷰 파일의 탐색 순서
– ~/Views/컨트롤러/뷰.aspx
– ~/Views/컨트롤러/뷰.ascx
– ~/Shared/뷰.aspx
– ~/Shared/뷰.ascx
ViewPage 클래스
• 모든 뷰 페이지들은 ViewPage 클래스 혹은
ViewPage<T> 클래스를 상속해야 함
• ViewPage<T> 클래스를 이용할 경우 보다 강
력한 타입을 가진 뷰 데이터를 사용할 수 있
음
• AjaxHelper, HtmlHelper 등의 Helper 클래스
들에 대한 액세스를 제공
• ViewContext 속성을 통해 현재 실행 중인 요
청 및 컨트롤러 액션에 대한 액세스 가능
• 뷰 파일이 ASCX인 경우에는
ViewUserControl 혹은 ViewUserControl<T>
클래스를 사용
HtmlHelper 클래스
• 뷰 페이지에서 UI 요소들을 생성할 때 활용할
수 있는 다양한 메서드를 제공하는 Helper 클
래스
• 실제로는 대부분의 메서드들이 확장 메서드
로 구현되어 있음
–
–
–
–
–
–
–
FormExtensions 클래스
InputExtensions 클래스
LinkExtensions 클래스
RenderPartialExtensions 클래스
SelectExtensions 클래스
TextAreaExtensions 클래스
ValidationExtensions 클래스
HtmlHelper 클래스
• FormExtensions 클래스
– 페이지에 <FORM> 태그를 렌더링 하기 위한
BeginForm / EndForm 메서드 쌍을 제공
– 다음의 두 가지 방식으로 사용 가능
<% using (Html.BeginForm()) { %>
<% = Html.TextBox(“textField1”) %>
<% = Html.SubmitButton(“button1”) %>
<% } %>
<% Html.BeginForm(); %>
<% = Html.TextBox(“textField1”) %>
<% = Html.SubmitButton(“button1”) %>
<% Html.EndForm(); %>
HtmlHelper 클래스
• InputExtensions 클래스
– 입력용 요소를 렌더링하기 위한 메서드들을 제공하는
클래스
– CheckBox 메서드
– Hidden 메서드
– Password 메서드
– RadioButton 메서드
– TextBox 메서드
HtmlHelper 클래스
• LinkExtensions 클래스
– 하이퍼링크를 렌더링하기 위한 메서드들을 제공하는
클래스
– ActionLink 메서드: 컨트롤러의 액션 메서드를 호출하
는 링크를 생성
– GenerateLink 메서드: ActionLink 메서드와 유사한 역
할을 수행. ActionLink 메서드는 내부적으로
GenerateLink 메서드를 사용
– RouteLink 메서드: 지정된 라우팅 규칙에 해당하는
URL을 생성하는 메서드. 역시 내부적으로
GenerateLink 메서드를 사용
HtmlHelper 클래스
• RenderPartialExtensions 클래스
– RenderPartial 메서드: 지정된 뷰를 현재 뷰에 렌더링
하는 메서드
• SelectExtensions 클래스
– DropDownList 메서드: 드롭다운 목록을 렌더링하는
메서드
– ListBox 메서드: 리스트 상자를 렌더링하는 메서드
• TextAreaExtensions 클래스
– TextArea 메서드: <TEXTAREA> 태그를 렌더링하는 메
서드
HtmlHelper 클래스
• ValidationExtensions 클래스
– ValiationMessage 메서드: 유효성 검사 실패 시 사용
자에게 보여줄 메시지를 렌더링하는 메서드
– ValidationSummary 메서드: 페이지에서 발생한 모든
유효성 검사 실패 오류 메시지를 한 곳에 모아 렌더링
하는 메서드
AjaxHelper 클래스
• AJAX 요청을 지원하기 위한 클래스
– ActionLink 메서드
– BeginForm 메서드
– RouteLink 메서드
• 제공되는 메서드의 기능은 HtmlHelper 클래스의
메서드와 동일하지만 요청을 AJAX로 처리
• Scripts 폴더의 MicrosoftAjax.js와
MicrosoftMvcAjax.js 두 개의 스크립트를 페이지
에 추가해 주어야 함
ActionFilter
• 컨트롤러의 액션 메서드의 실행 전 혹은 후에 실
행될 코드를 정의하기 위한 클래스
• IActionFilter 인터페이스 구현을 통해 구현하며
다음과 같은 이벤트들이 제공됨
–
–
–
–
OnActionExecuting
OnResultExecuting
OnResultExecuted
OnActionExecuted
• ActionFilterAttribute 기반 클래스를 통해
특성 형태로 액션 메서드에 적용
• 기본 제공되는 ActionFilter는 아직 없음
AuthorizeFilter
• 액션 메서드 실행 전 사용자를 인증하기 위한 인
증 필터가 제공됨.
• IAuthorizationFilter 인터페이스를 통해 구현
• ASP.NET MVC 프로젝트를 생성하면 기본적으로
생성되는 AccountController를 참고
• [Authorize] 특성을 컨트롤러의 액션 메서드 단
위로 지정
• 사용자의 고유 ID 혹은 역할 그룹을 통해 액션
메서드의 호출을 제어할 수 있음
ExceptionFilter
• 컨트롤러에서 예외 발생 시 이를 처리할 오류 페
이지의 손쉬운 제작을 위해 예외 필터가 제공됨
• IExceptionFilter 인터페이스를 구현하는 모든 클
래스는 예외 필터로 동작
• [HandleError] 특성 클래스를 이용하여 컨트롤러
클래스 혹은 액션 메서드 단위로 예외 처리 여부
를 지정할 수 있음
• Web.config의 <customErrors> 섹션이 활성화
되어 있어야 동작
References
• ASP.NET MVC Official Website
– http://www.asp.net/mvc
– http://www.codeplex.com/aspnet
• Scott Guthrie’s Blog
– http://weblogs.asp.net/scottgu
• .NET Slackers – An architectural overview
of the ASP.NET MVC Framework
– http://dotnetslackers.com/articles/aspnet/An
ArchitecturalViewOfTheASPNETMVCFramewo
rk.aspx