dotnet watch를 활용한 ASP.NET Core 응용 프로그램 개발

등록일시: 2016-07-29 08:00,  수정일시: 2016-08-22 13:43
조회수: 6,082
이 문서는 ASP.NET Core 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
본문에서는 ASP.NET Core 응용 프로그램을 개발하면서 dotnet watch CLI 명령을 활용하는 몇 가지 방법을 살펴봅니다.

소개

본 자습서에서 살펴볼 dotnet watch는 소스 파일이 변경될 때 dotnet 명령을 실행하는, 개발 과정에서 사용할 수 있는 도구입니다. 이 도구를 활용하면 코드가 변경될 때 컴파일을 하거나, 테스트를 수행하거나, 게시를 할 수 있습니다.

본문에서는 미리 만들어진 두 숫자의 곱과 합을 계산하는 Web API 응용 프로그램을 이용해서 dotnet watch의 사용 사례들을 살펴봅니다. 이 예제 응용 프로그램에는 본문의 한 과정으로 수정하게 될 의도적인 버그가 포함되어 있습니다.

시작하기

먼저 예제 응용 프로그램을 다운로드 받습니다. 여기에는 웹 응용 프로그램인 WebApp 프로젝트와 이 웹 응용 프로그램의 단위 테스트인 WebAppTests 프로젝트가 포함되어 있습니다.

명령 프롬프트에서 예제 응용 프로그램이 다운로드 된 폴더를 열고 다음 명령들을 수행합니다:

  1. dotnet restore
  2. cd WebApp
  3. dotnet run

역주

본 자습서의 내용을 직접 따라해보려면 명령 프롬프트에서 dotnet --version 명령을 입력했을 때 1.0.0-preview2-003121 버전이 출력되어야 합니다 (2016년 7월 현재). Preview1 버전이 설치된 상태에서는 이 명령들을 실행하면 첫 번째 명령에서부터 오류가 발생합니다. Visual Studio 2015를 사용하시는 분들은 Visual Studio 2015 Update 3.NET Core 1.0 for Visual Studio를 설치해야 합니다. 만약 .NET Core 1.0 for Visual Studio의 설치 도중 오류가 발생하면서 설치가 중단된다면, SKIP_VSU_CHECK=1 옵션을 추가해서 설치 프로그램을 실행하시면 됩니다.

그러면 응용 프로그램이 현재 실행 중이며 요청을 대기하고 있음을 의미하는 다음과 같은 콘솔 출력 메시지가 나타날 것입니다:

$ dotnet run
Project WebApp (.NETCoreApp,Version=v1.0) will be compiled because inputs were modified
Compiling WebApp for .NETCoreApp,Version=v1.0

Compilation succeeded.
  0 Warning(s)
  0 Error(s)

Time elapsed 00:00:02.6049991

Hosting environment: Production
Content root path: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

이 상태로 웹 브라우저에서 http://localhost:5000/api/math/sum?a=4&b=5 URL로 이동해보면 결과 값으로 9가 출력되는 것을 확인할 수 있습니다.

그러나 다시 http://localhost:5000/api/math/product?a=4&b=5 URL로 이동해보면 두 값을 곱한 결과 값으로 기대하고 있는 20 대신, 잘못된 값인 9가 계속 나타납니다.

이 문제점을 수정해보겠습니다.

프로젝트에 dotnet watch 추가하기

  1. WebApp/project.json 파일을 열고 tools 섹션에 다음 예제 코드와 같이 Microsoft.DotNet.Watcher.Tools 줄을 추가합니다:
"tools": {
  "Microsoft.DotNet.Watcher.Tools": "1.0.0-preview2-final"
},
  1. 그리고 dotnet restore를 실행합니다.

그러면 콘솔에 다음과 같은 메시지들이 출력될 것입니다:

log  : Restoring packages for /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp/project.json...
log  : Restoring packages for tool 'Microsoft.DotNet.Watcher.Tools' in /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp/project.json...
log  : Installing Microsoft.DotNet.Watcher.Core 1.0.0-preview2-final.
log  : Installing Microsoft.DotNet.Watcher.Tools 1.0.0-preview2-final.

dotnet watch를 이용하여 dotnet 명령 실행하기

모든 dotnet 명령은 dotnet watch를 이용해서 실행할 수 있습니다. 다음 표는 그 적용 사례를 보여줍니다:

명령 dotnet watch를 이용한 명령
dotnet run dotnet watch run
dotnet run -f net451 dotnet watch run -f net451
dotnet run -f net451 -- --arg1 dotnet watch run -f net451 -- --arg1
dotnet test dotnet watch test

dotnet watch를 이용해서 WebApp 프로젝트를 실행하려면 WebApp 폴더에서 dotnet watch run을 실행하면 됩니다. 그러면 다음과 같이 현재 dotnet watch가 코드 파일들을 감시하고 있음을 알려주는 콘솔 출력 메시지가 나타날 것입니다:

