ASP.NET MVC 4 모델 및 데이터 액세스

웹 캠프 팀

웹 캠프 교육 키트 다운로드

이 실습 랩에서는 ASP.NET MVC에 대한 기본 지식이 있다고 가정합니다. 이전에 ASP.NET MVC를 사용하지 않은 경우 MVC 4 기본 사항 실습 랩을 ASP.NET 것이 좋습니다.

이 랩에서는 원본 폴더에 제공된 샘플 웹 애플리케이션에 사소한 변경 내용을 적용하여 이전에 설명한 향상된 기능과 새로운 기능을 안내합니다.

참고

모든 샘플 코드 및 코드 조각은 Microsoft-Web/WebCampTrainingKit 릴리스에서 사용할 수 있는 웹 캠프 교육 키트에 포함되어 있습니다. 이 랩과 관련된 프로젝트는 ASP.NET MVC 4 모델 및 데이터 액세스에서 사용할 수 있습니다.

ASP.NET MVC Fundamentals 실습 랩에서는 컨트롤러에서 보기 템플릿으로 하드 코딩된 데이터를 전달했습니다. 그러나 실제 웹 애플리케이션을 빌드하기 위해 실제 데이터베이스를 사용하는 것이 좋습니다.

이 실습 랩에서는 Music Store 애플리케이션에 필요한 데이터를 저장하고 검색하기 위해 데이터베이스 엔진을 사용하는 방법을 보여 줍니다. 이를 위해 기존 데이터베이스로 시작하고 해당 데이터베이스에서 엔터티 데이터 모델을 만듭니다. 이 랩 전체에서 Database First 접근 방식과 Code First 접근 방식을 충족합니다.

그러나 Model First 접근 방식을 사용하고 도구를 사용하여 동일한 모델을 만든 다음 데이터베이스에서 데이터베이스를 생성할 수도 있습니다.

데이터베이스 첫 번째 및 모델 첫 번째 비교

데이터베이스 우선 및 모델 우선

모델을 생성한 후에는 하드 코딩된 데이터를 사용하는 대신 StoreController에서 적절한 조정을 수행하여 저장소 뷰에 데이터베이스에서 가져온 데이터를 제공합니다. 이번에는 데이터가 데이터베이스에서 제공되지만 StoreController가 동일한 ViewModels를 View 템플릿에 반환하므로 보기 템플릿을 변경할 필요가 없습니다.

코드 첫 번째 접근 방식

Code First 접근 방식을 사용하면 일반적으로 프레임워크와 결합된 클래스를 생성하지 않고 코드에서 모델을 정의할 수 있습니다.

먼저 코드에서 모델 개체는 POKO인 "일반 이전 CLR 개체"로 정의됩니다. POTO는 상속이 없고 인터페이스를 구현하지 않는 간단한 일반 클래스입니다. 해당 데이터베이스에서 데이터베이스를 자동으로 생성하거나 기존 데이터베이스를 사용하고 코드에서 클래스 매핑을 생성할 수 있습니다.

이 방법을 사용하면 POCO 클래스가 매핑 프레임워크와 결합되지 않으므로 모델이 지속성 프레임워크(이 경우 Entity Framework)와 독립적으로 유지된다는 이점이 있습니다.

참고

이 랩은 ASP.NET MVC 4 및 이 Hands-On 랩에 표시된 기능에 맞게 사용자 지정되고 최소화된 Music Store 샘플 애플리케이션 버전을 기반으로 합니다.

전체 Music Store 자습서 애플리케이션을 탐색하려는 경우 MVC-Music-Store에서 찾을 수 있습니다.

사전 요구 사항

이 랩을 완료하려면 다음 항목이 있어야 합니다.

설치 프로그램

코드 조각 설치

편의를 위해 이 랩을 따라 관리할 대부분의 코드를 Visual Studio 코드 조각으로 사용할 수 있습니다. 코드 조각을 설치하려면 .\Source\Setup\CodeSnippets.vsi 파일을 실행합니다.

Visual Studio Code 코드 조각에 익숙하지 않고 사용 방법을 알아보려면 이 문서 "부록 C: 코드 조각 사용"의 부록을 참조할 수 있습니다.


연습

이 실습 랩은 다음 연습으로 구성됩니다.

  1. 연습 1: 데이터베이스 추가
  2. 연습 2: Code First를 사용하여 데이터베이스 만들기
  3. 연습 3: 매개 변수를 사용하여 데이터베이스 쿼리

참고

각 연습에는 연습을 완료한 후 가져와야 하는 결과 솔루션이 포함된 End 폴더가 함께 제공됩니다. 연습을 통해 작업하는 데 추가 도움이 필요한 경우 이 솔루션을 가이드로 사용할 수 있습니다.

이 랩을 완료하는 데 소요되는 예상 시간: 35분.

연습 1: 데이터베이스 추가

이 연습에서는 데이터를 소비하기 위해 MusicStore 애플리케이션의 테이블이 있는 데이터베이스를 솔루션에 추가하는 방법을 알아봅니다. 모델을 사용하여 데이터베이스가 생성되고 솔루션에 추가되면 하드 코딩된 값을 사용하는 대신 View 템플릿에 데이터베이스에서 가져온 데이터를 제공하도록 StoreController 클래스를 수정합니다.

작업 1 - 데이터베이스 추가

