.NET 7 Blazor Server를 .NET 8로 마이그레이션하는 방법

반응형

현재 Blazor Server를 사용하여 애플리케이션을 만들고 있다.

NET 7의 샘플 앱에서 점차적으로 개선하여 만들었다.

 

2023/11/14 에 .NET 8 이 출시 되었다.

바로 Target framework를 '.NET 8'로 변경해보니, 이게 안 되었다.

이미 사내 라이브러리는 .NET 8 로 올려 놓았기 때문에 솔직히 당황스러웠다.

원인을 조사하기에는 시간이 부족해서 한동안은 .NET 7로 개발을 진행했다.

 

그리고 겨울방학이 되어서야 비로소 차분히 살펴볼 수 있었다.

 

변경 사항

.NET 8 샘플 앱에서 점차 현재의 애플리케이션에 근접하는 방식으로 조사해 나갔다.

 

 

폴더 구성

.NET 7에서는 바로 아래에 Pages 폴더와 Shared 폴더가 있었지만,

.NET 8에서는 바로 아래에 Components 폴더가 추가 되었고, 그쪽으로 Pages 폴더와 Shared 폴더가 아래로 이동했다.

 

이로 인해 네임스페이스의 변경이 필요하다.

 

 

_Host.cshtml에서 App.razor로

Pages 폴더 내 _Host.cshtml 파일이 App.razor 파일로 변경 되었다.

link 태그와 script 태그는 App.razor 파일에 기재하도록 되었다.

 

그 외에도 아래 파일 등이 변경 되었다.

 

<link rel="stylesheet" href="css/site.css" />
                                 ↓
<link rel=
"stylesheet" href="css/app.css" />

 

<script src="_framework/blazor.server.js"></script>
                               ↓
<script src=
"_framework/blazor.web.js"></script>

 

 

아이콘 open-iconic 삭제하기

Blazor 프로젝트 템플릿은 더 이상 아이콘 Open Iconic에 의존하지 않기 때문에 삭제 되었다.

이번에는 사용하지 않았기 때문에 별다른 영향은 없었다.

 

 

Program.cs 내용

Program.cs 파일의 내용도 변경 되었다.

아래는 예시이다.

 

.NET 7의 Program.cs

builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();

app.UseAntiforgery();

app.MapRazorComponents<App>()
        .AddInteractiveServerRenderMode();

 

 

.NET 8의 Program.cs

builder.Services.AddRazorComponents()
        .AddInteractiveServerComponents();

app.UseRouting();

app.UseForwardedHeaders();
app.MapBlazorHub();
app.MapFallbackToPage(
"/_Host");

 

 

렌더링 모드

NET 7에서 .NET 8로 넘어오면서 가장 중요하게 바뀐 부분이다.

 

샘플 앱에서 Counter의 내용을 Home 쪽에 추가했을 때, Counter 버튼을 클릭해도 아무것도 동작하지 않는다. 뭐가 다를까 하고 비교해보니 'rendermode InteractiveServer' 라는 항목이 없는 것을 발견했다. 이를 Home 쪽에 추가하니 Counter 버튼의 클릭 처리가 작동했다.

 

@rendermode InteractiveServer

 

 

'앱 전체에 렌더링 모드 적용하기'를 찾아 App.razor 파일에 추가했다.

 

App.razor

<Routes@rendermode="InteractiveServer" />

 

 

현재 작성 중인 애플리케이션에서는 MainLayout 컴포넌트 측(부모-자식 관계)에 데이터를 반영하기 위해 캐스케이딩을 사용하여 파라미터를 전달하는 방식을 채택하고 있었다.

 

앱 전체에 렌더링 모드를 적용하여 드디어 .NET 8에서도 작동할 수 있게 되었다.

한때는 'CascadingValue Value="this" 를 사용할 수 없어 'AddCascadingValue 메소드'로 수정해야 하는 것이 아닌가 하는 걱정을 하기도 했다.

 

 

 

마지막으로

Target framework를 .NET 8로 바꾸기만 하면 된다고 가볍게 생각했었는데, 꽤나 힘들었다.

 

Blazor는 아직 발전 중인 부분도 있지만, .NET 7에서 .NET 8의 변화가 큰 전환점이었고, 앞으로는 그렇게 변하지 않을 거라고 생각하고 싶다.

반응형