login register Sysop! about ME  
qrcode
    최초 작성일 :    2014년 03월 21일
  최종 수정일 :    2014년 03월 21일
  작성자 :    Jake
  편집자 :    Jake (류 지형)
  읽음수 :    29,617

강좌 목록으로 돌아가기

필자의 잡담~

Strongly typed model 을 강력하게 형식화된 모델이라고 번역을 하긴 했는데 찜찜하네요. 데이터 교환에 있어 정의된 도메인 모델, 즉 클래스를 통해 데이터 구조를 정하고 사용한다는 개념이라 [강력한] 보다는 [미리 정의한] 또는 [엄격한]의 느낌이 (개인적으로) 더 있는 것 같습니다. 뭐 정의를 꼭 해야하니 개발자들에게 강력한 느낌으로 다가오는 면도 있군요. ㅎㅎ
본 번역문서는 개인적인 취지로 번역되어 제공되는 문서로, 원문을 비롯한 모든 저작권은 마이크로소프트사에 있습니다. 마이크로소프트사의 요청이 있을 경우, 언제라도 게시가 중단될 수 있습니다. 본 번역문서에는 오역이 포함되어 있을 수 있으며 주석도 번역자 개인의 견해일뿐입니다. 마이크로소프트사는 본 문서의 번역된 내용에 대해 일체의 보장을 하지 않습니다. 번역이 완료된 뒤에도 제품이 업그레이드 되거나 기능이 변경됨에 따라 원문도 변경되거나 보완되었을 수 있으므로 참고하시기 바랍니다.

원문: http://www.asp.net/mvc/tutorials/mvc-5/introduction/accessing-your-models-data-from-a-controller

이번 강좌에서는 MoviesController 컨트롤러 클래스를 새로 작성해 보겠습니다. 이 컨트롤러는 영화 데이터를 조회하고 뷰 템플릿을 사용해서 브라우저에 보여줍니다.

다음 단계로 가기전에 어플리케이션을 빌드합니다. 그렇지 않으면 컨트롤러를 추가할 때 에러가 발생합니다.

솔루션 탐색기에서 Controllers 폴더를 우클릭하고 Add, Controller 의 순서로 선택합니다.

Add Scaffold 다이얼로그 창에서 MVC 5 Controller with views, using Entity Framework 를 선택하고 Add 버튼을 클릭합니다.

    • Controller name 입력란에 MoviesController 를 입력합니다.
    • Model class 입력란에서 Movie (MvcMovie.Models) 를 선택합니다.
    • Data context class 입력란에서 MovieDBContext (MvcMovie.Models) 를 선택합니다.
아래의 그림은 완성된 다이얼로그 창입니다.


Add 버튼을 클릭합니다 (만약 에러가 발생한다면 컨트롤러를 추가하기 전에 어플리케이션을 빌드하지 않았기 때문일겁니다). 비주얼 스튜디오는 다음의 폴더들과 파일들을 생성합니다.

  • Controllers 폴더에 MoviesController.cs 파일
  • Views\Movies 폴더
  • 새로운 Views\Movies 폴더에 Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtml, Index.cshtml 파일들

비주얼 스튜디오는 자동으로 CRUD (create, read, update, and delete) 각각에 해당하는 액션 메서드와 뷰를 생성합니다 (이런 자동 생성은 스카폴딩이라고도 알려져 있습니다; 역주 - 스카폴딩은 건물을 올릴 때 벽면 외곽에 설치하는 철제 구조물로 높은 곳에 접근하여 안전하게 작업할 수 있는 환경을 제공). 여러분은 이제 영화 레코드를 생성, 조회, 수정, 삭제할 수 있는 완벽한 기능의 웹 어플리케이션을 갖게 됐습니다.

어플리케이션을 실행하고 MVC Movie 링크를 클릭합니다 (또는, 브라우저의 주소창에서 URL의 끝에 /Movies 를 붙여 Movies 컨트롤러를 브라우징하세요). 어플리케이션은 App_Start\RouteConfig.cs 파일에 정의된 기본 라우팅의 설정에 따라 http://localhost:xxxxx/Movies 주소에 대한 요청은 Movies 컨트롤러의 기본 액션 메서드인 Index 메서드로 향하게 됩니다. 다른 말로 하면, http://localhost:xxxxx/Movies 주소에 대한 요청은 http://localhost:xxxxx/Movies/Index 주소 요청과 똑같으면서도 효과적인 방법입니다. 아직 추가한 영화가 없기 때문에 결과는 빈 리스트입니다.

영화 생성하기

Create New 링크를 선택하세요. 영화에 대한 내용을 입력하고 Create 버튼을 클릭합니다.

