실시간 진행 바 - Spectre 콘솔 시리즈
Spectre.Console 라이브러리는 일반 C# 콘솔 애플리케이션을 시각적으로 매력적이고 유용한 도구로 바꾸는 데 중점을 둡니다. 이 프로그램의 가장 눈에 띄는 특징 중 하나는 애플리케이션이 작동하는 동안 업데이트되는 진행률 표시줄을 보여줄 수 있다는 점입니다. 이는 사용자에게 진행 상황을 지속적으로 알려주고 싶은 장시간 작업에 매우 유용합니다.
Tim Corey는 " 실시간 진행률 표시줄 - Spectre 콘솔 시리즈 " 비디오에서 C# Spectre 콘솔 진행률 표시줄을 단계별로 만드는 방법을 보여줍니다.
콘솔 애플리케이션 설정하기
영상 초반(0:00)에서 Tim은 Spectre.Console 콘솔 라이브러리를 소개하고 소스 코드 링크가 영상 아래에 있음을 보여줍니다. 그는 시청자들에게 이러한 활동은 하루 일과 중에 10분씩 투자할 수 있는 짧은 시간이라는 점을 상기시킵니다.
Tim은 일반적인 C# 콘솔 앱에서 작업 중입니다. 예를 들어, Program 클래스와 static void Main(string[] args) 메서드가 있는 간단한 기본 파일이라고 생각하면 됩니다. 그는 특별한 UI 프레임워크를 사용하는 것이 아니라, Spectre.Console에 대한 NuGet 패키지 참조만 사용하고 있습니다. 이는 이러한 기능을 모든 Windows 터미널 또는 콘솔 호스트에 도입할 수 있다는 점을 다시 한번 상기시켜 주는 좋은 예입니다.
진행 상황 컨텍스트 생성
0시 34분에 팀이 코딩을 시작합니다. 그는 Main 메서드에서 AnsiConsole.Progress()를 호출한 다음 해당 진행률에 대해 .Start()를 호출합니다. 이는 Spectre.Console에서 진행률 표시줄의 표준 진입점입니다.
그는 컨텍스트 매개변수를 사용하여 람다를 전달하는 방법을 보여주는데, 이는 나중에 비동기적으로 만들 때 비동기 ctx로 생각할 수 있습니다. 이러한 맥락 안에서 여러분은 자신의 작업을 정의합니다. 이는 Spectre.Console에서 업데이트를 시작하기 전에 진행 상황 작업을 설정하는 것과 같은 역할을 합니다.
진행 상황 작업 추가
팀은 세 가지 진행 과제를 생성합니다.
"데이터 다운로드 중"
"애플리케이션 설치"
- "데이터 정리"
각각은 var task = context.AddTask("…")를 사용하여 추가됩니다. 이러한 반환 작업 핸들은 나중에 증가시킬 수 있습니다. Tim은 (1:22) Spectre.Console이 다양한 스타일, 열 및 레이아웃을 지원한다는 점을 언급했습니다. 예를 들어 새 ProgressBarColumn, 새 PercentageColumn, 새 SpinnerColumn 또는 새 TaskDescriptionColumn을 추가하여 막대 모양을 사용자 지정할 수 있습니다.
그는 이러한 작업을 Visual Studio의 설치 프로그램에 비유합니다. 다운로드, 설치, 그리고 정리하는 것입니다(1:42). 각 작업이 업데이트될 때마다 내부적으로 정수 백분율 또는 정수 값을 저장한다고 상상할 수 있습니다.
진행률 표시줄 업데이트
1시 50분에 Tim은 컨텍스트가 완료될 때까지 실행되는 while 루프를 설정합니다. 실제 C 콘솔 프로그램에서는 Main 메서드 안에 while (!context.IsFinished) 또는 while (context.IsFinished == false)와 같은 코드를 작성할 수 있습니다.
루프 내부에서 그는 Thread.Sleep(500)을 호출하여 속도를 늦춥니다(2:15). 그는 이어서 task.Increment()를 호출하는데, 이때 임의의 double 값에 최대값(2:29, 2:47)을 곱합니다. 이는 작업이 진행되는 상황을 시뮬레이션합니다.
그는 작업 1과 작업 2를 서로 다른 속도로 업데이트하고, 작업 3의 경우 작업 2의 진행률이 80%를 초과한 후에만 시작되도록 조건문(3:05)을 추가합니다. 이는 본질적으로 진행 중인 작업 간의 종속성을 제어하는 것입니다.
Tim이 foreach 루프에서 실제로 int i를 입력하는 것은 아니지만, 작업을 반복하고 각 작업에 대해 .Increment(int)를 호출하는 데 사용할 수 있다고 상상해 볼 수 있습니다. 실제 운영 환경에서는 파일을 다운로드하는 클라이언트 변수나 처리 중인 파일 이름 문자열과 같은 실제 데이터가 있을 수 있습니다. 팀은 화면에 표시할 숫자를 무작위로 선택하는 간단한 방식을 고수합니다.
진행률 표시줄 표시 및 관찰
3시 47분에 Tim은 콘솔 애플리케이션을 실행합니다. 진행률 표시줄이 겹쳐서 나타납니다. 각 막대는 마지막에 진행률을 나타내며, 완료되면 녹색으로 바뀝니다(4:01). 첫 번째 작업이 완료되면 "데이터 정리"가 시작됩니다.
4분 14초에 Tim은 커서가 콘솔 하단으로 돌아간다는 점을 지적하는데, 이는 작지만 중요한 사용성 개선 사항입니다. Spectre.Console의 진행률 표시줄은 상태를 자동으로 포맷하고 깜빡임 없이 모든 것을 제자리에 유지합니다.
Await Task를 사용하여 비동기 처리하기
4시 36분에 팀은 비동기 버전을 보여주기 위해 방향을 바꿉니다. 그는 .Start()를 .StartAsync()로 변경하고 람다에 async 표시를 합니다. 이제 컨텍스트 매개변수는 비동기 ctx처럼 동작합니다.
내부에서는 Thread.Sleep 대신 await Task.Delay(500)을 사용합니다(4:58). 이렇게 하면 대기하는 동안 제어권이 시스템에 다시 넘어갑니다. 실제 프로그램에서는 await client.DownloadAsync() 또는 await AnsiConsole.MarkupAsync()와 같이 실제 작업을 기다리면서 진행률 표시줄 옆에 상태 텍스트를 출력할 수 있습니다.
비동기 버전은 시각적으로는 완전히 동일하게 작동하지만(5:16~5:23), 최신 비동기 워크플로에 더 적합합니다. Tim은 보여주지 않았지만, 대기 중인 작업에 try/catch(Exception ex) 구문을 사용하여 예외를 처리할 수도 있습니다.

