.NET 9로 서비스를 돌리고 있는데 곧 지원이 끊긴다는 얘기를 들었다면, 지금이 올릴 시점입니다. 2026년 11월 10일이 지나면 .NET 9는 물론 8까지 함께 보안 패치가 끊겨, 새 취약점이 나와도 방치됩니다.
.NET을 본업으로 오래 다뤄온 입장에서 공식 문서를 .NET 10 마이그레이션에 실제로 걸리는 항목 위주로 추렸습니다. 따라가면 net10.0로 올릴 때 걸리는 7가지와 대응, C# 14로 덤으로 얻는 것까지 정리됩니다.

.NET 9·8이 같은 날 함께 끝난다
.NET 9와 .NET 8의 지원은 2026년 11월 10일에 함께 종료됩니다. 그날 이후로는 보안 패치가 나오지 않아, 새 CVE가 발견돼도 그대로 노출됩니다. 대신 그 자리를 채우는 .NET 10은 LTS(장기 지원) 버전으로, 2028년 11월 10일까지 3년간 지원됩니다. 2025년 11월에 정식 릴리스됐습니다.
판단은 단순합니다. 지금 9(또는 8)에 있다면 EOL 전에 .NET 10 마이그레이션을 끝내두는 게 안전합니다. LTS라 한 번 올려두면 3년은 패치 걱정 없이 갑니다.
올리기 전 기본 절차 — TFM·global.json·패키지
.NET 10 마이그레이션 절차 자체는 어렵지 않습니다. 지난 .NET 8에서 9로의 전환과 큰 틀은 같고, 대상 프레임워크를 net10.0로 바꾸는 게 시작입니다.
- 프로젝트 파일의 대상 프레임워크를
net10.0으로 변경
<TargetFramework>net10.0</TargetFramework>
global.json이 있으면 SDKversion을 설치한 .NET 10 SDK 버전으로 맞춤- NuGet 패키지를 10.x로 업데이트 —
dotnet package list --outdated로 오래된 것부터 확인 - 개발·호스팅·CI에 .NET 10 SDK/런타임 설치, Docker 베이스 이미지 태그 갱신
- 빌드 후 깨지는 항목 대응 (아래 7가지)
여기까지는 기계적입니다. 문제는 5번, 빌드를 눌렀을 때 새로 튀어나오는 것들입니다.
실제로 깨지는 7가지