이 작업에서는 MusicStore 애플리케이션의 기본 테이블을 사용하여 이미 만든 데이터베이스를 솔루션에 추가합니다.

  1. Source/Ex1-AddADatabaseDBFirst/Begin/ 폴더에 있는 Begin 솔루션을 엽니다.

    1. 계속하려면 일부 누락된 NuGet 패키지를 다운로드해야 합니다. 이렇게 하려면 프로젝트 메뉴를 클릭하고 NuGet 패키지 관리를 선택합니다.

    2. NuGet 패키지 관리 대화 상자에서 복원을 클릭하여 누락된 패키지를 다운로드합니다.

    3. 마지막으로 빌드 솔루션 빌드를 클릭하여솔루션을 빌드 | 합니다.

      참고

      NuGet을 사용할 때의 장점 중 하나는 프로젝트의 모든 라이브러리를 제공할 필요가 없어 프로젝트 크기를 줄일 수 있다는 것입니다. NuGet Power Tools를 사용하면 Packages.config 파일에서 패키지 버전을 지정하면 프로젝트를 처음 실행할 때 필요한 모든 라이브러리를 다운로드할 수 있습니다. 이 때문에 이 랩에서 기존 솔루션을 연 후 이러한 단계를 실행해야 합니다.

  2. MvcMusicStore 데이터베이스 파일을 추가합니다. 이 실습 랩에서는 MvcMusicStore.mdf라는 이미 만들어진 데이터베이스를 사용합니다. 이렇게 하려면 App_Data 폴더를 마우스 오른쪽 단추 로 클릭하고 추가 를 가리킨 다음 기존 항목을 클릭합니다. \Source\Assets로 이동하여 MvcMusicStore.mdf 파일을 선택합니다.

    기존 항목 추가

    기존 항목 추가

    MvcMusicStore.mdf 데이터베이스 파일

    MvcMusicStore.mdf 데이터베이스 파일

    데이터베이스가 프로젝트에 추가되었습니다. 데이터베이스가 솔루션 내에 있는 경우에도 다른 데이터베이스 서버에서 호스트된 대로 쿼리하고 업데이트할 수 있습니다.

    솔루션 탐색기 솔루션 탐색기

    솔루션 탐색기 MvcMusicStore 데이터베이스

  3. 데이터베이스에 대한 연결을 확인합니다. 이렇게 하려면 MvcMusicStore.mdf 를 두 번 클릭하여 연결을 설정합니다.

    MvcMusicStore.mdf

    MvcMusicStore.mdf에 연결

작업 2 - 데이터 모델 만들기

이 작업에서는 이전 작업에 추가된 데이터베이스와 상호 작용하는 데이터 모델을 만듭니다.

  1. 데이터베이스를 나타내는 데이터 모델을 만듭니다. 이렇게 하려면 솔루션 탐색기 Models 폴더를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 항목을 클릭합니다. 새 항목 추가 대화 상자에서 데이터 템플릿을 선택한 다음 엔터티 데이터 모델 항목을 ADO.NET. 데이터 모델 이름을 StoreDB.edmx 로 변경하고 추가를 클릭합니다.

    StoreDB ADO.NET 엔터티 데이터 모델 추가

    StoreDB ADO.NET 엔터티 데이터 모델 추가

  2. 엔터티 데이터 모델 마법사가 나타납니다. 이 마법사는 모델 계층 만들기를 안내합니다. 최근에 추가된 기존 데이터베이스를 기반으로 모델을 만들어야 하므로 데이터베이스에서 생성 을 선택하고 다음을 클릭합니다.

    모델 콘텐츠 선택모

    모델 콘텐츠 선택

  3. 데이터베이스에서 모델을 생성하므로 사용할 연결을 지정해야 합니다. 새 연결을 클릭합니다.

  4. Microsoft SQL Server 데이터베이스 파일을 선택하고 계속을 클릭합니다.

    데이터 원본 선택 데이터

    데이터 원본 선택 대화 상자

  5. 찾아보기를 클릭하고 App_Data 폴더에 있는 MvcMusicStore.mdf 데이터베이스를 선택하고 확인을 클릭합니다.

    연결 속성

    연결 속성

  6. 생성된 클래스는 엔터티 연결 문자열과 이름이 같아야 하므로 이름을 MusicStoreEntities 로 변경하고 다음을 클릭합니다.

    데이터 연결 선택

    데이터 연결 선택

  7. 사용할 데이터베이스 개체를 선택합니다. 엔터티 모델이 데이터베이스의 테이블만 사용하므로 테이블 옵션을 선택하고 모델에 외래 키 열 포함생성된 개체 이름 복수화 또는 단수화 옵션도 선택되어 있는지 확인합니다. 모델 네임스페이스를 MvcMusicStore.Model 으로 변경하고 마침을 클릭합니다.

    데이터베이스 개체 선택 데이터베이스

    데이터베이스 개체 선택

    참고

    보안 경고 대화 상자가 표시되면 확인을 클릭하여 템플릿을 실행하고 모델 엔터티에 대한 클래스를 생성합니다.

  8. 데이터베이스에 대한 엔터티 다이어그램이 나타나고 각 테이블을 데이터베이스에 매핑하는 별도의 클래스가 만들어집니다. 예를 들어 Albums 테이블은 Album 클래스로 표시됩니다. 여기서 테이블의 각 열은 클래스 속성에 매핑됩니다. 이렇게 하면 데이터베이스의 행을 나타내는 개체를 쿼리하고 작업할 수 있습니다.

    엔터티 다이어그램

    엔터티 다이어그램

    참고

    T4 템플릿(.tt)은 코드를 실행하여 엔터티 클래스를 생성하고 동일한 이름의 기존 클래스를 덮어씁니다. 이 예제에서는 "Album", "Genre" 및 "Artist" 클래스를 생성된 코드로 덮어씁니다.

작업 3 - 애플리케이션 빌드

