개발이야기/AspNet&C#

Blazor + Efcore로 웹사이트 만들기 (2)

Roslyn 2024. 2. 6. 11:39
반응형

이제 Efcore를 설치할 차례인데, 정식 명칭은 EntityFramework Core로, 나름 Microsoft의 철학이 녹아든 ORM입니다.

초기부터 Code First, Db First 등과 같이 다양한 방법으로 DB를 제어하는 기능해왔으며, 현재는 이 Entity framework와 유사한 접근 방식을 Node.js에 TypeORM이나 Sequelize 같은 orm 들이 따라하고 있습니다.

 

Db 테이블을 하나의 Entity와 매칭하여 관리하는 것은 굉장히 큰 메리트를 제공하며, Dotnet의 linq, lambda와 함께 "아름다운 코드"를 생성하는 극한의 매력을 선사합니다.

저는 2014년도에 처음 이 Entity framework를  접했고, 당시에 java 코드가 C# 코드랑 거의 똑같다고 생각했다가, C#이 언어적으로 얼마나 세련된 언어인지를 처음 느꼈던 것 같습니다.

그럼에도 불구하고 국내 웹시장은 거의 java가 평정했으니, 언어가 세련됐다고 시장을 장악하는 건 아니란 걸 체감하게 됩니다.

 

일단 프로젝트에 Nuget을 통해 EntityFramework core를 설치해 줍니다.

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Microsoft.EntityFrameworkCore.SqlServer

 

작성일 기준 가장 최신버전은 8.0.1

 

중요한 건 프로젝트의 닷넷 SDK 버전과 EntityFramework의 버전이 동일해야 합니다.

설치할때 버전을 꼭 확인하세요.

 

닷넷 버전은 다음 명령으로 확인 가능합니다.

dotnet --info

 

설치된 SDK 버전들이 나열됩니다.

 

이제 프로젝트에서 appsettings.json 파일을 열어서 database 연결 문자열을 작성해 줍니다.

{
  "ConnectionStrings": {
    "DefaultConnection": "여기에 연결 문자열 작성"
  },
  //기존 설정값
}

 

다음으로 Entityframework의 DbContext를 상속받은 AppDbContext.cs 파일을 작성해 줍니다.

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }
}

 

이제 Program.cs 파일을 열어서 Entityframework 설정을 해줍니다.

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        builder.Services.AddDbContext<AppDbContext>(
            options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))
        );
		//기존 설정값

        app.Run();
    }
}

 

이제 연결이 되었으니, 실제 Entity를 만들어 봅시다.

회원가입을 가정해서 회원정보를 만들어 볼까요?  Member.cs 파일을 만들어 줍니다.

public class Member
{
    public long MemberIDX { get; set; } = -1;

    [Column(TypeName = "varchar(255)")]
    public string MemberID { get; set; } = string.Empty;

    [Column(TypeName = "varchar(255)")]
    public string Email { get; set; } = string.Empty;

    [Column(TypeName = "nvarchar(80)")]
    public string Name { get; set; } = string.Empty;

    [Column(TypeName = "varchar(50)")]
    public string MemberType { get; set; } = string.Empty;

    public DateTime RegistDate { get; set; } = new DateTime();

    public DateTime LastUpdate { get; set; } = new DateTime();

    [Column(TypeName = "varchar(50)")]
    public string Status { get; set; } = string.Empty;

    [Column(TypeName = "nvarchar(512)")]
    public string Bio { get; set; } = string.Empty;

    public Member()
    {
    }
}

 

일부 프로퍼티 위에 선언된 Attribute를 이용한 세부 설정은 과거 Entityframework 에서는 굉장히 적극적으로 도입되었던 방식입니다.

과거에는 Primary Key 같은 것도 모두 Attribute를 이용해 지정했지만, 현재는 Fluent API를 이용해서 설정하는 것을 권장하고 있습니다.

우리는 MemberIDX라는 프로퍼티와 매칭되는 DB Table에 컬럼을 identity(1,1)과 Primary Key로 지정하고자 합니다.

또한 RegistDate와 LastUpdate는 기본값으로 현재 날짜를 지정하는 getdate() 함수로 지정해줄려고 합니다.

이를 위해서 아까 작성한 AppDbContext.cs 파일을 열어 다음과 같이 수정해 줍니다.

 

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }

    public DbSet<Member> Members { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Member>()
            .HasKey(m => m.MemberIDX); // MemberIDX를 기본 키로 설정

        modelBuilder.Entity<Member>()
            .Property(m => m.MemberIDX)
            .ValueGeneratedOnAdd(); // identity(자동 증가) 속성 설정

        modelBuilder.Entity<Member>().Property(e => e.RegistDate)
        .HasDefaultValueSql("GETDATE()");

        // LastUpdate 속성의 기본값으로 GETDATE()를 설정
        modelBuilder.Entity<Member>().Property(e => e.LastUpdate)
            .HasDefaultValueSql("GETDATE()");
    }
}

 

DbSet<Member> 선언을 통해, 현재 Member 클래스가 Db Table과 매칭되는 엔티티 임을 알려주고, Fluent API를 통해, Primary Key와 identity 선언, 그리고 날짜 데이터에 기본값을 설정하고 있습니다.

 

이제 데이터를 핸들링하기 위해서 MembreRepository.cs 파일을 만들어 봅시다.

public class MemberRepository
{
    private readonly AppDbContext _context;

    public MemberRepository(AppDbContext context)
    {
        _context = context;
    }

    public List<Member> GetMembers()
    {
        return _context.Members.ToList();
    }
}

 

 

이제 이걸 의존성 주입을 하기 위해, Program.cs 파일을 수정합니다.

builder.Services.AddScoped<MemberRepository>();

 

이렇게 의존성 주입을 설정해 놓고, 실제 사용할 razor 파일에서 다음과 같이 사용합니다.

@page "/"
@inject MemberRepository memberRep

<p>member count : @(memberRep.GetMembers().Count())</p>

 

이제 Entityframework 에서 설정한 Db 내용을 배포하기 위해 DB 마이그레이션 파일을 작성해 줘야합니다.

콘솔에서 다음 명령을 실행합니다.

 

dotnet ef migrations add {마이그레이션명칭}

 

다음으로 해당 내용을 실제 database에 적용합니다.

dotnet ef database update

 

만약 패키지관리자콘솔에서 해당 명령을 수행하였는데, 오류가 발생하면 패키지관리자의 위치를 확인해 보세요.

프로젝트 위치가 아니라 솔루션 루트에 있을 수도 있습니다.

pwd

 

pwd명령어로 현재 위치를 확인한 뒤, 프로젝트 폴더로 이동해 주세요.

정상적으로 DB 업데이트가 되고 나면, 실행해 봅시다.

 

 

레코드가 없으니 0값이 나오면 정상적으로 연결된 겁니다.

이제 실제 DB에서 생성된 테이블을 볼까요?

 

 

 

의도한 대로 잘 생성된 것을 볼 수 있습니다.

반응형

'개발이야기 > AspNet&C#' 카테고리의 다른 글

IdentityServer 학습 #4 - Scope  (0) 2024.03.07
IdentityServer 학습 #3  (0) 2024.03.07
IdentityServer 학습 #2  (0) 2024.03.07
IdentityServer 학습 #1 - 기본셋팅  (0) 2024.03.07
Blazor + Efcore로 웹사이트 만들기 (1)  (0) 2024.02.05