.NET 10 마이그레이션에서 공식 가이드가 짚는, 올리면 실제로 걸리는 항목입니다. 표로 먼저 훑고, 빌드를 세우는 것과 배포에서 터지는 것만 아래에서 풀어 설명합니다.
| # | 변경 | 유형 | 대응 |
|---|---|---|---|
| 1 | PackageReference에 version 누락 시 빌드 에러(NU1015) | 동작(빌드) | version 채우기 or Central Package Management 도입 |
| 2 | System.Text.Json이 프로퍼티 이름 충돌을 검사 | 동작(직렬화) | 중복 프로퍼티 제거·JsonPropertyName 정리 |
| 3 | BackgroundService.ExecuteAsync 전체가 Task로 실행 |
동작 | 시작 시 동기 블로킹 코드 점검 |
| 4 | 기본 컨테이너 이미지 Debian → Ubuntu | 동작 | Dockerfile 베이스 OS 패키지·경로 재확인 |
| 5 | 런타임 기본 SIGTERM 핸들러 미제공 | 동작 | IHostApplicationLifetime로 종료 직접 처리 |
| 6 | dotnet restore가 간접(transitive) 패키지까지 audit |
동작 | 새 취약점 경고 대응(CI 실패 방지) |
| 7 | System.Linq.AsyncEnumerable 코어 편입 |
소스 | System.Linq.Async NuGet 제거 |
2026-07 기준. 공식 breaking-changes 문서는 계속 갱신 중이라 이 외 항목이 더 있을 수 있습니다.
빌드에서 먼저 막는 것 — version 누락과 Linq.Async
가장 먼저 빌드를 세우는 건 1번입니다. 예전엔 PackageReference에 Version이 빠져도 경고로 넘어갔는데, 이제 NU1015 에러로 빌드가 멈춥니다. Central Package Management(Directory.Packages.props)를 안 쓰면서 버전이 빠진 항목이 있으면 그것부터 채워야 합니다.
7번은 조용히 컴파일을 깨는 쪽입니다.
증상: net10.0로 올린 뒤 AsyncEnumerable 관련 타입이 중복 정의됐다는 컴파일 에러.
원인: System.Linq.AsyncEnumerable이 .NET 10 코어 라이브러리로 편입됨. 기존에 참조하던 System.Linq.Async NuGet과 같은 타입이 충돌.
해결: System.Linq.Async 패키지 참조를 제거.
처음엔 using 구문부터 뒤졌는데, 원인이 코드가 아니라 NuGet 참조라 한참 헤맸습니다. 코어로 흡수된 타입은 코드보다 참조를 먼저 의심하는 게 빠릅니다.
배포에서 터지는 것 — 컨테이너·종료 신호
4번과 5번은 빌드가 아니라 배포·운영에서 드러납니다. 기본 컨테이너 이미지가 Debian에서 Ubuntu로 바뀌어서, Dockerfile이 특정 OS 패키지나 경로를 가정했다면 그 부분을 다시 확인해야 합니다.
5번은 쿠버네티스에 올릴 때 특히 중요합니다. 런타임이 기본 SIGTERM 핸들러를 더 이상 제공하지 않아서, graceful shutdown이 필요하면 IHostApplicationLifetime 등으로 종료 처리를 직접 챙겨야 합니다. 안 그러면 파드 종료 시 처리 중이던 요청이 끊길 수 있습니다.
나머지 2·3·6번은 표의 대응대로 정리하면 됩니다. 6번은 간접 의존성 취약점까지 새로 경고를 띄워 CI가 빨간불이 될 수 있으니, 업그레이드 직후 restore 로그를 한 번 훑어두는 게 좋습니다.
C# 14로 덤으로 얻는 것
net10.0로 올리면 C# 14가 함께 따라옵니다. 문법 몇 개는 반복 코드를 눈에 띄게 줄여줍니다.
field키워드: 자동 프로퍼티에 커스텀 접근자를 붙일 때, 별도 백킹 필드 선언 없이field로 참조.extension블록: 정적 확장 멤버와 확장 프로퍼티를 한 블록에 모아 선언.- null 조건 대입:
obj?.Prop = value형태의 대입 지원. - 사용자 정의 복합 대입(
+=등)·++/--,nameof가 언바운드 제네릭(List<>) 지원,Span<T>/ReadOnlySpan<T>암시적 변환, 람다 파라미터에 타입 없이ref/in/out.
C# 13에서 들어온 기능은 C# 13 및 .NET 9 필수 기능에 정리해 뒀으니, 13을 건너뛰고 올라온 경우 같이 보면 됩니다.
함께 올라가는 것 — EF Core 10·ASP.NET Core 10·SDK
옮긴 김에 챙길 만한 것만 짧게 정리합니다.
- EF Core 10: named query filters로 엔티티 하나에 이름 붙인 필터를 여러 개 지정, LINQ 변환 개선.
- ASP.NET Core 10: Blazor WebAssembly 프리로딩, OpenAPI 문서 생성 개선, passkey 지원.
- SDK:
dotnet test가 Microsoft.Testing.Platform 기반으로,dotnet tool exec·dnx로 도구를 설치 없이 실행, 콘솔 앱도 네이티브 컨테이너 이미지 생성.
웹 앱이면 ASP.NET Core 쪽 세부 항목이 따로 있으니, 공식 90-to-100 마이그레이션 문서를 함께 보는 게 안전합니다.
Q&A — 올리기 전 자주 보는 질문 4개
Q. 꼭 지금 올려야 하나요?
A. .NET 9와 8은 2026년 11월 10일에 함께 지원 종료됩니다. 이후 보안 패치가 없어 새 CVE에 그대로 노출됩니다. LTS인 10으로 올리면 2028-11-10까지 지원되니, EOL 전에 끝내두는 쪽이 안전합니다.
Q. 한 번에 올리기 부담되면 어떻게 나눠서 하나요?
A. .NET 10 마이그레이션을 한 번에 다 고치려 하지 말고, TFM을 net10.0로 바꾼 뒤 빌드 에러부터 하나씩 잡으세요. 컴파일 에러를 먼저 처리하고, 컨테이너·종료 신호 같은 런타임 항목은 그다음에 검증합니다. 멀티 프로젝트면 라이브러리 → 실행 프로젝트 순으로 올립니다.
Q. 쓰는 패키지가 아직 net10을 지원 안 하면요?
A. 대부분의 패키지는 net10.0에서 그대로 동작합니다(하위 호환). 특정 패키지가 문제면 10.x 릴리스가 있는지 확인하고, 없으면 그것만 마지막에 올리거나 대체를 검토하세요. System.Linq.Async처럼 코어로 흡수된 건 오히려 참조를 빼야 합니다.
Q. C# 14만 먼저 쓸 수 있나요?
A. C# 14는 .NET 10 SDK로 컴파일할 때 켜집니다. TFM이 net10.0면 기본으로 활성화되고, 이전 TFM에서도 <LangVersion>을 올려 일부 문법은 쓸 수 있지만, 런타임에 의존하는 기능은 net10.0가 필요합니다.
.NET 10 마이그레이션은 위 7가지만 미리 걸러내도 빌드·배포 당일에 당황할 일이 크게 줄어듭니다. 같은 환경이면 위 순서대로 따라가도 무리 없습니다.
설치 환경: Windows 11, .NET 10 SDK
'Language > C#' 카테고리의 다른 글
| .NET 8.0에서 .NET 9.0으로의 전환: 주요 변화와 성능 이점 (0) | 2026.03.14 |
|---|---|
| 2025년, C# 개발자가 반드시 알아야 할 10가지 (0) | 2025.04.07 |
| 시니어 .NET 개발자가 전하는 17가지 핵심 팁 (1) | 2025.03.31 |
| .NET 성능 저하 안티 패턴 10가지와 해결 방법 (0) | 2025.03.15 |
| C# 13 및 .NET 9 필수 기능 소개 (0) | 2025.01.09 |
IT 기술과 개발 내용을 포스팅하는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!