이 작업에서는 모델 생성에서 앨범, 장르아티스트 모델 클래스를 제거했지만 프로젝트가 새 데이터 모델 클래스를 사용하여 성공적으로 빌드된다는 것을 검사.

  1. 빌드 메뉴 항목을 선택한 다음 , 빌드MvcMusicStore를 선택하여 프로젝트를 빌드합니다.

    프로젝트 빌드

    프로젝트 빌드

  2. 프로젝트가 성공적으로 빌드됩니다. 여전히 작동하는 이유는 무엇인가요? 데이터베이스 테이블에 제거된 클래스 AlbumGenre에서 사용하던 속성이 포함된 필드가 있기 때문에 작동합니다.

    빌드 성공

    빌드 성공

  3. 디자이너는 엔터티를 다이어그램 형식으로 표시하지만 실제로는 C# 클래스입니다. 솔루션 탐색기 StoreDB.edmx 노드를 확장한 다음 StoreDB.tt 생성된 새 엔터티가 표시됩니다.

    생성된 파일

    생성된 파일

작업 4 - 데이터베이스 쿼리

이 작업에서는 하드 코딩된 데이터를 사용하는 대신 데이터베이스를 쿼리하여 정보를 검색하도록 StoreController 클래스를 업데이트합니다.

  1. Controllers\StoreController.cs를 열고 클래스에 다음 필드를 추가하여 storeDB라는 MusicStoreEntities 클래스의 instance 보관합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex1 storeDB)

    public class StoreController : Controller
    {
        private MusicStoreEntities storeDB = new MusicStoreEntities();
    
  2. MusicStoreEntities 클래스는 데이터베이스의 각 테이블에 대한 컬렉션 속성을 노출합니다. 찾아보기 작업 메서드를 업데이트하여 모든 앨범이 포함된 장르를 검색합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex1 스토어 찾아보기)

    public ActionResult Browse(string genre)
    {
        // Retrieve Genre and its Associated Albums from database
        var genreModel = new Genre
        {
            Name = genre,
            Albums = this.storeDB.Albums.ToList()
        };
    
        return this.View(genreModel);
    }
    

    참고

    LINQ(언어 통합 쿼리)라는 .NET 기능을 사용하여 이러한 컬렉션에 대해 강력한 형식의 쿼리 식을 작성합니다. 이 식은 데이터베이스에 대해 코드를 실행하고 프로그래밍할 수 있는 개체를 반환합니다.

    LINQ에 대한 자세한 내용은 msdn 사이트를 방문하세요.

  3. 인덱스 작업 메서드를 업데이트하여 모든 장르를 검색합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex1 저장소 인덱스)

    public ActionResult Index()
    {
        var genres = this.storeDB.Genres;
    
        return this.View(genres);
    }
    
  4. 인덱스 작업 메서드를 업데이트하여 모든 장르를 검색하고 컬렉션을 목록으로 변환합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex1 Store GenreMenu)

    // GET: /Store/GenreMenu
    [ChildActionOnly]
    public ActionResult GenreMenu()
    {
        var genres = this.storeDB.Genres.Take(9).ToList();
    
        return this.PartialView(genres);
    }
    

작업 5 - 애플리케이션 실행

이 작업에서는 이제 스토어 인덱스 페이지에 하드 코딩된 장르 대신 데이터베이스에 저장된 장르가 표시되도록 검사. StoreController는 이전과 동일한 엔터티를 반환하지만 이번에는 데이터가 데이터베이스에서 나오므로 보기 템플릿을 변경할 필요가 없습니다.

  1. 솔루션을 다시 빌드하고 F5 키를 눌러 애플리케이션을 실행합니다.

  2. 프로젝트는 홈페이지에서 시작됩니다. Genres 메뉴가 더 이상 하드 코딩된 목록이 아니고 데이터가 데이터베이스에서 직접 검색되는지 확인합니다.

    스크린샷은 장르 메뉴를 확인할 수 있는 음악 장르 페이지를 보여줍니다.

    데이터베이스에서 장르 검색

  3. 이제 장르를 찾아서 앨범이 데이터베이스에서 채워져 있는지 확인합니다.

    스크린샷은 데이터베이스에서 앨범을 찾아볼 수 있는 보기를 보여줍니다.

    데이터베이스에서 앨범 검색

연습 2: 먼저 코드를 사용하여 데이터베이스 만들기

이 연습에서는 Code First 접근 방식을 사용하여 MusicStore 애플리케이션의 테이블을 사용하여 데이터베이스를 만드는 방법과 해당 데이터에 액세스하는 방법을 알아봅니다.

모델이 생성되면 하드 코딩된 값을 사용하는 대신 데이터베이스에서 가져온 데이터를 사용하여 보기 템플릿을 제공하도록 StoreController를 수정합니다.

참고

연습 1을 완료하고 Database First 접근 방식을 이미 사용했다면 이제 다른 프로세스로 동일한 결과를 얻는 방법을 알아봅니다. 연습 1과 공통적인 작업은 읽기 쉽도록 표시되었습니다. 연습 1을 완료하지 않았지만 Code First 방법을 알아보려면 이 연습에서 시작하여 토픽의 전체 검사를 받을 수 있습니다.

작업 1 - 샘플 데이터 채우기