user$ dotnet watch run
[DotNetWatcher] info: Running dotnet with the following arguments: run
[DotNetWatcher] info: dotnet process id: 39746
Project WebApp (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Hosting environment: Production
Content root path: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

dotnet watch가 적용된 상태에서 코드 변경하기

이제 dotnet watch가 의도하는 대로 동작하는지 확인해보도록 하겠습니다.

그 확인을 위해서 이전 절에서 발견한, 두 숫자를 곱한 결과를 계산하는 과정에 존재하는 버그를 수정해보겠습니다.

이번에는 WebApp/Controllers/MathController.cs 파일을 엽니다.

이 파일의 코드에는 의도적인 버그가 존재합니다.

public static int Product(int a, int b)
{
    // We have an intentional bug here
    // + should be *
    return a + b; 
}

이 코드의 a + b 구문을 a * b로 변경해서 버그를 수정합니다.

그리고 파일을 저장합니다. 그러면 파일이 저장되는 순간, dotnet watch가 파일 변경을 감지해서 응용 프로그램을 재시작함을 알려주는 다음과 같은 콘솔 출력 메시지가 나타날 것입니다:

[DotNetWatcher] info: File changed: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp/Controllers/MathController.cs
[DotNetWatcher] info: Running dotnet with the following arguments: run
[DotNetWatcher] info: dotnet process id: 39940
Project WebApp (.NETCoreApp,Version=v1.0) will be compiled because inputs were modified
Compiling WebApp for .NETCoreApp,Version=v1.0
Compilation succeeded.
  0 Warning(s)
  0 Error(s)
Time elapsed 00:00:03.3312829

Hosting environment: Production
Content root path: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

이제 웹 브라우저에 다시 http://localhost:5000/api/math/product?a=4&b=5 URL을 입력해서 올바른 결과가 반환되는지 확인합니다.

dotnet watch를 이용해서 테스트 실행하기

파일 감시자(File Watcher)를 이용해서 testpublish 같은 다른 dotnet 명령들도 실행할 수 있습니다.

  1. WebAppTests 폴더를 엽니다. 이 프로젝트의 project.json 파일에는 이미 dotnet watch가 추가되어 있습니다.
  2. dotnet watch test를 실행합니다.

이전 절의 지시대로 MathController에 존재하는 버그를 수정했다면 다음과 같은 출력 메시지가 나타날 것입니다. 반면 버그가 그대로 남아있다면 실패한 테스트를 보게 될 것입니다:

WebAppTests user$ dotnet watch test
[DotNetWatcher] info: Running dotnet with the following arguments: test
[DotNetWatcher] info: dotnet process id: 40193
Project WebApp (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Project WebAppTests (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
xUnit.net .NET CLI test runner (64-bit .NET Core osx.10.11-x64)
  Discovering: WebAppTests
  Discovered:  WebAppTests
  Starting:    WebAppTests
  Finished:    WebAppTests
=== TEST EXECUTION SUMMARY ===
   WebAppTests  Total: 2, Errors: 0, Failed: 0, Skipped: 0, Time: 0.259s
SUMMARY: Total: 1 targets, Passed: 1, Failed: 0.
[DotNetWatcher] info: dotnet exit code: 0
[DotNetWatcher] info: Waiting for a file to change before restarting dotnet...

모든 테스트들이 실행되고 나면, 감시자가 dotnet test를 다시 수행해야 하는지를 알기 위해서 파일 변경 여부를 감시하고 있음을 알려줍니다.

  1. WebApp/Controllers/MathController.cs 컨트롤러 파일을 열고 일부 코드를 변경해봅니다. 아직 곱하기 버그를 수정하지 않았다면 지급 수정하면 됩니다. 그리고 다시 파일을 저장합니다.

그러면 dotnet watch가 파일 변경을 감지하고 테스트를 다시 실행합니다. 그리고 다음과 같은 콘솔 출력 메시지가 나타날 것입니다:

[DotNetWatcher] info: File changed: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp/Controllers/MathController.cs
[DotNetWatcher] info: Running dotnet with the following arguments: test
[DotNetWatcher] info: dotnet process id: 40233
Project WebApp (.NETCoreApp,Version=v1.0) will be compiled because inputs were modified
Compiling WebApp for .NETCoreApp,Version=v1.0
Compilation succeeded.
  0 Warning(s)
  0 Error(s)
Time elapsed 00:00:03.2127590
Project WebAppTests (.NETCoreApp,Version=v1.0) will be compiled because dependencies changed
Compiling WebAppTests for .NETCoreApp,Version=v1.0
Compilation succeeded.
  0 Warning(s)
  0 Error(s)
Time elapsed 00:00:02.1204052

xUnit.net .NET CLI test runner (64-bit .NET Core osx.10.11-x64)
  Discovering: WebAppTests
  Discovered:  WebAppTests
  Starting:    WebAppTests
  Finished:    WebAppTests
=== TEST EXECUTION SUMMARY ===
   WebAppTests  Total: 2, Errors: 0, Failed: 0, Skipped: 0, Time: 0.260s
SUMMARY: Total: 1 targets, Passed: 1, Failed: 0.
[DotNetWatcher] info: dotnet exit code: 0

[DotNetWatcher] info: Waiting for a file to change before restarting dotnet...