SQL Server 테이블 설계: 피자 스토어 케이스 스터디
피자 스토어 데이터베이스를 구축하는데 필요한 SQL Server 테이블 설계를 살펴보겠습니다. 이 아티클에서는 테이블 구조를 정의하고, 해당 구조를 이용해 Entity Framework Core(EF Core)와 ASP.NET Core MVC에 연동하는 방법을 소개하겠습니다.
SQL Server 테이블 생성 스크립트
피자 스토어 데이터베이스를 위한 테이블을 생성하는 SQL 스크립트입니다. 이 스크립트를 SQL Server에서 실행하여 필요한 테이블을 생성할 수 있습니다.
Sauces 테이블 생성
CREATE TABLE [Sauces] (
[Id] int NOT NULL IDENTITY,
[Name] nvarchar(100) NOT NULL,
[IsVegan] bit NOT NULL,
CONSTRAINT [PK_Sauces] PRIMARY KEY ([Id])
);
Toppings 테이블 생성
CREATE TABLE [Toppings] (
[Id] int NOT NULL IDENTITY,
[Name] nvarchar(100) NOT NULL,
[Calories] decimal(18,2) NOT NULL,
CONSTRAINT [PK_Toppings] PRIMARY KEY ([Id])
);
Pizzas 테이블 생성
CREATE TABLE [Pizzas] (
[Id] int NOT NULL IDENTITY,
[Name] nvarchar(100) NOT NULL,
[SauceId] int NULL,
CONSTRAINT [PK_Pizzas] PRIMARY KEY ([Id]),
CONSTRAINT [FK_Pizzas_Sauces_SauceId] FOREIGN KEY ([SauceId]) REFERENCES [Sauces] ([Id])
);
PizzaTopping 테이블 생성
CREATE TABLE [PizzaTopping] (
[PizzasId] int NOT NULL,
[ToppingsId] int NOT NULL,
CONSTRAINT [PK_PizzaTopping] PRIMARY KEY ([PizzasId], [ToppingsId]),
CONSTRAINT [FK_PizzaTopping_Pizzas_PizzasId] FOREIGN KEY ([PizzasId]) REFERENCES [Pizzas] ([Id]) ON DELETE CASCADE,
CONSTRAINT [FK_PizzaTopping_Toppings_ToppingsId] FOREIGN KEY ([ToppingsId]) REFERENCES [Toppings] ([Id]) ON DELETE CASCADE
);
이 스크립트를 SQL Server의 쿼리 창에서 실행하여 피자 스토어 데이터베이스에 필요한 테이블들을 생성할 수 있습니다.
테이블 구조 설명
1. Sauces 테이블
이 테이블은 피자에 사용되는 소스들을 저장합니다.
- Id: 소스의 고유 번호입니다. 이 필드는 자동 증가하는 기본 키로 설정됩니다.
- Name: 소스의 이름을 저장합니다.
- IsVegan: 소스가 비건인지 여부를 나타냅니다. 비트(0 또는 1) 값으로 저장됩니다.
2. Toppings 테이블
피자 토핑에 대한 정보를 저장하는 테이블입니다.
- Id: 토핑의 고유 번호입니다. 이 필드는 자동 증가하는 기본 키로 설정됩니다.
- Name: 토핑의 이름을 저장합니다.
- Calories: 해당 토핑의 칼로리를 저장합니다. 소수점 2자리까지 표현 가능합니다.
3. Pizzas 테이블
피자에 대한 정보를 저장하는 테이블입니다.
- Id: 피자의 고유 번호입니다. 이 필드는 자동 증가하는 기본 키로 설정됩니다.
- Name: 피자의 이름을 저장합니다.
- SauceId: 해당 피자에 사용된 소스의 ID입니다. Sauces 테이블과 외래 키로 연결됩니다.
4. PizzaTopping 테이블
피자와 토핑의 관계를 나타내는 연결 테이블입니다.
- PizzasId: 연결된 피자의 ID입니다.
- ToppingsId: 연결된 토핑의 ID입니다.
- 이 두 필드는 복합 기본 키로 사용됩니다. 이는 하나의 피자가 여러 토핑을 가질 수 있고, 하나의 토핑이 여러 피자에 사용될 수 있기 때문입니다.
EF Core 모델 생성
EF Core를 사용하여 데이터베이스와 연동하는 .NET 클래스를 생성합니다. 이를 위해 각 테이블에 해당하는 클래스를 정의하고, DbContext를 사용하여 이들을 연결합니다.
public class Sauce
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsVegan { get; set; }
}
public class Topping
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Calories { get; set; }
}
public class Pizza
{
public int Id { get; set; }
public string Name { get; set; }
public int? SauceId { get; set; }
public Sauce Sauce { get; set; }
public List<PizzaTopping> PizzaToppings { get; set; }
}
public class PizzaTopping
{
public int PizzasId { get; set; }
public Pizza Pizza { get; set; }
public int ToppingsId { get; set; }
public Topping Topping { get; set; }
}
public class PizzaStoreContext : DbContext
{
public DbSet<Sauce> Sauces { get; set; }
public DbSet<Topping> Toppings { get; set; }
public DbSet<Pizza> Pizzas { get; set; }
public DbSet<PizzaTopping> PizzaToppings { get; set; }
// ...
}
ASP.NET Core MVC 연동
1. 서비스 등록
Startup.cs 파일에서 ConfigureServices
메서드를 사용하여 DbContext를 서비스에 등록합니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<PizzaStoreContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("PizzaStoreConnection")));
services.AddControllersWithViews();
}
2. 컨트롤러 및 뷰 생성
피자 스토어의 기능을 구현하기 위해 컨트롤러와 뷰를 생성합니다. 컨트롤러에서는 데이터베이스와의 상호작용을 처리하며, 뷰에서는 사용자 인터페이스를 제공합니다.
public class PizzaController : Controller
{
private readonly PizzaStoreContext _context;
public PizzaController(PizzaStoreContext context)
{
_context = context;
}
// Actions (e.g., Index, Details, Create, Edit, Delete) go here
}
뷰에서는 Razor 문법을 사용하여 데이터를 표시하고 사용자 입력을 처리합니다.
이상으로, SQL Server 테이블 설계를 바탕으로 한 피자 스토어 데이터베이스 구축과 EF Core 및 ASP.NET Core MVC와의 연동 방법에 대해 알아보았습니다. 이를 통해 효율적인 웹 애플리케이션 개발을 진행할 수 있습니다.