이 작업에서는 Code-First를 사용하여 처음 만들 때 샘플 데이터로 데이터베이스를 채웁다.

  1. Source/Ex2-CreatingADatabaseCodeFirst/Begin/ 폴더에 있는 Begin 솔루션을 엽니다. 그렇지 않으면 이전 연습을 완료하여 얻은 End 솔루션을 계속 사용할 수 있습니다.

    1. 제공된 Begin 솔루션을 연 경우 계속하기 전에 누락된 NuGet 패키지를 다운로드해야 합니다. 이렇게 하려면 프로젝트 메뉴를 클릭하고 NuGet 패키지 관리를 선택합니다.

    2. NuGet 패키지 관리 대화 상자에서 복원을 클릭하여 누락된 패키지를 다운로드합니다.

    3. 마지막으로 빌드 솔루션 빌드를 클릭하여솔루션을 빌드 | 합니다.

      참고

      NuGet을 사용할 때의 이점 중 하나는 프로젝트의 모든 라이브러리를 배송할 필요가 없어 프로젝트 크기를 줄일 수 있다는 것입니다. NuGet Power Tools를 사용하면 Packages.config 파일에서 패키지 버전을 지정하면 프로젝트를 처음 실행할 때 필요한 모든 라이브러리를 다운로드할 수 있습니다. 따라서 이 랩에서 기존 솔루션을 연 후 이러한 단계를 실행해야 합니다.

  2. Models 폴더에 SampleData.cs 파일을 추가합니다. 이렇게 하려면 Models 폴더를 마우스 오른쪽 단추로 클릭하고 추가 를 가리킨 다음 기존 항목을 클릭합니다. \Source\Assets로 이동하여 SampleData.cs 파일을 선택합니다.

    샘플 데이터 채우기 코드

    샘플 데이터 채우기 코드

  3. Global.asax.cs 파일을 열고 다음 using 문을 추가합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex2 전역 Asax 사용)

    using MvcMusicStore.Models;
    using System.Data.Entity;
    
  4. Application_Start() 메서드에서 다음 줄을 추가하여 데이터베이스 이니셜라이저를 설정합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex2 Global Asax SetInitializer)

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    
        Database.SetInitializer(new SampleData());
    }
    

작업 2 - 데이터베이스에 대한 연결 구성

프로젝트에 데이터베이스를 이미 추가했으므로 Web.config 파일에 연결 문자열을 작성합니다.

  1. Web.config에 연결 문자열을 추가합니다. 이렇게 하려면 프로젝트 루트에서 Web.config 열고 DefaultConnection이라는 연결 문자열을 connectionStrings 섹션의< 이 줄로 바꿉니다>.

     파일 위치Web.config 파일

    파일 위치Web.config

    <configuration>
    ...
      <connectionStrings>
        <add name="MusicStoreEntities" connectionString="data source=(LocalDb)\v11.0;initial catalog=MvcMusicStore;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\MvcMusicStore.mdf" providerName="System.Data.SqlClient" />
      </connectionStrings>
    ...
    

작업 3 - 모델 작업

데이터베이스에 대한 연결을 이미 구성했으므로 모델을 데이터베이스 테이블과 연결합니다. 이 작업에서는 Code First를 사용하여 데이터베이스에 연결되는 클래스를 만듭니다. 수정해야 하는 기존 POCO 모델 클래스가 있습니다.

참고

연습 1을 완료한 경우 마법사에서 이 단계를 수행했음을 알 수 있습니다. Code First를 수행하면 데이터 엔터티에 연결되는 클래스를 수동으로 만듭니다.

  1. Models 프로젝트 폴더에서 POCO 모델 클래스 Genre를 열고 ID를 포함합니다. GenreId라는 이름의 int 속성을 사용합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex2 코드 첫 번째 장르)

    namespace MvcMusicStore.Models
    {
        using System.Collections.Generic;
    
        public class Genre
        {
          public int GenreId { get; set; }
    
          public string Name { get; set; }
    
          public string Description { get; set; }
    
          public List<Album> Albums { get; set; }
        }
    }
    

    참고

    Code First 규칙을 사용하려면 Genre 클래스에 자동으로 검색되는 기본 키 속성이 있어야 합니다.

    msdn 문서에서 코드 첫 번째 규칙에 대해 자세히 확인할 수 있습니다.

  2. 이제 Models 프로젝트 폴더에서 POCO 모델 클래스 Album을 열고 외래 키를 포함하고 GenreIdArtistId 이름으로 속성을 만듭니다. 이 클래스에는 기본 키에 대한 GenreId 가 이미 있습니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex2 코드 첫 번째 앨범)

    namespace MvcMusicStore.Models
    {
        public class Album
        {
            public int AlbumId { get; set; }
    
            public int GenreId { get; set; }
    
            public int ArtistId { get; set; }
    
            public string Title { get; set; }
    
            public decimal Price { get; set; }
    
            public string AlbumArtUrl { get; set; }
    
            public virtual Genre Genre { get; set; }
    
            public virtual Artist Artist { get; set; }
        }
    }
    
  3. POCO 모델 클래스 Artist를 열고 ArtistId 속성을 포함합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex2 코드 첫 번째 아티스트)

    namespace MvcMusicStore.Models
    {
        public class Artist
        {
            public int ArtistId { get; set; }
    
            public string Name { get; set; }
        }
    }
    
  4. Models 프로젝트 폴더를 마우스 오른쪽 단추로 클릭하고 추가 | 를 선택합니다. 클래스입니다. 파일 이름을 MusicStoreEntities.cs로 지정합니다. 그런 다음 추가를 클릭합니다 .

    클래스 추가 클래스 추가

    새 항목 추가

    class2 추가2

    클래스 추가

  5. 방금 만든 클래스인 MusicStoreEntities.cs를 열고 System.Data.Entity 및 System.Data.Entity.Infrastructure임스페이스를 포함합니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    ...
    
  6. 클래스 선언을 바꾸어 DbContext 클래스를 확장합니다. 공용 DBSet 를 선언하고 OnModelCreating 메서드를 재정의합니다. 이 단계가 끝나면 모델을 Entity Framework와 연결하는 도메인 클래스를 얻게 됩니다. 이렇게 하려면 클래스 코드를 다음으로 바꿉다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex2 Code First MusicStoreEntities)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    
    namespace MvcMusicStore.Models
    {
        public class MusicStoreEntities : DbContext
        {
            public DbSet<Genre> Genres { get; set; }
    
            public DbSet<Album> Albums { get; set; }
    
            public DbSet<Artist> Artists { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Genre>().ToTable("Genres");
                modelBuilder.Entity<Album>().ToTable("Albums");
                modelBuilder.Entity<Artist>().ToTable("Artists");
    
                base.OnModelCreating(modelBuilder);
            }
        }
    }
    