주의: Price 필드에 소수점 또는 컴마를 입력하지 못할 수 있습니다. 컴마를 소수점으로 사용하는 비영어권 지역설정(역주: 독일의 경우 컴마를 소수점으로 사용합니다)에서는, jQuery 를 사용해 숫자 표현이라던가 비영어권 날짜 포맷의 유효성 검사를 하고자 할 때, https://github.com/jquery/globalize 에 있는 globalize.js 파일과 여러분 환경에 맞는 cultures/globalize.cultures.js 파일을 프로젝트에 반드시 포함시키고 자바스크립트에서는 Globalize.parseFloat를 사용해야 합니다. 이렇게 하는 방법은 다음 강좌에서 설명할테니 일단 당장은 정수(예: 10)를 입력하세요.

Create 버튼을 클릭하면 폼 정보가 영화 데이터베이스가 있는 서버로 전송됩니다. 그리고 /Movies URL로 리다이렉트 되어 영화 리스트에서 방금 생성된 영화를 확인할 수 있습니다.

영화를 몇개 더 만들어 보시고 Edit, Details, Delete 링크가 제대로 역할을 하는지 확인해 보십시오.

생성된 코드 살펴보기

Controllers\MoviesController.cs 파일을 열어서 생성된 Index 메서드를 살펴 보겠습니다. movie 컨트롤러의 Index 메서드 코드가 아래에 있습니다.

