5부. ASP.NET Core MVC 앱에서 데이터베이스 작업

참고 항목

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

Important

이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

작성자: Rick AndersonJon P Smith.

MvcMovieContext 개체는 데이터베이스에 연결하고 데이터베이스 레코드에 Movie 개체를 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 Program.cs 파일에서 종속성 주입 컨테이너에 등록됩니다.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

ASP.NET Core 구성 시스템은 ConnectionString 키를 읽습니다. 로컬 개발의 경우 appsettings.json 파일에서 연결 문자열을 가져옵니다.

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

앱을 테스트 또는 프로덕션 서버에 배포할 때 환경 변수를 사용하여 연결 문자열을 프로덕션 SQL Server로 설정할 수 있습니다. 자세한 내용은 구성을 참고하시기 바랍니다.

SQL Server Express LocalDB

LocalDB:

  • Visual Studio와 함께 기본적으로 설치되는 SQL Server Express 데이터베이스 엔진 경량 버전입니다.
  • 연결 문자열을 사용하여 주문형으로 시작합니다.
  • 프로그램 개발을 목표로 합니다. 사용자 모드에서 실행되므로 복잡한 구성이 없습니다.
  • 기본적으로 C:/Users/{user} 디렉터리에 .mdf 파일을 만듭니다.

데이터베이스 검사

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

테이블(dbo.Movie) > 뷰 디자이너를 Movie 마우스 오른쪽 단추로 클릭합니다.

동영상 테이블 > 뷰 디자이너를 마우스 오른쪽 단추로 클릭합니다.

디자이너에 열린 Movie 테이블

ID 옆의 키 아이콘을 확인합니다. 기본적으로 EF는 ID라는 속성을 기본 키로 만듭니다.

마우스 오른쪽 단추로 Movie 테이블을 클릭하고 데이터 보기를 선택합니다.

동영상 테이블 > 뷰 데이터를 마우스 오른쪽 단추로 클릭합니다.

테이블 데이터를 보여 주는 열린 Movie 테이블

데이터베이스 시드

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 MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // Look for any movies.
            if (context.Movie.Any())
            {
                return;   // DB has been seeded
            }
            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    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.
}

시드 이니셜라이저 추가

Program.cs의 내용을 다음 코드로 바꿉니다. 새 코드가 강조 표시됩니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

데이터베이스의 모든 레코드를 삭제합니다. 브라우저 또는 SSOX에서 삭제 링크를 사용하여 이를 수행할 수 있습니다.

앱을 테스트합니다. 시드 메서드가 실행되도록 파일의 Program.cs 코드를 호출하여 앱을 강제로 초기화합니다. 초기화를 강제로 수행하려면 Visual Studio에 열려 있는 명령 프롬프트 창을 닫고 Ctrl + F5를 눌러 다시 시작합니다.

앱이 시드된 데이터를 보여줍니다.

영화 데이터를 표시하는 Microsoft Edge에서 열린 MVC 영화 앱

MvcMovieContext 개체는 데이터베이스에 연결하고 데이터베이스 레코드에 Movie 개체를 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 Program.cs 파일에서 종속성 주입 컨테이너에 등록됩니다.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

ASP.NET Core 구성 시스템은 ConnectionString 키를 읽습니다. 로컬 개발의 경우 appsettings.json 파일에서 연결 문자열을 가져옵니다.

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

앱을 테스트 또는 프로덕션 서버에 배포할 때 환경 변수를 사용하여 연결 문자열을 프로덕션 SQL Server로 설정할 수 있습니다. 자세한 내용은 구성을 참고하시기 바랍니다.

SQL Server Express LocalDB

LocalDB:

  • Visual Studio와 함께 기본적으로 설치되는 SQL Server Express 데이터베이스 엔진 경량 버전입니다.
  • 연결 문자열을 사용하여 주문형으로 시작합니다.
  • 프로그램 개발을 목표로 합니다. 사용자 모드에서 실행되므로 복잡한 구성이 없습니다.
  • 기본적으로 C:/Users/{user} 디렉터리에 .mdf 파일을 만듭니다.

데이터베이스 검사

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

테이블(dbo.Movie) > 뷰 디자이너를 Movie 마우스 오른쪽 단추로 클릭합니다.

동영상 테이블 > 뷰 디자이너를 마우스 오른쪽 단추로 클릭합니다.

디자이너에 열린 Movie 테이블

ID 옆의 키 아이콘을 확인합니다. 기본적으로 EF는 ID라는 속성을 기본 키로 만듭니다.

마우스 오른쪽 단추로 Movie 테이블을 클릭하고 데이터 보기를 선택합니다.

동영상 테이블 > 뷰 데이터를 마우스 오른쪽 단추로 클릭합니다.

테이블 데이터를 보여 주는 열린 Movie 테이블

데이터베이스 시드

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 MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // Look for any movies.
            if (context.Movie.Any())
            {
                return;   // DB has been seeded
            }
            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    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.
}

<a name=snippet_"si">

시드 이니셜라이저 추가

Program.cs의 내용을 다음 코드로 바꿉니다. 새 코드가 강조 표시됩니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

데이터베이스의 모든 레코드를 삭제합니다. 브라우저 또는 SSOX에서 삭제 링크를 사용하여 이를 수행할 수 있습니다.

앱을 테스트합니다. 시드 메서드가 실행되도록 파일의 Program.cs 코드를 호출하여 앱을 강제로 초기화합니다. 초기화를 강제로 수행하려면 Visual Studio에 열려 있는 명령 프롬프트 창을 닫고 Ctrl + F5를 눌러 다시 시작합니다.