참고

Entity Framework DbContextDBSet 을 사용하면 POCO 클래스 Genre를 쿼리할 수 있습니다. OnModelCreating 메서드를 확장하면 코드에서 Genre를 데이터베이스 테이블에 매핑하는 방법을 지정합니다. 이 msdn 문서 링크에서 DBContext 및 DBSet에 대한 자세한 정보를 찾을 수 있습니다.

작업 4 - 데이터베이스 쿼리

이 작업에서는 하드 코딩된 데이터를 사용하는 대신 데이터베이스에서 검색할 수 있도록 StoreController 클래스를 업데이트합니다.

참고

이 작업은 연습 1과 공통적으로 수행됩니다.

연습 1을 완료한 경우 이러한 단계는 두 방법(데이터베이스 우선 또는 코드 우선)에서 동일합니다. 데이터가 모델과 연결되는 방식은 다르지만 데이터 엔터티에 대한 액세스는 컨트롤러에서 아직 투명합니다.

  1. Controllers\StoreController.cs를 열고 클래스에 다음 필드를 추가하여 storeDB라는 MusicStoreEntities 클래스의 instance 보관합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex1 storeDB)

    public class StoreController : Controller
    {
        private MusicStoreEntities storeDB = new MusicStoreEntities();
        ...
    }
    
  2. MusicStoreEntities 클래스는 데이터베이스의 각 테이블에 대한 컬렉션 속성을 노출합니다. 찾아보기 작업 메서드를 업데이트하여 모든 앨범이 포함된 장르를 검색합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex2 스토어 찾아보기)

    public ActionResult Browse(string genre)
    {
         // Retrieve Genre and its Associated Albums from database
         var genreModel = new Genre
        {
            Name = genre,
            Albums = this.storeDB.Albums.ToList()
        };
    
         return this.View(genreModel);
    }
    

    참고

    LINQ(언어 통합 쿼리)라는 .NET 기능을 사용하여 이러한 컬렉션에 대해 강력한 형식의 쿼리 식을 작성합니다. 이 쿼리는 데이터베이스에 대해 코드를 실행하고 프로그래밍할 수 있는 개체를 반환합니다.

    LINQ에 대한 자세한 내용은 msdn 사이트를 방문하세요.

  3. 인덱스 작업 메서드를 업데이트하여 모든 장르를 검색합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex2 저장소 인덱스)

    public ActionResult Index()
    {
        var genres = this.storeDB.Genres;
    
        return this.View(genres);
    }
    
  4. 인덱스 작업 메서드를 업데이트하여 모든 장르를 검색하고 컬렉션을 목록으로 변환합니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex2 Store GenreMenu)

    // GET: /Store/GenreMenu
    [ChildActionOnly]
    public ActionResult GenreMenu()
    {
        var genres = this.storeDB.Genres.Take(9).ToList();
    
        return this.PartialView(genres);
    }
    

작업 5 - 애플리케이션 실행

이 작업에서는 이제 스토어 인덱스 페이지에 하드 코딩된 장르 대신 데이터베이스에 저장된 장르가 표시되는지 검사. StoreController가 이전과 동일한 StoreIndexViewModel을 반환하지만 이번에는 데이터가 데이터베이스에서 나오므로 보기 템플릿을 변경할 필요가 없습니다.

  1. 솔루션을 다시 빌드하고 F5 키를 눌러 애플리케이션을 실행합니다.

  2. 프로젝트는 홈페이지에서 시작됩니다. Genres 메뉴가 더 이상 하드 코딩된 목록이 아니고 데이터가 데이터베이스에서 직접 검색되는지 확인합니다.

    스크린샷은 장르 메뉴가 데이터베이스에서 검색되는지 확인할 수 있는 음악 장르 페이지를 보여줍니다.

    데이터베이스에서 장르 검색

  3. 이제 장르로 이동하여 앨범이 데이터베이스에서 채워져 있는지 확인합니다.

    스크린샷은 앨범이 데이터베이스에서 채워지는지 확인하는 보기를 보여줍니다.

    데이터베이스에서 앨범 찾아보기

연습 3: 매개 변수를 사용하여 데이터베이스 쿼리

이 연습에서는 매개 변수를 사용하여 데이터베이스를 쿼리하는 방법과 데이터베이스가 보다 효율적인 방식으로 데이터 검색에 액세스하는 수를 줄이는 기능인 쿼리 결과 셰이핑을 사용하는 방법을 알아봅니다.

참고

쿼리 결과 셰이핑에 대한 자세한 내용은 다음 msdn 문서를 참조하세요.

작업 1 - 데이터베이스에서 앨범을 검색하도록 StoreController 수정