public class MoviesController : Controller
{
    private MovieDBContext db = new MovieDBContext();
    // GET: /Movies/
    public ActionResult Index()
    {
        return View(db.Movies.ToList());
    }

Movies 컨트롤러에 대한 요청은 Movies 테이블의 모든 영화 엔트리를 반환하고, 그 결과는 Index 뷰로 전달됩니다. MoviesController 클래스의 아래 코드는 영화 데이터베이스 컨텍스트를 생성합니다. 생성된 인스턴스는 영화를 조회, 수정, 삭제하는데 사용할 수 있습니다.

private MovieDBContext db = new MovieDBContext();

강력한 형식의 모델과 @model 키워드

이전 강좌에서 컨트롤러가 ViewBag 객체를 통해서 어떻게 뷰 템플릿에 데이터를 전달하는지 알아 보았습니다. 이 ViewBag 객체는 뷰에 정보를 전달하기 위해 편리하게도 후기 바인딩을 지원하는 동적 객체입니다.

MVC는 또한 뷰 템플릿에 강력한 형식의 객체(Strongly typed object; 후기 바인딩되는 동적 객체와 상반되는 개념으로 미리 정의되어 사용이 가능한 객체를 의미함)를 전달할 수 있는 능력도 갖추고 있습니다. 강력한 형식을 사용하는 접근법은 컴파일시 문법 에러를 쉽게 검출할 수 있게 하고 비주얼 스튜디오 에서 보다 풍부한 인텔리센스 지원을 받을 수 있도록 합니다. 비주얼 스튜디오의 스카폴딩 기술은 뷰와 메서드를 생성할 때, 이 접근법 (강력한 형식의 모델을 뷰로 전달하는 방식) 을 사용했습니다.

이를 염두에 두고, Controllers\MoviesController.cs 파일에 생성된 Details 메서드를 확인해 보겠습니다.

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

id 파라미터는 일반적으로 경로 데이터로서 전달됩니다. 예를 들면, http://localhost:1234/movies/details/1과 같은 요청은 컨트롤러로 movies 컨트롤러를, 액션으로 deatils 메서드를, id로 1을 설정합니다. id 파라미터는 또한 아래와 같이 쿼리스트링으로 전달될 수도 있습니다.

http://localhost:1234/movies/details?id=1

id에 해당하는 영화가 조회되면 그 영화 객체의 인스턴스가 Details 뷰로 전달됩니다.

return View(movie);

Views\Movies\Details.cshtml 파일의 내용을 검토해 봅시다.

@model MvcMovie.Models.Movie

@{
    ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
    <h4>Movie</h4>
	<hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>
         @*Markup omitted for clarity.*@        
    </dl>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

파일의 맨 첫 줄에 @model 문장으로 객체의 형식을 지정함으로써 뷰는 스스로 사용할 형식을 예상할 수 있게 됩니다. 비주얼 스튜디오는 여러분이 movie 컨트롤러를 생성했을 때, 자동으로 다음의 @model 문장을 Details.cshtml 파일의 도입부에 집어 넣었습니다.

@model MvcMovie.Models.Movie

@model 지시어는 여러분이 컨트롤러로부터 전달된 영화 객체를 뷰에서 Model 이란 객체를 통해서 접근할 수 있게 해줍니다. 예를 들어, Details.cshtml 뷰 템플릿에서 코드는 DisplayNameFor, DisplayFor 라는 HTML 헬퍼 메서드에 강력히 형식화된 Model객체를 전달함으로써 영화의 모든 각각의 필드를 사용할 있게 해줍니다. 컨트롤러의 Create, Edit 메서드와 뷰 템플릿 또한 영화 모델 객체를 전달합니다.

MoviesController.cs 파일의 Index 메서드와 Index.cshtml 뷰 템플릿을 살펴 봅시다. Index 액션 메서드에서 View 라는 헬퍼 메서드를 호출하면서 어떻게 List 객체를 생성하고 전달하는지 보세요. 코드는 이런 방식으로 영화 객체의 리스트를 뷰에 전달하고 있습니다.

public ActionResult Index()
{
    return View(db.Movies.ToList());
}

여러분이 movie 컨트롤러를 생성했을 때, 비주어 스튜디오는 자동으로 다음의 @model 문장을 Index.cshtml 파일의 서두에 추가했습니다.

@model IEnumerable<MvcMovie.Models.Movie> 

@model 지시어는 컨트롤러서 전달한 영화 리스트를 Model 객체를 통해서 뷰에서 사용할 수 있게 해줍니다. 예를 들면, Index.cshtml 템플릿에서는 강력히 형식화된 Model 객체와 함께 foreach 문을 사용해서 영화 리스트를 순환하고 있습니다.

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
         <th>
            @Html.DisplayFor(modelItem => item.Rating)
        </th>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", { id=item.ID })  |
            @Html.ActionLink("Delete", "Delete", { id=item.ID }) 
        </td>
    </tr>
}

Model 객체는 IEnumerable<Movie>라는 코드로 강력히 형식화 되어 있으므로 순환문 내에서 각각의 item 객체는 Movie 형식이 됩니다. 여러 다른 장점들 중에서도 이것은 컴파일 시점에서 코딩 오류를 검출하여 런타임 에러를 줄여주며, 에디터에서 완벽히 인텔리센스 지원을 받을 수 있게 해줍니다.

ModelIntellisene

SQL 서버 LocalDB 로 작업하기

엔티티 프레임워크 Code First 접근법은 연결 문자열이 아직 존재하지 않는 Movies 데이터베이스를 가르키고 있는 것을 탐지해 냅니다. 그래서, Code First는 데이터베이스를 자동으로 생성합니다. App_Data 폴더를 보면 데이터베이스가 생성되었는지 확인할 수 있습니다. 만약 Movies.mdf 파일을 보이지 않는다면 솔루션 탐색기의 툴바에서 Show All Files 버튼을 클릭하고, Refresh 버튼을 클릭하세요. 그 후에, App_Data 폴더를 열어보면 됩니다.

서버 탐색기를 열기 위해 Movies.mdf 파일을 더블 클릭합니다. 그리고, Movies 테이블을 찾기 위해 Tables 폴더를 엽니다. ID 필드 옆에는 키 아이콘이 있습니다. 엔티티 프레임워크는 기본적으로 ID 라고 이름 붙은 속성을 기본 키(Primay Key)로 설정합니다. 엔티티 프레임워크와 MVC에 대한 더 많은 정보는 Tom Dykstra 의 훌륭한 강좌, MVC and EF를 참고하세요.

DB_explorer

Movies 테이블을 우클릭하고 Show Table Data 를 선택하여 여러분이 생성한 데이터를 보십시오.

 

Movies 테이블을 우클릭하고 Open Table Definition 을 클릭하여 Code First가 여러분을 위해 생성한 테이블 구조를 확인하십시오.

 

여러분이 생성한 Movie 클래스와 Movies 테이블의 스키마가 서로 어떻게 매핑되는지 잘 살펴봅니다. 엔티티 프레임워크의 Code First는 Movie 클래스의 정의를 토대로 이 스키마를 생성했습니다.

테이블 확인을 마치면, MovieDBContext 를 우클릭하고 Close Connection 을 선택해서 데이터베이스 연결을 끊어줍니다 (만약 연결을 끊지 않으면 프로젝트를 실행할 때, 오류가 발생할 수도 있습니다).

이제 여러분은 데이터베이스와 이 데이터를 조회, 수정, 삭제하는 페이지들을 갖게 되었습니다. 다음 강좌에서는, 스카폴딩이 생성해 준 나머지 코드들을 살펴보고, SearchIndex 메서드를 추가하고, 데이터베이스내 영화를 검색할 때 사용할 SearchIndex 뷰를 만들어 보겠습니다. MVC와 함께 엔티티 프레임워크를 사용하는 것에 관한 보다 상세한 정보는 Creating an Entity Framework Data Model for an ASP.NET MVC Application 를 참조하십시오.


authored by

  clara21
  2019-03-20(10:47)
캐릭 이미지
처음에 컨트롤러를 추가할 때
선택한 코드 생성기를 실행하는 동안 오류가 발생했습니다
Unable to retrieve metadata for 'WebApplication2.Models.data'.One or more
validation errors were detected during model generation:

data : EntityType 'data' has no key defined.Define the key for this EntityType.
data: EntityType : EntitySet 'data'is based on type 'data' that has no key defined

라고 뜨는데 어떻게 해결해야 할까요?


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})