앱이 시드된 데이터를 보여줍니다.

영화 데이터를 표시하는 Microsoft Edge에서 열린 MVC 영화 앱

MvcMovieContext 개체는 데이터베이스에 연결하고 데이터베이스 레코드에 Movie 개체를 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 Program.cs 파일에서 종속성 주입 컨테이너에 등록됩니다.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

ASP.NET Core 구성 시스템은 ConnectionString 키를 읽습니다. 로컬 개발의 경우 appsettings.json 파일에서 연결 문자열을 가져옵니다.

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true"
}

앱을 테스트 또는 프로덕션 서버에 배포할 때 환경 변수를 사용하여 연결 문자열을 프로덕션 SQL Server로 설정할 수 있습니다. 자세한 내용은 구성을 참고하시기 바랍니다.

SQL Server Express LocalDB

LocalDB:

  • Visual Studio와 함께 기본적으로 설치되는 SQL Server Express 데이터베이스 엔진 경량 버전입니다.
  • 연결 문자열을 사용하여 주문형으로 시작합니다.
  • 프로그램 개발을 목표로 합니다. 사용자 모드에서 실행되므로 복잡한 구성이 없습니다.
  • 기본적으로 C:/Users/{user} 디렉터리에 .mdf 파일을 만듭니다.

데이터베이스 시드

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 MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        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.
}

시드 이니셜라이저 추가

Program.cs의 내용을 다음 코드로 바꿉니다. 새 코드가 강조 표시됩니다.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

데이터베이스의 모든 레코드를 삭제합니다. 브라우저 또는 SSOX에서 삭제 링크를 사용하여 이를 수행할 수 있습니다.

앱을 테스트합니다. 시드 메서드가 실행되도록 파일의 Program.cs 코드를 호출하여 앱을 강제로 초기화합니다. 초기화를 강제로 수행하려면 Visual Studio에 열려 있는 명령 프롬프트 창을 닫고 Ctrl + F5를 눌러 다시 시작합니다.

앱이 시드된 데이터를 보여줍니다.

영화 데이터를 표시하는 Microsoft Edge에서 열린 MVC 영화 앱

MvcMovieContext 개체는 데이터베이스에 연결하고 데이터베이스 레코드에 Movie 개체를 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 Startup.cs 파일의 ConfigureServices 메서드에서 종속성 주입 컨테이너에 등록됩니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}

ASP.NET Core 구성 시스템은 ConnectionString 키를 읽습니다. 로컬 개발의 경우 appsettings.json 파일에서 연결 문자열을 가져옵니다.

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}

앱을 테스트 또는 프로덕션 서버에 배포할 때 환경 변수를 사용하여 연결 문자열을 프로덕션 SQL Server로 설정할 수 있습니다. 자세한 내용은 구성을 참고하시기 바랍니다.

SQL Server Express LocalDB

LocalDB:

  • Visual Studio와 함께 기본적으로 설치되는 SQL Server Express 데이터베이스 엔진 경량 버전입니다.
  • 연결 문자열을 사용하여 주문형으로 시작합니다.
  • 프로그램 개발을 목표로 합니다. 사용자 모드에서 실행되므로 복잡한 구성이 없습니다.
  • 기본적으로 C:/Users/{user} 디렉터리에 .mdf 파일을 만듭니다.

데이터베이스 검사

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

보기 메뉴

마우스 오른쪽 단추로 Movie 테이블을 클릭하고 디자이너 보기를 선택합니다.

동영상 테이블 > 뷰 디자이너를 마우스 오른쪽 단추로 클릭합니다.

디자이너에 열린 Movie 테이블

ID 옆의 키 아이콘을 확인합니다. 기본적으로 EF는 ID라는 속성을 기본 키로 만듭니다.

마우스 오른쪽 단추로 Movie 테이블을 클릭하고 데이터 보기를 선택합니다.

동영상 테이블 > 뷰 데이터를 마우스 오른쪽 단추로 클릭합니다.

테이블 데이터를 보여 주는 열린 Movie 테이블

데이터베이스 시드

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 MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        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.
}

시드 이니셜라이저 추가

Program.cs의 내용을 다음 코드로 바꿉니다.

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MvcMovie.Data;
using MvcMovie.Models;
using System;

namespace MvcMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    SeedData.Initialize(services);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB.");
                }
            }

            host.Run();

        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

앱을 테스트합니다.

데이터베이스의 모든 레코드를 삭제합니다. 브라우저 또는 SSOX에서 삭제 링크를 사용하여 이를 수행할 수 있습니다.

Startup 클래스에서 메서드를 호출하여 앱을 강제로 초기화하면 시드 메서드가 실행됩니다. 초기화를 적용하려면 IIS Express를 중지하고 다시 시작해야 합니다. 다음 중 한 가지 방법을 사용하여 이를 수행할 수 있습니다.

  • 알림 영역에서 IIS Express 시스템 트레이 아이콘을 마우스 오른쪽 단추로 클릭하고 종료 또는 사이트 중지를 탭합니다.

    IIS Express 시스템 트레이 아이콘

    상황별 메뉴

    • 비 디버그 모드에서 VS를 실행했다면 F5 키를 눌러 디버그 모드에서 실행합니다.
    • 디버그 모드에서 VS를 실행했던 경우 디버거를 중지하고 F5 키를 누릅니다.

앱이 시드된 데이터를 보여줍니다.

영화 데이터를 표시하는 Microsoft Edge에서 열린 MVC 영화 앱