이 작업에서는 특정 장르에서 앨범을 검색하기 위해 데이터베이스에 액세스하도록 StoreController 클래스를 변경합니다.

  1. Database-First 방법을 Code-First 사용하려는 경우 Source\Ex3-QueryingTheDatabaseWithParametersCodeFirst\Begin 폴더 또는 Source\Ex3-QueryingTheDatabaseWithParametersDBFirst\Begin 폴더에 있는 Begin 솔루션을 엽니다. 그렇지 않으면 이전 연습을 완료하여 얻은 End 솔루션을 계속 사용할 수 있습니다.

    1. 제공된 Begin 솔루션을 연 경우 계속하기 전에 누락된 NuGet 패키지를 다운로드해야 합니다. 이렇게 하려면 프로젝트 메뉴를 클릭하고 NuGet 패키지 관리를 선택합니다.

    2. NuGet 패키지 관리 대화 상자에서 복원을 클릭하여 누락된 패키지를 다운로드합니다.

    3. 마지막으로 빌드 솔루션 빌드를 클릭하여솔루션을 빌드 | 합니다.

      참고

      NuGet을 사용할 때의 장점 중 하나는 프로젝트의 모든 라이브러리를 제공할 필요가 없어 프로젝트 크기를 줄일 수 있다는 것입니다. NuGet Power Tools를 사용하면 Packages.config 파일에서 패키지 버전을 지정하면 프로젝트를 처음 실행할 때 필요한 모든 라이브러리를 다운로드할 수 있습니다. 이 때문에 이 랩에서 기존 솔루션을 연 후 이러한 단계를 실행해야 합니다.

  2. StoreController 클래스를 열어 찾아보기 작업 메서드를 변경합니다. 이렇게 하려면 솔루션 탐색기Controllers 폴더를 확장하고 StoreController.cs를 두 번 클릭합니다.

  3. 찾아보기 동작 메서드를 변경하여 특정 장르의 앨범을 검색합니다. 이렇게 하려면 다음 코드를 바꿉 있습니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex3 StoreController BrowseMethod)

    public ActionResult Browse(string genre)
    {
        // Retrieve Genre and its Associated Albums from database
        var genreModel = this.storeDB.Genres.Include("Albums")
            .Single(g => g.Name == genre);
    
        return this.View(genreModel);
    }
    

참고

엔터티의 컬렉션을 채하려면 Include 메서드를 사용하여 앨범을 검색할 도 지정해야 합니다. 를 사용할 수 있습니다. LINQ의 Single() 확장은 이 경우 앨범에 하나의 장르만 필요하기 때문입니다. Single() 메서드는 람다 식을 매개 변수로 사용합니다. 이 경우 해당 이름이 정의된 값과 일치하게 단일 Genre 개체를 지정합니다.

Genre 개체를 검색할 때 로드하려는 다른 관련 엔터티를 나타낼 수 있는 기능을 활용합니다. 이 기능을 쿼리 결과 셰이핑이라고 하며 정보를 검색하기 위해 데이터베이스에 액세스하는 데 필요한 횟수를 줄일 수 있습니다. 이 시나리오에서는 검색한 장르의 앨범을 미리 가져오려고 합니다.

이 쿼리에는 관련 앨범도 원한다는 것을 나타내는 Genres.Include("Albums") 가 포함됩니다. 이렇게 하면 단일 데이터베이스 요청에서 Genre 및 Album 데이터를 모두 검색하므로 보다 효율적인 애플리케이션이 생성됩니다.

작업 2 - 애플리케이션 실행

이 작업에서는 애플리케이션을 실행하고 데이터베이스에서 특정 장르의 앨범을 검색합니다.

  1. F5 키를 눌러 애플리케이션을 실행합니다.

  2. 프로젝트는 홈페이지에서 시작됩니다. URL을 /Store/Browse?genre=Pop 으로 변경하여 결과가 데이터베이스에서 검색되고 있는지 확인합니다.

    장르별 검색 장르

    찾아보기 /Store/Browse?genre=Pop

작업 3 - ID로 앨범 액세스

이 작업에서는 이전 절차를 반복하여 앨범을 ID로 가져옵니다.

  1. 필요한 경우 브라우저를 닫고 Visual Studio로 돌아갑니다. StoreController 클래스를 열어서 Details 작업 메서드를 변경합니다. 이렇게 하려면 솔루션 탐색기Controllers 폴더를 확장하고 StoreController.cs를 두 번 클릭합니다.

  2. 세부 정보 작업 메서드를 변경하여 ID에 따라 앨범 세부 정보를 검색합니다. 이렇게 하려면 다음 코드를 바꿉 있습니다.

    (코드 조각 - 모델 및 데이터 액세스 - Ex3 StoreController DetailsMethod)

    // GET: /Store/
    public ActionResult Details(int id)
    {
        var album = this.storeDB.Albums.Find(id);
    
        if (album == null)
        {
            return this.HttpNotFound();
        }
    
        return this.View(album);
    }
    

작업 4 - 애플리케이션 실행

이 작업에서는 웹 브라우저에서 애플리케이션을 실행하고 해당 ID로 앨범 세부 정보를 가져옵니다.

  1. F5 키를 눌러 애플리케이션을 실행합니다.

  2. 프로젝트는 홈페이지에서 시작됩니다. URL을 /Store/Details/51 로 변경하거나 장르를 찾아보고 앨범을 선택하여 결과가 데이터베이스에서 검색되는지 확인합니다.

    검색 세부 정보

    찾아보기 /Store/Details/51

참고

또한 부 록 B: 웹 배포를 사용하여 ASP.NET MVC 4 애플리케이션 게시에 따라 이 애플리케이션을 Windows Azure 웹 사이트에 배포할 수 있습니다.


요약

이 실습 랩을 완료하면 데이터베이스 첫 번째 접근 방식과 코드 첫 번째 접근 방식을 사용하여 MVC 모델 및 데이터 액세스 ASP.NET 기본 사항을 알아보았습니다.

  • 데이터를 소비하기 위해 솔루션에 데이터베이스를 추가하는 방법
  • 하드 코딩된 데이터 대신 데이터베이스에서 가져온 데이터를 사용하여 보기 템플릿을 제공하도록 컨트롤러를 업데이트하는 방법
  • 매개 변수를 사용하여 데이터베이스를 쿼리하는 방법
  • 데이터베이스 액세스 횟수를 줄여 데이터를 보다 효율적인 방식으로 검색하는 기능인 쿼리 결과 셰이핑을 사용하는 방법
  • Microsoft Entity Framework에서 Database First 및 Code First 접근 방식을 모두 사용하여 데이터베이스를 모델과 연결하는 방법

부록 A: 웹용 Visual Studio Express 2012 설치

