.NET 개발을 하다 보면 코드 한 줄을 수정할 때마다 애플리케이션을 다시 빌드하고 재실행하는 과정이 반복됩니다. 작은 UI 수정이나 로직 변경을 확인하기 위해 매번 앱을 다시 시작해야 한다면 개발 속도가 크게 떨어질 수 있습니다.
이때 사용할 수 있는 기능이 Hot Reload입니다. Hot Reload는 실행 중인 .NET 애플리케이션에 코드 변경 사항을 적용해, 가능한 경우 앱을 재시작하지 않고 수정 결과를 확인할 수 있게 해주는 기능입니다.
다만 모든 변경이 Hot Reload로 반영되는 것은 아닙니다. 특히 VS Code, Visual Studio, WPF, XAML, C# 코드 변경, dotnet watch는 지원 범위가 서로 다르기 때문에 구분해서 이해해야 합니다.
이 글에서는 다음 내용을 기준으로 정리합니다.
- VS Code에서 .NET Hot Reload를 사용하는 방법
dotnet watch를 이용한 Hot Reload 실행 방법- WPF .NET 8 기준 Hot Reload 가능 항목
- Hot Reload로 적용하기 어려운 변경
- .NET 9와 .NET 10에서 달라진 Hot Reload 관련 항목
- WPF 개발 시 권장 워크플로
Hot Reload란?
Hot Reload는 실행 중인 애플리케이션에 코드 변경 사항을 적용하는 기능입니다.
지원되는 변경이라면 앱을 다시 시작하지 않고 수정 내용이 반영됩니다. 반대로 지원되지 않는 변경, 즉 이른바 Rude Edit이 발생하면 앱을 재시작해야 변경 사항을 확인할 수 있습니다.
대표적으로 다음과 같은 상황에서 유용합니다.
- 메서드 내부 로직을 조금씩 수정하면서 결과 확인
- 버튼 클릭 이벤트 처리 로직 수정
- 조건문, 계산식, 문자열 출력 내용 변경
- 일부 속성, 메서드, 생성자 추가
- 디버깅 중 코드 흐름을 유지한 채 빠르게 수정 사항 적용
예를 들어 다음과 같은 이벤트 핸들러가 있다고 가정해보겠습니다.
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
StatusText.Text = "저장되었습니다.";
}이 코드를 다음처럼 수정하는 경우는 Hot Reload에 적합합니다.
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
StatusText.Text = $"저장 완료: {DateTime.Now:HH:mm:ss}";
}앱을 완전히 재시작하지 않아도, 해당 이벤트가 다시 실행될 때 변경된 코드가 반영될 수 있습니다.
VS Code에서 Hot Reload를 사용하는 방법
VS Code에서 .NET Hot Reload를 사용하는 방법은 크게 세 가지로 나눌 수 있습니다.
- C# Dev Kit 디버깅 환경에서 Hot Reload 사용
- 터미널에서
dotnet watch사용 - VS Code Task로
dotnet watch실행
방법 1. VS Code 디버깅 중 Hot Reload 사용
VS Code에서 C# Dev Kit을 사용하면 디버깅 중 C# 코드 변경 사항을 Hot Reload로 적용할 수 있습니다.
기본 흐름은 다음과 같습니다.
- VS Code에 C# Dev Kit 확장 설치
- 프로젝트 열기
.cs파일을 연 상태에서F5로 디버깅 시작- 코드 수정
- Hot Reload 버튼 또는 단축키로 변경 사항 적용
Hot Reload 적용 단축키는 다음과 같습니다.
Ctrl + Shift + Enter파일 저장 시 자동으로 Hot Reload를 적용하고 싶다면 VS Code 설정에서 다음 옵션을 사용할 수 있습니다.
{
"csharp.experimental.debug.hotReload": true,
"csharp.debug.hotReloadOnSave": true
}주의할 점은 VS Code의 Hot Reload가 Visual Studio의 Hot Reload 경험과 완전히 동일하지 않다는 점입니다.
VS Code에서는 주로 C# 코드 변경 적용 중심으로 이해하는 것이 안전합니다. WPF의 XAML UI 변경을 실행 중 즉시 반영하는 경험은 Visual Studio 쪽이 더 안정적입니다.
방법 2. 터미널에서 dotnet watch 사용
가장 간단한 방법은 터미널에서 dotnet watch를 실행하는 것입니다.
dotnet watch run특정 프로젝트 파일을 지정하려면 다음과 같이 실행합니다.
dotnet watch run --project PDFSplitterforCopilot.csproj또는 다음처럼 run을 생략해도 기본적으로 실행됩니다.
dotnet watch --project PDFSplitterforCopilot.csprojdotnet watch는 파일 변경을 감지한 뒤, 가능한 경우 Hot Reload를 적용합니다. 변경 사항이 Hot Reload로 적용할 수 없는 종류라면 앱을 다시 시작합니다.
실행 중 강제로 다시 빌드하고 재시작하고 싶다면 터미널에서 다음 키를 누르면 됩니다.
Ctrl + R방법 3. VS Code Task로 dotnet watch 실행하기
자주 사용하는 프로젝트라면 VS Code Task로 등록해두면 편리합니다.
.vscode/tasks.json 파일을 만들고 다음처럼 작성합니다.
{
"version": "2.0.0",
"tasks": [
{
"label": "watch",
"type": "shell",
"command": "dotnet watch run --project PDFSplitterforCopilot.csproj",
"problemMatcher": "$msCompile",
"group": {
"kind": "build",
"isDefault": true
}
}
]
}이후 VS Code에서 다음 순서로 실행할 수 있습니다.
Ctrl + Shift + P
→ Tasks: Run Task
→ watch 선택이 방식은 디버거 중심의 Hot Reload라기보다는 dotnet watch를 VS Code 작업으로 편하게 실행하는 방식입니다.
Hot Reload로 가능한 것들
.NET 8 기준으로 Hot Reload는 예전보다 지원 범위가 넓어졌습니다. 일반적으로 다음과 같은 변경은 Hot Reload로 적용될 가능성이 높습니다.
1. 메서드 본문 변경
가장 안정적으로 지원되는 변경입니다.
예를 들어 다음과 같은 수정은 Hot Reload에 적합합니다.
private int Add(int a, int b)
{
return a + b;
}위 코드를 다음처럼 바꾸는 경우입니다.
private int Add(int a, int b)
{
Console.WriteLine($"Add: {a}, {b}");
return a + b;
}메서드 내부의 조건문, 반복문, 계산식, 로그 출력, 문자열 변경 등은 대부분 Hot Reload와 잘 맞습니다.
2. 이벤트 핸들러 내부 로직 변경
WPF나 WinForms 같은 데스크톱 앱에서 버튼 클릭 이벤트의 내부 로직을 수정하는 경우도 Hot Reload에 적합합니다.
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
StatusText.Text = "저장되었습니다.";
}예를 들어 메시지 문구를 수정하거나, 내부 검증 로직을 추가하는 정도는 재시작 없이 반영될 수 있습니다.
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(FileNameTextBox.Text))
{
StatusText.Text = "파일명을 입력하세요.";
return;
}
StatusText.Text = "저장되었습니다.";
}3. 메서드, 속성, 필드 추가
최신 .NET Hot Reload는 단순한 메서드 본문 수정뿐 아니라 일부 타입 구성 요소 추가도 지원합니다.
예를 들어 기존 클래스에 새 메서드를 추가하는 경우입니다.
public string GetDisplayName()
{
return $"{FirstName} {LastName}";
}또는 속성이나 필드를 추가하는 경우도 환경에 따라 Hot Reload로 적용될 수 있습니다.
public DateTime UpdatedAt { get; set; }다만 새로 추가한 멤버가 기존 실행 흐름에서 즉시 사용되려면 해당 코드 경로가 다시 실행되어야 합니다.
예를 들어 새 메서드를 추가한 뒤 버튼 이벤트에서 호출하도록 수정했다면, 버튼을 다시 클릭해야 변경된 흐름을 확인할 수 있습니다.
4. 생성자 추가 또는 일부 생성자 수정
일부 생성자 추가도 지원될 수 있습니다.
public UserService(ILogger<UserService> logger)
{
_logger = logger;
}하지만 이미 실행 중인 객체의 생성 흐름과 관련된 변경은 즉시 반영되지 않을 수 있습니다. 기존 객체는 이미 생성되어 있기 때문에, 새 생성자 로직을 확인하려면 객체를 다시 생성하거나 앱을 재시작해야 할 수 있습니다.
특히 WPF 앱에서 ViewModel이 앱 시작 시 한 번만 생성되는 구조라면, 생성자 내부 로직을 바꿔도 이미 생성된 ViewModel에는 적용되지 않을 수 있습니다.
5. 일부 제네릭 코드 수정
.NET 8 이후에는 제네릭 관련 Hot Reload 지원이 개선되었습니다.
예를 들어 제네릭 메서드 내부 구현을 수정하거나, 일부 제네릭 메서드를 추가하는 작업이 이전보다 더 잘 지원됩니다.
public static T Echo<T>(T value)
{
return value;
}다만 제네릭 타입 구조 자체를 크게 바꾸는 변경은 여전히 재시작이 필요할 수 있습니다.
WPF에서 XAML Hot Reload는 어떻게 봐야 할까?
WPF 개발에서 가장 헷갈리는 부분이 XAML Hot Reload입니다.
정리하면 다음과 같습니다.
| 환경 | XAML Hot Reload |
|---|---|
| Visual Studio | WPF XAML Hot Reload 공식 지원 |
| VS Code + C# Dev Kit | Visual Studio와 동일한 WPF XAML Hot Reload 경험을 기대하기 어려움 |
| VS Code + dotnet watch | 변경 감지 후 재빌드 또는 재시작 중심으로 확인하는 방식이 더 현실적 |
Visual Studio에서는 WPF 앱을 디버깅하면서 XAML 레이아웃, 스타일, 리소스 등을 수정하고 실행 중인 UI에서 확인하는 워크플로가 잘 지원됩니다.
반면 VS Code에서는 C# 코드 Hot Reload와 dotnet watch 중심으로 접근하는 것이 안전합니다. WPF XAML을 자주 수정하고 즉시 UI 반영을 확인해야 한다면 Visual Studio 사용이 더 적합합니다.
Hot Reload로 불가능하거나 재시작이 필요한 것들
Hot Reload는 강력하지만 만능은 아닙니다. 다음과 같은 변경은 재시작이 필요할 가능성이 높습니다.
1. 인터페이스 구조 변경
인터페이스에 메서드나 속성을 추가하거나 시그니처를 바꾸는 작업은 실행 중인 코드에 즉시 반영하기 어렵습니다.
public interface IUserService
{
User GetUser(int id);
}위 인터페이스를 다음처럼 바꾸는 경우입니다.
public interface IUserService
{
User GetUser(int id);
void SaveUser(User user);
}이런 변경은 구현 클래스, DI 등록, 호출부에 영향을 주기 때문에 재시작이 필요할 수 있습니다.
2. 메서드 시그니처 변경
기존 메서드의 매개변수, 반환 타입, 제네릭 타입 매개변수 등을 바꾸는 작업은 Hot Reload에서 제한될 수 있습니다.
public User GetUser(int id)위 코드를 다음처럼 바꾸는 경우입니다.
public User GetUser(string email)단순히 메서드 내부 구현을 바꾸는 것과 달리, 시그니처 변경은 호출하는 쪽의 컴파일 구조까지 바꾸기 때문에 재시작이 필요할 수 있습니다.
3. 기본 클래스 또는 상속 구조 변경
클래스의 상속 구조를 변경하는 것도 Hot Reload에 적합하지 않습니다.
public class MainViewModel
{
}위 코드를 다음처럼 바꾸는 경우입니다.
public class MainViewModel : ObservableObject
{
}이런 변경은 타입의 메타데이터 구조 자체를 바꾸기 때문에 재시작이 필요할 수 있습니다.
4. 멤버 삭제 또는 이름 변경
새 멤버를 추가하는 것은 일부 지원될 수 있지만, 기존 멤버를 삭제하거나 이름을 바꾸는 작업은 Hot Reload에 적합하지 않을 수 있습니다.
public string UserName { get; set; }위 속성을 다음처럼 이름 변경하는 경우입니다.
public string DisplayName { get; set; }이 경우 기존 바인딩, 호출부, 직렬화 코드, ViewModel 참조 등에 영향을 줄 수 있으므로 앱 재시작이 필요할 수 있습니다.
5. NuGet 패키지 추가 또는 제거
NuGet 패키지를 추가하거나 제거하면 프로젝트 복원, 빌드, 참조 구조가 바뀝니다.
dotnet add package CommunityToolkit.Mvvm이런 변경은 Hot Reload 대상이 아닙니다. 패키지를 추가한 뒤에는 프로젝트를 다시 빌드하고 앱을 재시작하는 것이 안전합니다.
6. 프로젝트 파일 변경
.csproj 파일을 수정하는 경우도 재시작이 필요합니다.
예를 들어 다음과 같은 변경입니다.
<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
</ItemGroup>또는 타깃 프레임워크를 바꾸는 경우입니다.
<TargetFramework>net8.0-windows</TargetFramework>프로젝트 파일 변경은 빌드 구조 자체를 바꾸므로 Hot Reload보다는 재빌드와 재시작이 필요합니다.
Rude Edit이란?
Hot Reload로 적용할 수 없는 변경을 일반적으로 Rude Edit이라고 부릅니다.
dotnet watch 실행 중 Rude Edit이 발생하면 다음과 같은 선택지가 표시될 수 있습니다.
Do you want to restart your app?
Yes / No / Always / Never각 선택의 의미는 다음과 같습니다.
| 선택 | 의미 |
|---|---|
| Yes | 이번 변경에 대해 앱 재시작 |
| No | 재시작하지 않고 기존 앱 계속 실행 |
| Always | 이후에도 필요하면 자동 재시작 |
| Never | 이후 Rude Edit 발생 시에도 재시작하지 않음 |
개발 중에는 Always를 선택하면 편리하지만, 앱 상태를 유지하며 디버깅해야 하는 상황에서는 신중하게 선택하는 것이 좋습니다.
또한 자동화된 개발 환경이나 CI와 비슷한 흐름에서는 대화형 입력을 줄이기 위해 환경 변수나 옵션을 활용할 수 있습니다. 다만 일반적인 로컬 WPF 개발에서는 Rude Edit이 발생했을 때 앱을 재시작하는 방식으로 이해하면 충분합니다.
.NET 9와 .NET 10에서 Hot Reload는 무엇이 달라졌을까?
앞에서는 .NET 8 기준으로 VS Code, dotnet watch, WPF Hot Reload의 사용 방법과 한계를 정리했습니다. 그렇다면 .NET 9와 .NET 10에서는 .NET 8 대비 Hot Reload가 얼마나 달라졌을까요?
결론부터 말하면, WPF 앱의 C# Hot Reload 관점에서는 .NET 8 → .NET 9 → .NET 10으로 넘어가도 사용 방식이 크게 바뀌지는 않았습니다.
여전히 핵심은 다음과 같습니다.
dotnet watch로 실행 중인 앱에 변경 사항 적용- 지원되는 C# 코드 변경은 Hot Reload로 반영
- 지원되지 않는 변경은 Rude Edit으로 처리
- 필요한 경우 앱 재시작
- WPF XAML Hot Reload는 VS Code보다 Visual Studio에서 더 안정적으로 사용
다만 .NET 9와 .NET 10에서 dotnet watch, WebAssembly, Blazor 쪽에는 알아둘 만한 변화가 있습니다.
버전별 Hot Reload 변화 요약
| 구분 | .NET 8 | .NET 9 | .NET 10 |
|---|---|---|---|
| WPF C# Hot Reload | 지원 | 지원 | 지원 |
| WPF XAML Hot Reload | Visual Studio 중심 | Visual Studio 중심 | Visual Studio 중심 |
| VS Code + C# Dev Kit | C# 코드 Hot Reload 중심 | C# 코드 Hot Reload 중심 | C# 코드 Hot Reload 중심 |
dotnet watch |
run, build, test 중심 지원 |
구버전 대상 프로젝트 처리 방식 변경 | 감시 제외 패턴 설정 개선 |
| ASP.NET Core Hot Reload | 지원 | 지원 | 지원 |
| Blazor WebAssembly Hot Reload | 지원 | 지원 | WebAssembly Hot Reload 구성 방식 개선 |
| WebAssembly Hot Reload 설정 | 일반적으로 기본 동작 의존 | 일반적으로 기본 동작 의존 | WasmEnableHotReload 속성 추가 |
.NET 9에서 달라진 점
.NET 9에서 Hot Reload 관련으로 가장 눈에 띄는 변경은 WPF 자체보다는 dotnet watch의 구버전 프로젝트 처리 방식입니다.
1. .NET 5 이하 프로젝트에서 dotnet watch 동작 변경
.NET 8 이전에는 .NET 5 이하 프로젝트에서 dotnet watch를 실행하면 Hot Reload가 자동으로 비활성화되는 식으로 동작할 수 있었습니다.
하지만 .NET 9부터는 .NET 5 이하 프로젝트에서 Hot Reload가 켜진 상태로 dotnet watch를 실행하면 오류가 발생할 수 있습니다.
예를 들어 다음과 같은 메시지가 나올 수 있습니다.
Hot Reload based watching is only supported in .NET 6.0 or newer apps.이 경우 해결 방법은 두 가지입니다.
방법 1. Hot Reload를 끄고 실행
구버전 프로젝트를 유지해야 한다면 다음처럼 실행합니다.
dotnet watch --no-hot-reload또는 명령을 명확히 지정할 수도 있습니다.
dotnet watch run --no-hot-reload방법 2. 프로젝트 대상 프레임워크를 .NET 6 이상으로 업그레이드
가능하다면 프로젝트의 대상 프레임워크를 .NET 6 이상으로 업그레이드하는 것이 좋습니다.
WPF 프로젝트라면 예를 들어 다음처럼 지정할 수 있습니다.
<TargetFramework>net8.0-windows</TargetFramework>.NET 9를 사용할 경우 다음처럼 지정할 수 있습니다.
<TargetFramework>net9.0-windows</TargetFramework>WPF 프로젝트는 Windows 전용 기능을 사용하므로 일반적으로 -windows가 붙은 타깃 프레임워크를 사용합니다.
2. .NET 9에서 WPF Hot Reload 자체가 크게 바뀌었나?
WPF 기준으로는 .NET 9에서 “Hot Reload로 가능한 항목이 대폭 늘어났다”고 정리하기는 어렵습니다.
기본적인 C# Hot Reload 지원 범위는 여전히 다음과 같이 이해하면 됩니다.
- 메서드 본문 변경
- 이벤트 핸들러 내부 로직 변경
- 일부 메서드, 필드, 속성, 생성자 추가
- async/await 코드 일부 변경
- 람다식 일부 변경
- 제네릭 코드 일부 변경
반대로 다음 변경은 여전히 재시작이 필요할 수 있습니다.
- 인터페이스 구조 변경
- 메서드 시그니처 변경
- 기존 타입의 상속 구조 변경
- 멤버 삭제 또는 이름 변경
- 속성 또는 특성 구조 변경
- NuGet 패키지 추가 또는 제거
.csproj변경
즉, WPF 앱을 VS Code에서 개발하는 경우 .NET 9에서도 기존과 마찬가지로 C# 로직 수정은 Hot Reload로 빠르게 확인하고, 구조 변경은 재시작한다는 흐름으로 보는 것이 안전합니다.
.NET 10에서 달라진 점
.NET 10은 LTS 버전입니다. 장기 지원이 필요한 프로젝트라면 .NET 8 이후의 다음 LTS 선택지로 볼 수 있습니다.
Hot Reload 관점에서 .NET 10의 중요한 변화는 WPF 자체보다는 dotnet watch와 WebAssembly 쪽에 있습니다.
1. dotnet watch에서 감시 제외 설정을 명확히 구성 가능
dotnet watch를 사용하다 보면 앱 실행 중 생성되는 파일 때문에 불필요한 재시작이나 감시 이벤트가 발생할 수 있습니다.
예를 들어 다음과 같은 폴더가 계속 변경되는 경우입니다.
logstempoutputApp_Data- 자동 생성 파일 폴더
- 임시 다운로드 폴더
이런 파일 변경까지 dotnet watch가 감지하면 실제 코드 변경이 아닌데도 재시작이 발생할 수 있습니다.
이럴 때 프로젝트 파일에서 DefaultItemExcludes를 사용해 감시 대상에서 제외할 수 있습니다.
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);**/App_Data/**</DefaultItemExcludes>
</PropertyGroup>여러 패턴을 제외하려면 세미콜론으로 구분합니다.
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);**/App_Data/**;**/temp/**;**/*.log</DefaultItemExcludes>
</PropertyGroup>WPF 프로젝트에서는 다음처럼 응용할 수 있습니다.
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);**/logs/**;**/temp/**;**/output/**</DefaultItemExcludes>
</PropertyGroup>이 설정은 Hot Reload로 적용 가능한 코드 변경 범위를 넓혀주는 기능은 아닙니다. 대신 불필요한 파일 변경 감지를 줄여 개발 경험을 안정화하는 기능에 가깝습니다.
2. Blazor WebAssembly와 WebAssembly Hot Reload 개선
.NET 10에서는 Blazor WebAssembly 및 .NET on WebAssembly 시나리오에서 Hot Reload 구성이 개선되었습니다.
새로운 MSBuild 속성인 WasmEnableHotReload를 사용할 수 있으며, Debug 구성에서는 기본적으로 true입니다.
<PropertyGroup>
<WasmEnableHotReload>true</WasmEnableHotReload>
</PropertyGroup>Hot Reload를 끄고 싶다면 다음처럼 설정할 수 있습니다.
<PropertyGroup>
<WasmEnableHotReload>false</WasmEnableHotReload>
</PropertyGroup>이 변경은 WPF 앱에는 직접적인 영향이 없습니다. 하지만 Blazor WebAssembly, Blazor Hybrid, WebAssembly 기반 .NET 앱을 함께 다루는 개발자라면 .NET 10에서 알아두면 좋은 변경입니다.
3. .NET 10에서도 WPF Hot Reload 사용 방식은 거의 동일
WPF 개발자 관점에서 보면 .NET 10이라고 해서 VS Code에서 WPF XAML Hot Reload 경험이 Visual Studio 수준으로 바뀌었다고 보기는 어렵습니다.
여전히 다음 원칙이 유지됩니다.
C# 코드 변경 → Hot Reload 기대 가능
XAML UI 변경 → Visual Studio가 더 적합
구조 변경 → 재시작 필요.NET 10에서 WPF 프로젝트를 실행할 때도 기본 명령은 동일합니다.
dotnet watch run --project MyWpfApp.csproj타깃 프레임워크는 다음과 같이 지정할 수 있습니다.
<TargetFramework>net10.0-windows</TargetFramework>.NET 8, .NET 9, .NET 10 기준으로 정리한 Hot Reload 가능 항목
계속 가능한 것
.NET 8, .NET 9, .NET 10 모두에서 일반적으로 다음 변경은 Hot Reload에 적합합니다.
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
StatusText.Text = "저장되었습니다.";
}위 코드를 다음처럼 수정하는 경우입니다.
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
StatusText.Text = $"저장 완료: {DateTime.Now:HH:mm:ss}";
}이처럼 메서드 내부 로직, 문자열, 조건문, 계산식, 로그 출력, 이벤트 핸들러 내부 수정은 Hot Reload와 잘 맞습니다.
일부 가능한 것
다음 변경은 환경과 코드 상태에 따라 Hot Reload로 적용될 수 있습니다.
public string GetDisplayName()
{
return $"{FirstName} {LastName}";
}기존 클래스에 메서드, 필드, 속성, 생성자를 추가하는 작업은 최신 .NET에서 지원 범위가 넓어졌지만, 항상 즉시 원하는 방식으로 반영된다고 단정해서는 안 됩니다.
특히 다음과 같은 경우에는 앱 재시작이 필요할 수 있습니다.
- 이미 생성된 객체의 생성자 로직 변경
- 앱 시작 시 한 번만 실행되는 초기화 코드 변경
- DI 컨테이너 등록 구조 변경
- XAML 바인딩 구조와 연결된 속성 변경
- 기존 타입 구조에 영향을 주는 변경
여전히 재시작이 필요한 것
다음 변경은 .NET 8, .NET 9, .NET 10에서도 재시작이 필요할 가능성이 높습니다.
public interface IUserService
{
User GetUser(int id);
}위 인터페이스를 다음처럼 변경하는 경우입니다.
public interface IUserService
{
User GetUser(int id);
void SaveUser(User user);
}또는 기존 메서드 시그니처를 바꾸는 경우입니다.
public User GetUser(int id)public User GetUser(string email)이런 변경은 호출부, 타입 메타데이터, DI 구성, 컴파일 구조에 영향을 주기 때문에 Hot Reload보다는 재시작이 필요하다고 보는 것이 안전합니다.
WPF 개발자 관점에서 버전별 권장 사용법
.NET 8을 사용하는 경우
.NET 8은 LTS 버전이므로 안정적인 선택지입니다.
WPF 프로젝트에서는 다음 흐름을 권장합니다.
dotnet watch run --project MyWpfApp.csproj또는 VS Code의 C# Dev Kit 디버깅 기능을 사용합니다.
C# 로직 변경은 Hot Reload로 확인하고, XAML UI 수정이 많다면 Visual Studio를 사용하는 것이 좋습니다.
<TargetFramework>net8.0-windows</TargetFramework>.NET 9를 사용하는 경우
.NET 9는 STS 버전입니다. 최신 기능을 먼저 사용하고 싶거나, .NET 10으로 넘어가기 전 중간 단계로 사용할 수 있습니다.
.NET 9에서 WPF Hot Reload 사용 방식은 .NET 8과 거의 같습니다.
dotnet watch run --project MyWpfApp.csproj타깃 프레임워크는 다음처럼 지정할 수 있습니다.
<TargetFramework>net9.0-windows</TargetFramework>다만 .NET 5 이하 프로젝트를 dotnet watch로 실행하는 경우에는 --no-hot-reload 옵션이 필요할 수 있습니다.
dotnet watch --no-hot-reload.NET 10을 사용하는 경우
.NET 10은 LTS 버전이므로 장기 지원을 고려하는 새 프로젝트나 업그레이드 대상 프로젝트에 적합합니다.
WPF 프로젝트에서 Hot Reload 사용 방식은 여전히 다음과 같습니다.
dotnet watch run --project MyWpfApp.csproj타깃 프레임워크는 다음처럼 지정할 수 있습니다.
<TargetFramework>net10.0-windows</TargetFramework>앱 실행 중 생성되는 파일 때문에 불필요한 재시작이나 감시 이벤트가 발생한다면 .csproj에 감시 제외 패턴을 추가할 수 있습니다.
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);**/logs/**;**/temp/**;**/output/**</DefaultItemExcludes>
</PropertyGroup>VS Code + WPF 개발 시 현실적인 권장 워크플로
WPF 프로젝트를 VS Code에서 개발할 때는 Hot Reload를 다음처럼 활용하는 것이 현실적입니다.
1. C# 로직 수정 중심이라면
dotnet watch run --project MyWpfApp.csproj또는 VS Code에서 C# Dev Kit 디버깅을 사용합니다.
이 방식은 다음 코드 수정에 유용합니다.
- ViewModel 메서드 내부 수정
- 서비스 클래스 내부 로직 수정
- 버튼 클릭 이벤트 내부 수정
- 유틸리티 메서드 수정
- 조건문, 계산식, 로그 출력 변경
2. XAML UI 수정이 많다면
WPF XAML을 자주 수정하고 실행 중인 UI에서 즉시 확인해야 한다면 Visual Studio 사용을 권장합니다.
Visual Studio는 WPF XAML Hot Reload, Live Visual Tree, XAML 디자이너 등 WPF 개발에 특화된 도구를 제공합니다.
VS Code에서도 XAML 파일을 편집할 수는 있지만, Visual Studio와 같은 수준의 WPF XAML Hot Reload 경험을 기대하기는 어렵습니다.
3. VS Code Task로 반복 실행을 줄이고 싶다면
tasks.json에 dotnet watch를 등록해두면 매번 명령어를 입력하지 않아도 됩니다.
{
"label": "watch",
"type": "shell",
"command": "dotnet watch run --project MyWpfApp.csproj",
"problemMatcher": "$msCompile"
}복잡한 프로젝트라면 --project 옵션으로 실행할 프로젝트를 명확히 지정하는 것이 좋습니다.
4. 불필요한 파일 감시가 발생한다면
로그나 임시 출력 파일 때문에 dotnet watch가 자주 반응한다면 .csproj에 제외 패턴을 추가합니다.
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);**/logs/**;**/temp/**;**/output/**</DefaultItemExcludes>
</PropertyGroup>이 설정은 특히 파일 생성이 많은 데스크톱 앱, PDF 처리 앱, 이미지 변환 앱, 로그 출력이 많은 개발 환경에서 유용할 수 있습니다.
최종 정리
.NET Hot Reload는 개발 속도를 높여주는 매우 유용한 기능입니다. 하지만 지원 범위는 사용하는 도구와 프로젝트 유형에 따라 다릅니다.
핵심만 정리하면 다음과 같습니다.
dotnet watch는 변경을 감지해 Hot Reload 또는 재시작을 수행한다.- VS Code의 C# Dev Kit Hot Reload는 주로 디버깅 중 C# 코드 변경 적용에 초점이 있다.
- WPF XAML Hot Reload는 Visual Studio에서 가장 안정적으로 사용할 수 있다.
- 메서드 본문 변경, 이벤트 핸들러 로직 수정, 일부 메서드·속성·필드 추가는 Hot Reload에 적합하다.
- 인터페이스 변경, 메서드 시그니처 변경, 상속 구조 변경, NuGet 패키지 변경,
.csproj변경은 재시작이 필요할 수 있다. - Hot Reload가 적용되지 않는 변경은 Rude Edit으로 처리되며, 이 경우 앱 재시작이 필요하다.
- .NET 9에서는 .NET 5 이하 프로젝트에서
dotnet watch사용 시--no-hot-reload옵션이 필요할 수 있다. - .NET 10에서는 WebAssembly Hot Reload 구성이 개선되었고,
WasmEnableHotReload속성을 사용할 수 있다. - .NET 10에서도 WPF C# Hot Reload의 기본 사용 방식은 .NET 8과 크게 다르지 않다.
- WPF + VS Code 조합에서는 C# 수정은 Hot Reload로 확인하고, XAML UI 수정은 Visual Studio를 활용하는 방식이 가장 안정적이다.
따라서 WPF .NET 8, .NET 9, .NET 10 프로젝트를 VS Code에서 개발할 때는 다음 원칙을 유지하는 것이 좋습니다.
C# 메서드 내부 수정 → Hot Reload 기대 가능
타입 구조, 인터페이스, 시그니처, 패키지 변경 → 재시작 필요
XAML UI 수정 반복 → Visual Studio 사용 권장결론적으로, .NET 9와 .NET 10이 되면서 Hot Reload 주변 도구와 일부 플랫폼 지원은 개선되었지만, WPF 개발자가 VS Code에서 체감하는 핵심 사용 방식은 .NET 8과 거의 동일합니다. Hot Reload는 빠른 코드 수정 확인용으로 사용하고, 구조 변경이나 XAML 중심 작업은 재시작 또는 Visual Studio 활용을 전제로 개발하는 것이 가장 안정적입니다.
0 댓글