그런데 iNamingContainer 인터페이스 를 구현하는 녀석들은 name 속성이 고유하게 생성이 되서 Group 으로 묶이지 않는 것이었습니다.
asp.net RadioButton 서버컨트롤이 가지고 있는 GroupName 이라는 속성을 주더라도 소용이 없는 거죠... ㅋㅋ
현재 WCF REST Starter Kit Preview 2 을 이용해서 Rest Service 를 제작하여 사용하고 있다.
그런데 문제가 발생했다.
기존에 개발하던 Laptop에서는 잘 작동하던 것이
새로운 Laptop에서는 아래와 같은 씨뻘건 에러를 내뱉으며 작동을 거부하는 것이 아닌가? ㅡㅡ'
어리석게도 단순히 파일 확장자만을 보고 MIME Type 이 문제일 것이라는 생각에만 집중을 하고 문제를 해결하기위해 두 컴을 비교하기 시작했고, 찾다찾다 안되어 구글링을 시작했다.
.svc 파일 형식이 aspnet_isapi 에 매핑되어 있어야 한다는 결론을 얻었다.
그래서 살펴보니 기존 Laptop 에는 등록되어 있는 svc-Integrated
svc-ISAPI-2.0 항목들이 새로운 Laptop 에는 등록되지 않은 것이 아닌가?
훔...
위 항목들의 등록과정은 다음과 같다.
IIS 단에서 등록을 해도 되겠지만 본인은 Default Web Site (기본 웹 사이트) 에서 진행하기로 하겠다.
위와 같이 "처리기 맵핑"을 클릭한다.
그리고 "관리되는 처리기 추가..." 를 클릭하고
요청경로 : *.svc 형식 : System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
이름 : svc-Integrated
을 입력하고 "확인" 을 클릭한다.
다음은 "스크립트 매핑 추가..." 를 클릭하고
요청경로 : *.svc
실행파일 : %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
이름 : svc-ISAPI-2.0
을 입력하고 "확인" 을 클릭한다.
그리고 잘 등록이 되었는지 확인한다.
그러면 Browser 로 가서 F5 를 눌러 화면을 Refresh 해서 확인해 본다.
또 이렇게 나의 허접함이 드러났다. ㅡㅡ'
하지만, 아직도 전 Laptop 과 비교해서 새 Laptop 에는 무엇을 설치를 하지 않아
녀석들이 등록되지 않았는지 알수가 없다.
지난번까지는 ASP.NET MVC2 Application 구성에 대해서 간단하게 살펴보았습니다.
그리고 MVC Application 을 생성했을때 기본적으로 만들어지는 파일들로 Build 까지 해 보았습니다.
이번 부터는 본격적으로 Application 을 만들어 나가려고 하는데요.
지난 아티클에서 만든 기본적인 Web Application 을 바탕으로 이어 나가려고 합니다.
고객들의 List 를 뿌려보고요. 고객 정보를 조회하고 고객의 주소를 생성, 수정, 삭제하는 코드를 작성해 보도록 하겠습니다.
다음 세 개의 Controller 를 작성할 것입니다. 고객 리스트, 고객정보를 다루는 Controller, 주소를 생성, 수정, 삭제하는 Address Controller 와 마지막으로 Application 의 환영 Page View를 다루는 Home Controller 입니다.
AdventureWorks Entity Data Model 을 추가하도록 하겠습니다.
Models 폴더를 오른쪽 클릭해서 Entity Data Model 을 생성합니다.
파일명은 AdventureWorks.edmx 입니다.
선택을 하게되면 Entity Data Model Wizard 가 열립니다.
"Generate from database" 항목을 선택합니다.
Connection 정보가 없군요.
그럼 생성을 해 줘야겠죠. "New Connection..." 버튼을 클릭해 줍니다.
SQL Server 를 선택해 주고요. "Continue" 버튼을 클릭합니다.
서버를 선택할 수 있는 창이 뜹니다.
서버를 선택하고 Database 를 선택한 후 연결상태를 테스트 합니다.
그리고 "OK" 버튼을 꾹 눌러주면...
선택한 사항에 대한 내용이 채워져 있습니다.
Connection String 에 대해서는 한번 살펴보셔도 좋을 듯 합니다.
Wizard 를 사용해서 뿐만이 아니라 직접 코딩할때도 쓸수 있을 테니 말이죠.
그리고 Checkbox 의 내용을 보면 Textbox 에 적혀진 이름으로 Web.config 파일에 ConnectionString 정보를 저장하겠느냐 라는 옵션을 달아 놨습니다.
Web.config 파일을 확인해 보셔도 좋을 듯 합니다.
Database 를 선택했으니 사용하려는 Table 을 선택해야겠지요?
과정을 모두 마치게 되면 아래와 같이 Entity Model 이 생성됩니다.
이 파일을 직접 별도의 Text Editor 로 열어보십시요. Address, CustomerAddress, Customer Class 가 만들어 진것을 확인 하실수 있습니다.
이번엔 AdventureWorksRepository 라는 Repository Class 를 생성할 텐데요... 이 Repository 라는 녀석은 방금 생성한 Model 의 Entity 들을 검색하기위한 Mehtod 를 노출하는 역할을 합니다.
ASP.NET MVC Framework 에서는 Controller Class와 Action 에 URL을 연결하기 위해서 ASP.NET Routing 을 사용합니다. ASP.NET Routing 은 여러분이 먼저 정의해 놓은 패턴에 따라 URL 내의 parameter 를 파싱합니다. 그리고 자동적으로 parameter argument 로 Controller Action 에 변수로 전달합니다. 이 과정에서 Web site 내의 특정파일을 연결할 필요는 없습니다.
기본적으로 ASP.NET MVC Project 는 미리 설정된 URL Routing Rule Set 을 가집니다.
새로운 ASP.NET MVC project template 에 의해서 생성되는 Global.asax 의 ASP.NET Application Class 내에 선언된 기본적인 이름 기반(name-based) URL mapping 규칙 set 을 사용하여 개발을 시작할 수 있습니다.
기본적으로 [Controller]/[Action]/[id] 의 패턴을 가지고 있습니다.
우리가 만든 Web Site 를 호출해 보겠습니다. 50000번 포트를 사용하고 있었죠? http://localhost:50000 를 날립니다.
안뜬다면... ASP.NET Development Web Server 가 호출되어있나 확인하시고...
아래와 같이 뜹니다.
우리가 Web Server 에 http://localhost:50000 라는 Request 를 날리면 ASP.NET Routing Engin 은 이 Request 를 가로 채서 기본적으로 등록된 [Controller]/[Action]/[id] 패턴의 Route 를 적용할 것입니다.
그런데 URL 에는 Pattern 에 적용할 내용이 포함되어 있지 않죠?
그럼 Routing Engin은 기본 Controller 와 기본 Action 으로 instance를 생성합니다.
기본 값들은 어떻게 알 수 있냐고요?
View 는 MVC application 에서 View 는 application 의 User interface 를 표시하기위한 응답가능한 Component 로 presentation logic 을 은닉화하기 위한 용도로만 존재합니다. 그래서 View 는 어떤 application logic 이나 데이터 검색 코드는 포함하지 않아야 합니다. View 는 Controller 가 제공하는 MVC view와 관련된 data object인 View Data Class를 이용해서 적합한 UI 를 만듭니다.
View 는 .aspx, ascx 와 .master 뿐만아니라 View 를 rendering 하는데 관련된 다른 파일들을 사용합니다. 그리고 Views 폴더는 각 Controller 용 View 폴더를 포함하고 있으며 Controller 의 접두어를 사용합니다.
아래와 같이 말이죠...
Views Folder 내에 AccountController, HomeCotroller 들에 해당하는 Account, Home 폴더가 있음을 확인할 수 있습니다.
기존의 ASP.NET Web Appliction 의 사용자 상호작용(User interaction)은 Page 를 대상으로 조직화되고 이들 페이지의 Event를 발생시키고, 처리하도록 되어있습니다.
반면에 ASP.NET MVC application에서의 User interaction 은 Controller 들과 Controller 가 포함하고 있는 Action 들로 짜여져 있습니다. ASP.NET MVC framework은 Controller 라고 하는 Class 들과 URL을 연결시켜주는데 Controller 는 들어오는 Request 를 처리하고 사용자들의 입력과 상호작용(interaction)을 다루며, 적절한 application 로직을 실행합니다. Controller 는 Request 에 대한 HTML 을 생성하기 위해서 분리된 View Componet 를 호출합니다. MVC application에서 iew는 단순히 정보만을 표시하며 controller 는 사용자들의 입력과 상호작용을 처리하고 응답합니다.
Controller 생성시 주의할 점은 모든 Controller Class 는 반드시 "Controller" 접미사를 붙여야 합니다. 모든 Controller class 는 iController interface 를 구현하거나 Controller base class 를 상속해야 합니다. Controller 는 Action method 를 정의하고 있고 MVC Web application 의 workflow 에서 Controller 의 action method 는 들어오는 web request 를 처리합니다. 이들 Action mehtod 는 parameter 를 받게 되는데 이들 parameter를 이용하여 application code를 실행시키고 database 로 부터 가져온 data object들을 부려주고 수정하며, Browser 에 뿌려주기 위해 View 를 결정하는 역할을 합니다.
그럼 HomeController 가 어떻게 생겼나 살펴보도록 하지요.
1 <HandleError()> _
2PublicClassHomeController
3Inherits System.Web.Mvc.Controller
4
5Function Index() AsActionResult
6 ViewData("Message") = "Welcome to ASP.NET MVC!"
7
8Return View()
9EndFunction
10
11Function About() AsActionResult
12Return View()
13EndFunction
14EndClass
클래스 위에 보이는 HandleError() 라는 Attriute filter 는 MVC application 이 동작하다 발생하는 경우 친숙한 에러를 보여주기위해 Controller 나 Action Method 위에 명시적으로 표시해줍니다.
각 Method 명은 요청받은 URL 을 통해 Action 에 연결됩니다. action method 가 호출가능하려면 public 이어야 하고 NonActionAttribute 속성을 가지고 있지 않아야 합니다.
action method 로 사용하려면
method 는 반드시 public 이어야 합니다.
method 는 static method 일 수 없습니다.
method 는 extension method 가 될 수 없습니다.
method 는 constructor, getter, setter일 수 없습니다.
method 는 generic types을 포함할 수없습니다.
method is controller base class의 method 가 아니어야 합니다.
method ref 나 out parameter를 가질 수 없습니다.
등과 같은 제약이 따릅니다.
Action Method 는 ActionResult instance를 반환해야합니다. action result 는 browser 요청에 대한 응답에서 모든 실행을 마친후에 Controller action 이 반환하는 것입니다.
ActionResult 에는 View randering, 다른 action 으로의 redirecting, 다른 페이지로의 redirecting 등이 포함됩니다.
ASP.NET MVC framework 은 다음과 같은 몇가지 타입의 acion result 를 지원합니다.
ViewResult, EmptyResult, RedirctResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FilePathResul, FilestreamResult
여기서는 ViewResult()를 반환하지 않고 Controller base Class의 View() Method 를 반환하고 있는데 주로 ActionResult 를 직접 반환하지 않고 다음과 같은 Controller base Class 의 Method들중 하나를 반환합니다.
View(), Redirect(), RedirectToAction(), RedirectoRoute(), Json(), JavaScriptResult(), Content(),File()등입니다.
그리고 View 에 Data를 전달하기 위해서 위코드에서 보는 바와 같이 Controller base class 의 ViewData Property을 사용할 수 있습니다.
ViewDtaDictionar 는 대소문자를 구분하는 문자열을 Key로 사용합니다.
Controllers : 폴더 명을 보면 알 수 있죠? Controller Class들을 담아 놓는 폴덥니다.
잠시후에 다시 설명을 하겠지만 Controller 는 MVC 기반의 application 에서 사용자 상호작용을 처리한다거나 데이터를 조작한다거나, UI를 표시할 View 를 선택하는데 사용되는 component 라고 할 수 있습니다.
MVC Framework 에서는 모든 컨트롤로의 접미사로 Controller 를 붙여야 한다는거... 잊지마셔요.
Models : MVC Web application 에서 사용하는 application model 들을 담아 놓는 폴더입니다. 주로 Object를 정의하고 데이터 저장소 작업을 위한 로직을 정의한 코드를 포함하고 있습니다.
Scripts : 말그대로 JavaScript 파일을 저장합니다.
Views : View 파일을 담는 걸 추천하죠. View 는 application의 User interface를 표시하는 component 라고 할 수 있습니다. View 로는 .aspx, .ascx 와 .master 파일과 View 를 만들어 내는 기타 파일들이라 하겠습니다. View 폴더는 각 Controller 를 위한 폴더를 포함하고 있는데 폴더명은 Controller의 접두어를 사용합니다. 위 그림에서 보시면 Views 폴더내에 Account, Home 폴더가 있는 것을 보실 수 있습니다.
그리고 그 내부에는 기본적으로 Shared 폴더가 생성되는데 여러 controller 에서 공통적으로 사용하는 .master 파일과 같은 View 가 포함되어있습니다.
Global.asax : MVC Web application 이 사용하는 기본적인 URL Routing을 포함한 전역적인(global 한) 항목들에 대한 코드가 담겨 있습니다.
Web.config : application 설정 정보를 담고 있습니다.
여기까지는 MVC Web Application 을 구성하는 폴더에 대한 설명이었습니다.
다음은 Controller, Model, View 에 대한 사항들을 하나하나 설명하기로 하겠습니다.