Microsoft 웹 플랫폼 설치 관리자 사용하여 웹용 Microsoft Visual Studio Express 2012 또는 다른 "Express" 버전을 설치할 수 있습니다. 다음 지침은 Microsoft 웹 플랫폼 설치 관리자 사용하여 Visual Studio Express 2012 for Web을 설치하는 데 필요한 단계를 안내합니다.

  1. [https://go.microsoft.com/?linkid=9810169](https://go.microsoft.com/?linkid=9810169)로 이동합니다. 또는 웹 플랫폼 설치 관리자를 이미 설치한 경우 이를 열고 "Windows Azure SDK를 사용하는 웹용 Visual Studio Express 2012" 제품을 검색할 수 있습니다.

  2. 지금 설치를 클릭합니다. 웹 플랫폼 설치 관리자가 없는 경우 먼저 다운로드하여 설치하도록 리디렉션됩니다.

  3. 웹 플랫폼 설치 관리자가 열리면 설치를 클릭하여 설치를 시작합니다.

    설치 Visual Studio Express

    설치 Visual Studio Express

  4. 모든 제품의 라이선스 및 약관을 읽고 동의 를 클릭하여 계속합니다.

    사용 조건 동의

    사용 조건 동의

  5. 다운로드 및 설치 프로세스가 완료될 때까지 기다립니다.

    설치 진행률

    설치 진행률

  6. 설치가 완료되면 마침을 클릭합니다.

    설치 완료됨

    설치 완료됨

  7. 종료를 클릭하여 웹 플랫폼 설치 관리자를 닫습니다.

  8. 웹용 Visual Studio Express 열려면 시작 화면으로 이동하여 "VS Express" 쓰기를 시작한 다음 웹용 VS Express 타일을 클릭합니다.

    웹용 VS Express 타일

    웹용 VS Express 타일

부록 B: 웹 배포를 사용하여 ASP.NET MVC 4 애플리케이션 게시

이 부록은 Windows Azure 관리 포털에서 새 웹 사이트를 만들고 랩에 따라 얻은 애플리케이션을 게시하는 방법을 보여 줍니다. Windows Azure에서 제공하는 웹 배포 게시 기능을 활용합니다.

작업 1 - Windows Azure Portal에서 새 웹 사이트 만들기

  1. Windows Azure 관리 포털로 이동하여 구독과 연결된 Microsoft 자격 증명을 사용하여 로그인합니다.

    참고

    Windows Azure를 사용하면 10개의 ASP.NET 웹 사이트를 무료로 호스트한 다음 트래픽이 증가함에 따라 크기를 조정할 수 있습니다. 여기에서 등록할 수 있습니다.

    Windows에 로그온Azure Portal

    Windows Azure 관리 포털에 로그온

  2. 명령 모음에서 새로 만들기를 클릭합니다.

    새 웹 사이트 만들기

    새 웹 사이트 만들기

  3. 컴퓨팅 | 웹 사이트를 클릭합니다. 그런 다음 , 빠른 만들기 옵션을 선택합니다. 새 웹 사이트에 사용 가능한 URL을 제공하고 웹 사이트 만들기를 클릭합니다.

    참고

    Windows Azure 웹 사이트는 제어하고 관리할 수 있는 클라우드에서 실행되는 웹 애플리케이션의 호스트입니다. 빠른 만들기 옵션을 사용하면 포털 외부에서 완료된 웹 애플리케이션을 Windows Azure 웹 사이트에 배포할 수 있습니다. 데이터베이스를 설정하는 단계는 포함되지 않습니다.

    빠른 만들기를 사용하여 새 웹 사이트 만들기

    빠른 만들기를 사용하여 새 웹 사이트 만들기

  4. 웹 사이트가 생성될 때까지 기다립니다.

  5. 웹 사이트가 만들어지면 URL 열 아래의 링크를 클릭합니다. 새 웹 사이트가 작동하는지 확인합니다.

    새 웹 사이트 찾아보

    새 웹 사이트로 검색

    실행 중인 웹 사이트를 실행하는 웹 사이트

    실행 중인 웹 사이트

  6. 포털로 돌아가기 이름 열 아래의 웹 사이트 이름을 클릭하여 관리 페이지를 표시합니다.

    웹 사이트 관리 페이지

    웹 사이트 관리 페이지 열기

  7. 대시보드 페이지의 빠른 보기 섹션에서 게시 프로필 다운로드 링크를 클릭합니다.

    참고

    게시 프로필에는 사용하도록 설정된 각 게시 방법에 대해 웹 애플리케이션을 Windows Azure 웹 사이트에 게시하는 데 필요한 모든 정보가 포함되어 있습니다. 게시 프로필에는 게시 방법이 사용 설정된 각 엔드포인트에 연결하고 이에 대해 인증하는 데 필요한 URL, 사용자 자격 증명 및 데이터베이스 문자열이 포함되어 있습니다. Microsoft WebMatrix 2, Microsoft Visual Studio Express for WebMicrosoft Visual Studio 2012는 게시 프로필 읽기를 지원하여 Windows Azure 웹 사이트에 웹 애플리케이션을 게시하기 위한 이러한 프로그램의 구성을 자동화합니다.

    웹 사이트 게시 프로필 다운로드

    웹 사이트 게시 프로필 다운로드

  8. 게시 프로필 파일을 알려진 위치에 다운로드합니다. 이 연습에서는 이 파일을 사용하여 Visual Studio에서 Windows Azure 웹 사이트에 웹 애플리케이션을 게시하는 방법을 알아보세요.

    게시 프로필 파일 저장

    게시 프로필 파일 저장

작업 2 - 데이터베이스 서버 구성

애플리케이션이 SQL Server 데이터베이스를 사용하는 경우 SQL Database 서버를 만들어야 합니다. SQL Server 사용하지 않는 간단한 애플리케이션을 배포하려는 경우 이 작업을 건너뛸 수 있습니다.

  1. 애플리케이션 데이터베이스를 저장하려면 SQL Database 서버가 필요합니다. 구독의 SQL Database 서버는 Sql Databases | | 서버대시보드의 Windows Azure 관리 포털에서 볼 수 있습니다. 서버를 만들지 않은 경우 명령 모음의 추가 단추를 사용하여 서버를 만들 수 있습니다. 다음 작업에서 사용할 서버 이름 및 URL, 관리자 로그인 이름 및 암호를 기록해 둡니다. 데이터베이스는 이후 단계에서 만들어지으므로 아직 만들지 마세요.

    SQL Database 서버 대시보드

    SQL Database 서버 대시보드

  2. 다음 작업에서는 Visual Studio에서 데이터베이스 연결을 테스트합니다. 이러한 이유로 서버의 허용된 IP 주소 목록에 로컬 IP 주소를 포함해야 합니다. 이렇게 하려면 구성을 클릭하고 현재 클라이언트 IP 주소에서 IP 주소를 선택하고 IP 주소 시작끝 IP 주소 텍스트 상자에 붙여넣고 add-client-ip-address-ok-button 단추를 클릭합니다.

    클라이언트 IP 주소 추가

    클라이언트 IP 주소 추가

  3. 클라이언트 IP 주소가 허용된 IP 주소 목록에 추가되면 저장을 클릭하여 변경 내용을 확인합니다.

    변경 내용 확인

    변경 내용 확인

작업 3 - 웹 배포를 사용하여 ASP.NET MVC 4 애플리케이션 게시

  1. ASP.NET MVC 4 솔루션에 돌아가기. 솔루션 탐색기 웹 사이트 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.

    애플리케이션 게시 애플리케이션 게시

    웹 사이트 게시

  2. 첫 번째 작업에 저장한 게시 프로필을 가져옵니다.

    게시 프로필 가져오기 게시

    게시 프로필 가져오기

  3. 연결 유효성 검사를 클릭합니다. 유효성 검사가 완료되면 다음을 클릭합니다.

    참고

    연결 유효성 검사 단추 옆에 녹색 확인 표시가 표시되면 유효성 검사가 완료됩니다.

    연결 유효성 검사 연결

    연결 유효성 검사

  4. 설정 페이지의 데이터베이스 섹션에서 데이터베이스 연결의 텍스트 상자 옆에 있는 단추를 클릭합니다(예: DefaultConnection).

    웹 배포 구성

    웹 배포 구성

  5. 다음과 같이 데이터베이스 연결을 구성합니다.

    • 서버 이름tcp: 접두사를 사용하여 SQL Database 서버 URL을 입력합니다.

    • 사용자 이름에 서버 관리자 로그인 이름을 입력합니다.

    • 암호에 서버 관리자 로그인 암호를 입력합니다.

    • 새 데이터베이스 이름을 입력합니다.

      대상 연결 문자열 구성

      대상 연결 문자열 구성

  6. 그런 후 OK를 클릭합니다. 데이터베이스를 만들라는 메시지가 표시되면 예를 클릭합니다.

    데이터베이스 만들기

    데이터베이스 만들기

  7. Windows Azure에서 SQL Database 연결하는 데 사용할 연결 문자열이 기본 연결 텍스트 상자에 표시됩니다. 그런 후 Next 를 클릭합니다.

    SQL Database

    SQL Database 가리키는 연결 문자열

  8. 미리 보기 페이지에서 게시를 클릭합니다.

    웹 애플리케이션 게시 웹

    웹 애플리케이션 게시

  9. 게시 프로세스가 완료되면 기본 브라우저가 게시된 웹 사이트를 엽니다.

부록 C: 코드 조각 사용

코드 조각을 사용하면 필요한 모든 코드를 손쉽게 사용할 수 있습니다. 랩 문서에서는 다음 그림과 같이 언제 사용할 수 있는지 정확히 알려줍니다.

Visual Studio 코드 조각을 사용하여 프로젝트에 코드 삽입

Visual Studio 코드 조각을 사용하여 프로젝트에 코드 삽입

키보드를 사용하여 코드 조각을 추가하려면(C#만 해당)

  1. 코드를 삽입할 위치에 커서를 놓습니다.
  2. 공백이나 하이픈 없이 코드 조각 이름을 입력하기 시작합니다.
  3. IntelliSense가 일치하는 코드 조각의 이름을 표시하는지 확인합니다.
  4. 올바른 코드 조각을 선택하거나 전체 코드 조각의 이름이 선택될 때까지 계속 입력합니다.
  5. Tab 키를 두 번 눌러 커서 위치에 코드 조각을 삽입합니다.

코드 조각 이름 입력 시작 코드 조각

코드 조각 이름 입력 시작

Tab 키를 눌러 강조 표시된 코드 조각을 선택.

Tab 키를 눌러 강조 표시된 코드 조각을 선택합니다.

Tab 키를 다시 누르면 코드 조각이.

Tab 키를 다시 누르면 코드 조각이 확장됩니다.

마우스를 사용하여 코드 조각을 추가하려면(C#, Visual Basic 및 XML) 1. 코드 조각을 삽입할 위치를 마우스 오른쪽 단추로 클릭합니다.

  1. 코드 조각 삽입내 코드 조각을 차례로 선택합니다.
  2. 목록에서 관련 조각을 클릭하여 선택합니다.

코드 조각을 삽입할 위치를 마우스 오른쪽 단추로 클릭하고 코드 조각 삽입을 선택하고 코드 조각 삽입을 선택합니다.

코드 조각을 삽입할 위치를 마우스 오른쪽 단추로 클릭하고 코드 조각 삽입을 선택합니다.

목록에서 관련 코드 조각을 클릭하여 목록에서 관련 코드 조각 선택합니다.

목록에서 관련 코드 조각을 클릭하여 선택합니다.