자동 지우기 및 마무리
Tim은 Spectre.Console이 기본적으로 완료된 작업을 화면에 100%로 표시해 둔다는 사실을 알아차렸습니다. 자동으로 사라지게 하려면 진행 상황을 설정한 후 .AutoClear(true)를 호출하세요(5:42). 작업이 끝나면 막대는 즉시 사라집니다(6:02).

이 기능은 진행 상황 보고서를 일시적으로만 표시하고 콘솔 출력을 복잡하게 만들고 싶지 않을 때 유용합니다. 대화형 프롬프트, 새로운 패널 표시 또는 Spectre.Console의 변수 테이블과 결합하면 동적인 대시보드 스타일의 콘솔 UI를 만들 수 있습니다.
기본을 넘어서 – 다양한 스타일과 열
마지막 몇 분 동안 Tim은 (6:11) 탐구할 것이 훨씬 더 많다고 언급합니다. 형식, 색상, 레이아웃을 변경하고 다양한 열 유형을 사용할 수 있습니다. 예를 들어, 새로운 막대 차트나 표를 추가하거나, 진행률 표시줄이 있는 새로운 패널을 결합하여 그룹화된 결과를 표시할 수 있습니다.
Spectre.Console 문서에는 새로운 ProgressColumn 구현을 혼합하거나 각 작업의 최대값을 조정하거나 공간 절약을 위해 여러 작업을 단일 막대로 접는 방법("공간 접기")이 나와 있습니다. 이 기능을 사용하면 콘솔 애플리케이션 내에서 처리 중인 횟수, 총 개수, 파일 이름, 사용자 이름 또는 암호를 보기 좋게 표시할 수 있습니다.
결론
팀은 영상 말미에서 다음과 같은 내용을 다뤘습니다.
스펙터 콘솔용 진행률 표시줄을 처음부터 새로 제작했습니다.
여러 진행 상황 작업을 정의하고 업데이트하는 방법
Thread.Sleep을 사용하여 동기적으로 실행하거나 await Task.Delay를 사용하여 비동기적으로 실행하는 방법
완료된 막대를 지우기 위해 .AutoClear(true)를 사용하는 방법
- 고급 스타일링 및 관련 문서를 보려면 어디로 가야 하나요?
이 간단한 데모는 C# 콘솔 프로그램에 전문가 수준의 진행률 표시줄을 얼마나 쉽게 추가할 수 있는지 보여줍니다. Spectre.Console의 NuGet 패키지와 몇 줄의 코드만으로 상태를 표시하고, 진행률을 보여주고, 사용자에게 앱의 현재 상황을 훨씬 명확하게 보여줄 수 있습니다.

