공부/인프런 - Rookiss

Part 6-7-1. WebAPI와 REST 서비스 : WebApi #1

셩잇님 2024. 10. 11. 15:06
반응형

 

 

🌀 WebAPI와 REST 서비스

 

 지난 시간까지 Blazor를 통해 미니 프로젝트인 RankingApp를 만들어보며 Entity Framework와 DB 그리고 CRUD를 통해서 실습을 진행해보았다. 이번 시간에서는 Blazor가 아닌 WebApi와 REST 서비스를 통해 Blazor와 WebApi 연동, 더 나아가 Unity와 WebApi를 연동하는 시간을 가져보도록 한다.

 


 

🐊 WebApi #1

 

 Blazor는 C#을 통해 클라이언트 단도 만들 수 있기 때문에 굉장히 유용하다. 그렇지만 블레이저는 HTML 형식을 보낸 다음에 이를 SPA 방식을 통해 필요한 부분만 받아 갱신하는 것이 핵심이었다.

 

 하지만 우리는 Unity를 통해 웹 서버와 연동을 필요로 한다. 따라서 지금까지 해왔던 블레이저와 HTML을 통해 만든 웹 페이지는 필요하지 않게된다. 즉 우리가 유니티랑 웹 서버를 연동할 때에는 HTML 형태로 UI를 다 만들어서 연동할 필요가 없는 것이다. 웹 서버에서 '데이터' 자체만 넘겨받아주고, 이를 Unity에 뿌려주기만 하면 되는 것이다. 따라서 이번 시간 부터는 Blazor를 잠시 끄고 새로운 프로젝트를 만들어 진행할 것이다.

 

 Asp.Net Core Web App으로 만들어 줄 것이다. VS 2019 버전에서는 다음과 같이 나타나지만, 2022 버전에서는 아래와 같이 나타난다.

 

VS 2019 / VS 2022

 

 위와 같이 Core Web App으로 만들어주고, 인증은 별도로 설정하지 않는다. 이 후 RankingApp 프로젝트에 있는 GameResult를 사용할 것인데 해당 스크립트는 공용으로 관리하기 때문에 양 프로젝트에서 모두 만드는 것이 아니라, 공용 데이터 관리용 프로젝트를 만들어 줄 것이다. 마찬가지로 2019 버전은 다음과 같이 나타나지만, 2022 버전에서는 다음과 같이 나타나는 것을 명심한다.

 

VS 2019 / VS 2022

 

 프로젝트 명은 SharedData로 설정하고, Models 폴더를 만들어 준 다음 GameResult.cs 를 만들어 RankingApp에서 데이터를 가져와 그대로 사용해주도록 하자.

 

 이 후 WebApi 프로젝트에서 SharedData를 참조하기 위해 프로젝트 우클릭 - 추가 - 프로젝트 참조를 눌러 SharedData 체크박스를 선택하여 이를 참조하도록 설정해준다.

 

 

 이제 DB와의 연결을 위해 연동을 처리해야 한다. DB는 DbContext를 사용하였는데 마찬가지로 WebApi 프로젝트 내부에도 이를 만들어주어야 한다. WebApi 프로젝트에 Data 폴더를 만들어주고, 해당 폴더 밑으로 ApplicationDbContext 스크립트를 만들어 준다. 

 

 이 때 DbContext를 참조해야하는데 정상적으로 참조가 되지 않는 것을 볼 수 있다.

 

using Microsoft.EntityFrameworkCore;
using SharedData.Models;

namespace WebApi.Data
{
    public class ApplicationDbContext : DbContext // DbContext 참조 문제!
    {
    
    }
}

 

 따라서 잠재적 수정사항 표시에서 EntityFrameworkCore 설치를 클릭하여 설치해주도록 하자. 이는 프로젝트 우클릭 Nuget 패키지 관리를 통해서도 진입할 수 있다. EntityFrameworkCore를 검색하여 최신 버전을 설치하지 말고 6.0 버전으로 설치하여 버전을 관리하도록 하자. 최신 버전을 설치하니까 문제가 생겨서, 6.0 버전을 설치하니 정상적으로 작동하였다.

 

 설치 이후 using을 통해 Microsoft.EntityFrameworkCore를 할당하고, 생성자를 만들어주도록 하자.

 

