2023. 11. 27. 00:00ㆍASPNET
dotnet 8 이 출시 되었다.
https://learn.microsoft.com/ko-kr/dotnet/core/whats-new/dotnet-8
.NET 8의 새로운 기능
.NET 8에 도입된 새로운 .NET 기능에 대해 알아봅니다.
learn.microsoft.com
이번시간에는 기존 dotnet 7 으로 구성된 app 을 dotnet 8 으로 업그레이드 해보고
문제점과 해결책을 알아보겠다.
upgrade 를 위해서 우리는 이전에 사용했던 rest api template 을 이용하겠다.
https://yogingang.tistory.com/416
Rest API Template 만들기 - EP 10 (Refactoring - Features)
이제 UnitTest 를 만들었으니 기존 코드들에서 재사용 가능한 부분들을 refactoring 해보자 또한 design 적으로 수정할 부분이 있다면 이 부분들도 refactoring 해보자 UnitTest 를 만들기 전에는 이러한 수정
yogingang.tistory.com
visual studio 17.8 이상의 최신 버전을 설치 하자
Visual Studio를 다운로드해 주셔서 감사합니다. - Visual Studio
Visual Studio는 기본적으로 제공되는 Python 개발 및 데이터 과학 워크로드를 통한 Python 언어에 대한 강력한 IDE입니다. Python은 많은 무료 라이브러리가 포함된 인기가 있고 배우기 쉬운 무료 프로
visualstudio.microsoft.com
이제 기존 project 를 열고 upgrade 해보자
upgrade 하려는 project 에 마우스 오른쪽 button 을 누르고 upgrade 를 실행하면 된다.
만약 표시되지 않는다면 Extensions 메뉴를 통해서 설치 하거나
아래 링크를 활용하자
https://dotnet.microsoft.com/ko-kr/platform/upgrade-assistant
업그레이드 도우미 | .NET
.NET Framework에서 .NET으로 프로젝트를 업그레이드하세요.
dotnet.microsoft.com
완료되면 dotnet 8 으로 project 가 변경되어 있을 것이다.
크게 문제 없이 진행될 것이다.
프로젝트가 여럿 있을때는 entry project 부터 시작해서
다른 project 의 참조 의존성이 적은 결국에는 전혀 없는 project 의 순서로 진행하면 된다.
이제 nuget package 를 통해 open source 들을 사용했다면
그것들도 upgrade 해주자.
update 중에 deprecated 된 package 들이 있다면
version 을 최신으로 올리거나 권장하는 방법을 확인해서 수정해야 한다.
위 library 도 deprecated 되었는데 최신버전또한 deprecated 되었다.
삭제하고 mediatR 을 설치하자.
mediatR 을 설치했다면 Program.cs 에서 AddMediatR 을 수정해야 한다.
//builder.Services.AddMediatR(AssemblyHelper.GetAllAssemblies());
builder.Services.AddMediatR(config=>config.RegisterServicesFromAssemblies(AssemblyHelper.GetAllAssemblies().ToArray()));
자 그런데 이제 실행해보면 위에 rest api template 을 이용한 분들은 안될 가능성이 있다.
이것을 사용하지 않았더라도 ef core 와 관련된 project 를 사용하시는 분들은 오류가 발생할 수도 있다.
특히 reflection 을 이용해서 assembly 를 동적으로 loading 하는 경우 문제가 생기는 경우도 있다.
아래와 같은 오류가 날수 있다.
mediatR 에 뭔가 추가하면서 생긴 문제인것 같다.
이문제를 해결해 보자.
일단 reflection 관련 오류가 있는 것 같으니
AssemblyHelper.GetAllAssemblies() 요녀석을 수정해 보자
public static List<Assembly> GetAllAssemblies(SearchOption searchOption = SearchOption.TopDirectoryOnly)
{
var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
var assemblyFiles = Directory.GetFiles(baseDirectory
, "*.dll"
, searchOption);
var path = Directory.GetFiles(baseDirectory);
foreach (string assemblyPath in assemblyFiles)
{
try
{
var assembly = AssemblyLoadContext
.Default
.LoadFromAssemblyPath(assemblyPath);
}
catch
{
}
}
return AssemblyLoadContext.Default.Assemblies.ToList();
}
코드 상에 보면 AssemblyLoadContext.Default.LoadFromAssemblyPath 요녀석과 연관이 있는것 같다.
굳이 지금 새로운 assembly 를 load 할 필요 없으니 코드를 삭제하고 program.cs 에서 다음과 같이 수정하자.
////builder.Services.AddMediatR(AssemblyHelper.GetAllAssemblies());
//builder.Services.AddMediatR(config => config.RegisterServicesFromAssemblies(AssemblyHelper.GetAllAssemblies().ToArray()));
builder.Services.AddMediatR(config => config.RegisterServicesFromAssemblies(AssemblyLoadContext.Default.Assemblies.ToArray()));
...
builder.Services.Scan(scan => scan
.FromAssemblies(AssemblyLoadContext.Default.Assemblies.ToArray())
자 이제 실행해보자. 정상적으로 실행될 것이다.
문제는 이제 db 에 접속하지 못하는 상태가 되면 error 를 표시해야 한다.
그런데 정상적으로 error 를 표시 하지 못한다.
원래 아래와 같이 error 가 표시되어야 한다.
그런데 다음과 같은 error 가 표시된다.
아무래도 mediatR 에서 error 를 표시하는 부분에서 뭔가 오류가 있는것 같은 느낌이다.
mssql 은 정상 처리된다.
ef core 8.0 과 dotnet 8 부터 나타나는 현상이다. 그리고 mysql provider 만 유독 나타나는 현상이다.
만약 이부분이 보기 싫다면 MySql 과 ef core 를 사용하는 project 는 7.0 을 유지하도록 하자
하지만 만약 그래도 8 버전을 꼭 사용해야 하는 상황이라면 패키지를 수정하자
그리고 usemysql 을 통해 mysql 과 연결하려는 부분을 다음과 같이 수정한다.
self.AddDbContext<BaseDbContext, MySqlContext>
(options => options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString),
x => x.EnableRetryOnFailure(maxRetryCount: maxRetryCount)));
자 그럼 이제 정상 처리 될것이다.
(일단 mysql 을 oracle 이 가지고 있어서 사실 oracle 버전의 mysql ef core provider 를 사용하려고 했지만
현재 아직 정식버전이 나오지 않은 관계로 정상적으로 실행되는 버전을 이용하였다. )
pomelo 가 문제가 있는것은 아니니 8.0 에서 사용하려면 이용해도 좋을 것이다.
단... ef bundle 을 이용하여 bundle 을 만들면 --connection 을 주었을때 정상 처리 못하는 경우가 있었다... 참고하자
관련영상
'ASPNET' 카테고리의 다른 글
Dotnet Object Mapper (Automapper vs Mapster) (0) | 2024.03.04 |
---|---|
MediatR vs Wolverine (1) | 2024.02.26 |
Dotnet 8 - native aot (1) | 2024.01.01 |