본문 바로가기

백엔드/닷넷

자동 데이터베이스 생성 및 데이터 넣기

반응형

완성된 애플리케이션을 다운로드하여 실행할 때 데이터베이스 생성 없이는 프로그램이 작동하지 않을 수 있습니다. 엔티티프레임 워크에서 제공하는 데이터베이스를 자동 생성하는 기능을 보겠습니다.

애플리케이션 생성

먼저 .NET 애플리케이션을 생성합니다.

생성하기

 

.NET web-API 생성하기

개발도구 설치하기 .NET을 이용하여 웹애플리케이션을 만들기 위해서는 .NET에서 제공하는 개발도구가 필요합니다. 개발도구 다운로드는 아래 링크에서 가능합니다. .NET | Free. Cross-platform. Open Sour

jin-co.tistory.com

마이그레이션 준비

1. 패키지 설치

데이터베이스와 연결을 위한 설정을 해 줄 패키지가 필요한데요. 검색창에 누겟갤러리를 검색하여 엽니다.

NuGet: Open NuGet Gallery

▶ 설치할 패키지

패키지를 설치할 때 주의할 점은 패키지 버전이 반드시 .NET의 버전과 같아야 한다는 점입니다. 예를 들어 .NET 7의 경우 7.으로 시작하는 패키지를 다운로드하여야 합니다.

Microsoft.EntityFrameworkCore.Sqlite

Sqlite 데이터베이스 패키지로 Sqlite 사용을 가능하게 해 줍니다. 우측 체크박스를 체크하고 'Install'을 누릅니다.

Microsoft.EntityFrameworkCore.Design

코드 우선 데이터베이스 방식을 사용하기 위해서 필요한 패키지로, 우측 체크박스를 체크하고 'Install'을 누릅니다.

마이그레이션에 필요한 패키지를 설치합니다.

dotnet-ef

2. Db Context 클래스 생성

DbContext 클래스

생성된 폴더를 우클릭하여 C# 클래스를 생성합니다.

생성된 클래스 명에 아래와 같이 'DbContext'를 상속받습니다.

using Microsoft.EntityFrameworkCore;

Contructor를 추가하고 각각의 데이터가 저장될 속성을 생성합니다.

using API.Entities;
using Microsoft.EntityFrameworkCore;

namespace API.Data
{
  public class ShopContext : DbContext
  {
    public ShopContext(DbContextOptions options) : base(options)
    {
    }

    public DbSet<Item> Items { get; set; }
  }
}

3. Db Context 서비스 설정

모든 서비스의 설정은 Program.cs파일에서 가능합니다. 파일을 열고 아래와 같이 Db Context서비스를 추가합니다.

builder.Services.AddDbContext<ShopContext>(opt => {
    opt.UseSqlite("Data source=Shop.db");
});

마이그레이션

마이그래이션은 콘텍스트 파일이 위치한 폴더에서 아래 명령어를 사용하거나

dotnet ef migrations add <MigrationName> -o <path>

루트 폴더에서 아래의 명령어로 가능합니다.

dotnet ef migrations add <MigrationName> -p <contextFileProjectName> -s <APIProjectName> -o <pathToCreateMigration>

데이터베이스 생성 자동화 하기

Program.cs파일에 앱 실행 직전(app.Run();)에 아래 코드를 삽입합니다.

using var scope = app.Services.CreateScope();
var services = scope.ServiceProvider;
var context = services.GetRequiredService<ShopContext>();
try
{
  await context.Database.MigrateAsync();
}
catch (Exception ex)
{
  Console.WriteLine(ex);
}

앱 실행

API폴더로 이동하여 앱을 실행합니다.

cd <APIProjectName>
cd dotnet watch

실행이 완료되면 아래와 같이 자동으로 데이터베이스가 생성됩니다.

알아둘 점은 해당 방법은 데이터베이스를 생성하기 위해 마이그레이션을 사용하지 않기 때문에 데이터베이스 생성 후 마이그레이션 파일이 업데이트되고 다시 실행되더라도 다시 데이터베이스를 생성하지는 않습니다.

시드 데이터 생성하기

시드데이터를 파일을 넣을 폴더를 생성합니다.

