파트 5: ASP.NET Core MVC - SQL Server LocalDB로 작업하기

등록일시: 2016-06-17 08:00,  수정일시: 2016-08-22 13:49
조회수: 8,999
이 문서는 ASP.NET Core MVC 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
이번 파트에서는 데이터베이스 컨텍스트의 구성 방식과 LocalDB에 생성된 테이블을 살펴보고, 시드 이니셜라이저를 추가해봅니다.

ApplicationDbContext 클래스는 데이터베이스의 연결, Movie 개체와 데이터베이스 레코드 간의 매핑 작업 등을 처리합니다. 이 데이터베이스 컨텍스트는 Startup.cs  파일의 ConfigureServices 메서드에서 의존성 주입(Dependency Injection) 컨테이너를 이용해서 등록됩니다:

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

이 때, ASP.NET Core Configuration 시스템이 ConnectionString을 읽어오는데, 로컬 개발 시에는 appsettings.json  파일에서 연결 문자열을 가져옵니다:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-MvcMovie-7db2893b-375e-48bd-86a3-bb9779b72ebe;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "IncludeScopes": false,

테스트 서버나 운영 서버에 응용 프로그램을 배포할 때는 환경 변수나 다른 접근방식을 이용해서, 실제 운영 SQL Server를 지정하는 연결 문자열을 설정할 수 있습니다. 더 구체적인 정보는 Configuration 문서를 참고하시기 바랍니다.

SQL Server Express LocalDB

LocalDB는 프로그램 개발에 특화된 SQL Server Express Database Engine의 경량 버전입니다. LocalDB는 필요한 시점에 요청에 의해서 구동되고(On-Demand) 사용자 모드에서 실행되므로 복잡한 구성이 필요 없습니다. 기본적으로 LocalDB 데이터베이스는 C:/Users/<user> 디렉터리에 "*.mdf" 데이터베이스 파일들을 생성합니다.

  • 보기(View) 메뉴에서 SQL Server 개체 탐색기(SQL Server Object Explorer) (SSOX)를 엽니다.

  • 그리고 마우스 오른쪽 버튼으로 Movie 테이블을 클릭한 다음, 디자이너 보기(View Designer)를 선택합니다.


디자인(Design) 탭의 ID 컬럼 옆에 표시된 열쇄 아이콘에 주의하시기 바랍니다. 기본적으로 EF Core는 ID라는 이름을 가진 속성을 기본 키로 간주합니다.

  • 마우스 오른쪽 버튼으로 Movie 테이블을 클릭한 다음, 데이터 보기(View Data)를 선택해봅니다.


데이터베이스 시드하기

계속해서 이번에는 Models  폴더에 SeedData라는 이름의 새로운 클래스를 생성합니다. 그리고 자동으로 생성된 코드를 다음 코드로 대체합니다:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new ApplicationDbContext(
                serviceProvider.GetRequiredService<DbContextOptions<ApplicationDbContext>>()))
            {
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-1-11"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

이 코드에서 데이터베이스에 이미 데이터가 존재할 경우, 시드 이니셜라이저가 그대로 반환되어 종료된다는 점에 유의하시기 바랍니다.

if (context.Movie.Any())
{
    return;   // DB has been seeded
}

이 시드 이니셜라이저를 Startup.cs  파일에 위치한 Configure 메서드의 마지막 부분에 추가합니다:

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });

    SeedData.Initialize(app.ApplicationServices);
}

응용 프로그램 테스트하기

  • 브라우저에서 delete 링크를 하나씩 클릭하거나 SSOX를 이용해서 데이터베이스에서 기존 레코드를 모두 삭제합니다.
  • 응용 프로그램을 강제로 초기화시켜서(Startup 클래스의 메서드들이 호출되도록) 시드 메서드가 실행되도록 합니다. 초기화를 강제로 수행하려면 IIS Express를 중지했다가 재시작해야 합니다. 다음 그림에 표시된 버튼을 이용해서 IIS Express를 재시작 할 수 있습니다:

노트

만약 데이터베이스가 초기화되지 않는다면, if (context.Movie.Any()) 줄에 중단점을 설정하고 디버그 모드에서 응용 프로그램을 시작해보십시오.

이제 응용 프로그램에 시드된 데이터가 반영되어 나타나는 것을 확인하실 수 있을 것입니다.