using Microsoft.EntityFrameworkCore;
using SharedData.Models;

namespace WebApi.Data
{
    public class ApplicationDbContext : DbContext
    {
        public DbSet<GameResult> GameResults { get; set; }

        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
                
        }
    }
}

 

 이 후, DbSet을 통해 GameResult를 연동하고 이를 사용하기 위해 SharedData.Models를 마찬가지로 using을 통해 사용하자. 다음으로 이제 마이그레이션을 진행하도록 하자.

 


 

 

먼저 WebApi를 시작 프로그램으로 설정해주고, 패키지 관리자 콘솔에서도 기본 프로젝트를 RankingApp에서 WebApi로 바꿔주도록 하자. 이 후 add-migration RankingApp를 입력하여 마이그레이션을 진행하자.

 

 

 다음과 같은 에러를 내뿜는데, 잘 읽어보면 Microsoft.EntityFrameworkCore.Design이 없다고 불평을 한다. 마찬가지로 Nuget 관리자에서 Microsoft.EntityFrameworkCore.Design를 설치해주도록 한다. 이 떄도 혹시 모르니 버전을 6.0으로 설정하여 맞춰주도록 하자.

 

 이 후 다시 add-migration RankingApp 명령어를 입력하자.

 

 

 또 에러를 내뿜는다. 자세히 읽어보면 ApplicationDbContext가 문제라고 나타내는데, 어리둥절하다. 왜냐하면 이미 넣어주었기 때문이다. 하지만 이는 파일만 가져왔을 뿐 실제로 Program에서 이를 설정해주지 않아서 생긴 문제다. 따라서 Program.cs로 돌아가 ApplicationDbContext 서비스를 사용하겠다고 명시해줘야 한다. 해당 스크립트로 이동하자. 

 

 .NET Core 최신 버전은 더 이상 Startup.cs가 사용되지 않아 Program.cs에서 서비스 등록과 미들웨어 구성을 모두 처리한다. 따라서 강의는 VS 2019로 진행되어서, 현재 2022 버전과 달라 이를 어떻게 처리해야 하지? 하다가 GPT를 통해 해당 내용을 물어보고 처리했다. 2022 버전에서는 다음과 같이 처리해야 한다.

 

using Microsoft.EntityFrameworkCore;
using WebApi.Data;

var builder = WebApplication.CreateBuilder(args);

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

// .NET Core 최신버전용 AddDbContext 방법.
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); 

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/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.MapRazorPages();
app.Run();

 

 이제, 진행이 될까? 싶으면 바로 useSqlServer가 빨간줄이 뜨면서 진행되지 않는다. 마찬가지로 Nuget 패키지 관리자로 돌아가 이번에는 Microsoft.EntityFrameworkCore.SqlServer를 설치해주도록 하자. 위와 동일하게 혹시 모르니 버전은 6.0으로 설정해주도록 하자.

 

SqlServer를 설치하면 빨간줄도 사라졌겠다. 이제 다시한번 마이그레이션을 진행해보도록 하자.

 

 

 또 에러가 발생했다. 해당 에러를 살펴보니 파라미터 connectionString이 잘못되었다고 나타내는 것 같다. 생각해보니 appSetting.json에서 DB 주소를 적지 않아서 생긴 것 같다. 따라서 RankingApp에서 사용했던 appSetting 파일로 돌아가 이를 복사해오자.

 

{
  "ConnectionStrings": {
    "DefaultConnection": "/*Address*/"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

 

 이제, 다시 마이그레이션을 진행해보자.

 

 

 이제, 진짜 마이그레이션이 처리되었다. WebApi 프로젝트 내 Migration 폴더가 생긴 것 또한 볼 수 있다. 이제 해당 데이터를 업데이트 하기위해 패키지 관리자 콘솔에 마지막으로 update-database를 입력하여 데이터를 업데이트 해주도록 하자.

 

 

 정상적으로 모두 업데이트 되었다. SQL Server 개체 탐색기로 돌아가 DB를 새로고침 해주어 RankingApiDB가 있는지 확인하자. 🤯

 

 

반응형