생성된 폴더에 json파일을 생성하고 (실제 데이터가 있다면 생성하는 대신 해당 파일을 넣으면 됩니다)

아래와 같이 데이터를 넣습니다. 'id' 속성이 자동으로 생성되므로 해당 속성은 데이터 파일에서 생략해도 됩니다

[
  {
    "Id": 1,
    "Name": "Glasses",
    "Quantity": 2
  },
  {
    "Id": 2,
    "Name": "Hats",
    "Quantity": 2
  },
  {
    "Id": 3,
    "Name": "Boots",
    "Quantity": 2
  },
  {
    "Id": 4,
    "Name": "Gloves",
    "Quantity": 2
  }
]

시드 데이터를 주입할 콘텍스트 파일을 생성합니다.

생성된 클래스 안에 아래와 같이 static메서드(클래스의 초기화 없이 사용가능한 메서드)를 만듭니다.

public static async Task SeedAsync(ShopContext context) {	
    // 해당 테이블에 데이터가 있는지 확인
    if(!context.Items.Any())
    {
        // 데이터 파일 읽기
        var itemsData = File.ReadAllText("./Data/SeedData/items.json");
        // 아이템 배열로 변환
        var items = JsonSerializer.Deserialize<List<Item>>(itemsData);
        // 개체추적 시작
        context.Items.AddRange(items);
    }
    
    // 변화가 있을 때 저장
    if(context.ChangeTracker.HasChanges()) await context.SaveChangesAsync();
}

▶ 로컬환경

※ 데이터 파일 경로는 해당 파일을 우클릭하고 상대경로를 복사한 뒤 (주의 할 점은 경로는 항상 Program.cs를 기준으로 시작하므로 프로젝트 구조를 달리하여 데이터를 삽입하는 파일이 webapi 애플리케이션이 아닌 곳에 있더라도 Program.cs에서 경로가 시작되어야 한다는 점입니다)

아래와 같이 데이터를 불러오는 코드의 매개변수로 붙여 넣습니다.

백슬러시의 에러는 백슬러시 앞에 백슬러시를 추가하거나 아래와 같이 포워드 슬러시로 교체로 고칠 수 있습니다. 참고로, 'API/'대신 사용한 './'은 현재위치한 폴더를 의미합니다 (같은 경로).

▶ 배포환경

추후 배포를 고려한다면 위 보기 처럼 고정된 경로를 지정하는 것보다 동적경로 지정이 필요합니다.

 

.csproj 파일을 열고 아래 코드를 아이템 그룹에 추가합니다.

<None Include="Data\SeedData\**" CopyToOutputDirectory="PreserveNewest" />

데이터 시드 클래스로 이동하여 파일지정 경로를 아래와 같이 교체합니다.

var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);


Program.cs파일에 아래와 코드를 마이그래이션 코드 아래 추가합니다.

await StoreContextSeedData.SeedAsync(context);

앱 실행

API폴더로 이동하여 앱을 실행하면.

cd <APIProjectName>
cd dotnet watch

아래처럼 추가 메시지가 뜹니다.

이후 해당 테이블 우측에 '재생' 버튼을 누르면

주입된 데이터확인이 가능합니다.


※ 비주얼 스튜디오 코드 Sqlite 익스텐션 사용하기

 

비주얼 스튜디오 코드 - [익스텐션] Sqlite

'SQLite'는 비주얼 스튜디오 코드 편집기에서 데이터베이스의 정보를 보거나 조작을 가능하게 해주는 익스텐션입니다. 설치하기 익스텐션 검색창에 'sqlite'를 검색하고 설치를 누릅니다. Sqlite 사

jin-co.tistory.com

※ 데이터베이스 관계 추가하기

 

데이터베이스 관계 추가하기

엔티티프레임워크를 사용하여 테이블간에 관계를 추가 해 보겠습니다. 애플리케이션 생성 먼저 .NET 애플리케이션을 생성합니다. 생성하기 .NET web-API 생성하기 개발도구 설치하기 .NET을 이용하

jin-co.tistory.com


이상으로 자동으로 데이터베이스를 생성 및 데이터를 주입하는 방법을 알아보았습니다.

 

728x90
반응형