배움을 멈추지 마세요

발행: (2026년 5월 3일 AM 08:20 GMT+9)
8 분 소요
원문: Dev.to

Source: Dev.to

Introduction

개발자는 풍부한 도구, 문서, 그리고 인공지능 덕분에 지금 같은 시기가 정말 멋진 시기입니다. 하지만 현재와 당분간은, AI 도구가 완벽하지 않고 기존 코드베이스에 통합하기 어려운 코드를 생성할 수 있기 때문에 개발자는 여전히 코드를 작성하는 법을 배워야 합니다.

  • 개발을 막 시작한 사람 – 기본을 배우고, 그 다음에 OOP와 데이터베이스 작업을 학습하세요.
  • 경험이 있는 개발자 – 풀타임 직장을 얻고 유지하기 위해 실력을 갈고닦으세요. 예를 들어, C# .NET Core에 새로운 기능이 추가되었다면 즉시 사용할 일이 없더라도 시간을 내어 학습하세요. 또 다른 방법은 개발자 포럼을 탐색하면서 질문의 모든 측면을 분석하고, 무엇을 배울 수 있는지 혹은 피해야 할지를 판단하는 것입니다.

다음 가이드는 Microsoft Visual Studio, C#, 그리고 .NET 8 이상을 사용하는 개발자에게 적용됩니다.

  • 학습용 Visual Studio 솔루션을 만들고 솔루션 폴더를 사용해 주제를 구분하세요.
  • 여러 프로젝트에서 유용하게 사용될 수 있는 코드는 클래스 라이브러리에 넣으세요 (아래 스크린샷의 클래스 프로젝트 폴더를 참고).

콘솔 프로젝트용 로그인 요청

먼저 전체 스레드를 확인하세요 – AI가 응답을 형성하는 데 사용할 수 있는 전체 내용입니다.
이제 Spectre.Console NuGet 패키지를 사용한 더 나은 방법을 살펴보겠습니다.

  • Spectre.ConsoleTextPrompt는 검증, 기본값 및 비밀 입력 마스킹을 포함한 텍스트 입력을 사용자에게 요청합니다.
  • 빈 문자열이 아닌 값을 반환하도록 보장하는 데 사용됩니다.
  • 비밀번호 텍스트는 마스킹됩니다.
  • 사용자 이름과 비밀번호 모두 동일한 색상을 사용합니다.
  • 샘플에는 테스트 목적을 위한 충분한 검증(하드코딩)이 포함되어 있습니다.
using Spectre.Console;
using SpectreLoginSample.Classes.Core;

namespace SpectreLoginSample.Classes;

internal class Prompts
{
    public static string PromptStyleColor { get; set; } = "cyan";
    public static string PromptColor { get; set; } = "bold";

    public static bool TryLogin(int maxAttempts = 3)
    {
        for (int attempt = 1; attempt 
        username == "admin" && password == "password";

    public static string GetUserName(bool allowEmpty) =>
        allowEmpty
            ? AnsiConsole.Prompt(
                new TextPrompt($"[{PromptColor}]User name[/]")
                    .PromptStyle(PromptStyleColor)
                    .AllowEmpty())
            : AnsiConsole.Prompt(
                new TextPrompt($"[{PromptColor}]User name[/]:")
                    .PromptStyle(PromptStyleColor));

    public static string GetPassword() =>
        AnsiConsole.Prompt(
            new TextPrompt($"[{PromptColor}]Password[/]:")
                .PromptStyle("grey50")
                .Secret()
                .DefaultValueStyle(new Style(Color.Aqua)));
}

이것이 좋은 학습 경험인 이유

로그인 코드를 완성하면 Spectre.Console 라이브러리에서 탐색할 내용이 훨씬 더 많습니다. 이 라이브러리는 다음 분야에서 뛰어납니다:

  • .NET 도구
  • 콘솔 프로젝트 유틸리티

파일 글로빙이 구원한다

파일 글로빙은 모든 개발자가 알아야 할 주제입니다. 글로브는 와일드카드를 사용하여 파일 및 디렉터리 이름을 매칭하는 패턴을 정의합니다. 글로빙은 하나 이상의 글로브 패턴을 정의하고 포함 또는 제외 매칭을 통해 파일을 찾아내는 행위입니다.

시나리오 – 개발자가 OneDrive를 백업 용도로 사용합니다. 백업이 완료된 후 모든 로컬 파일이 삭제됩니다. 백업을 복원하면 수많은 중복 파일이 나타납니다(5,000개 이상의 복사본). 수동으로 삭제하는 것은 비현실적입니다. 파일‑글로빙에 대한 지식을 활용하면 개발자는 중복 파일을 자동으로 제거하는 간단한 콘솔 앱을 작성할 수 있습니다.

중복 파일 목록을 생성하는 코드

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.FileSystemGlobbing;
using Spectre.Console;

public static class Globbing
{
    /// 
    /// Returns a list of files that match typical “Copy” naming patterns.
    /// 
    public static async Task> GetDuplicatesTask(string parentFolder)
    {
        var list = new List();
        var matcher = new Matcher();

        // Include typical copy‑file patterns
        matcher.AddIncludePatterns(new[]
        {
            "**/* - Copy .*",
            "**/* - Copy (*.*"
        });

        // Exclude folders that may need special permissions
        matcher.AddExcludePatterns(new[]
        {
            "**/My Music/**",
            "**/My Pictures/**",
            "**/My Videos/**"
        });

        await Task.Run(() =>
        {
            foreach (var file in matcher.GetResultsInFullPath(parentFolder))
            {
                list.Add(new FileMatchItem(file));
            }
        });

        // Persist the list for later inspection
        await File.WriteAllLinesAsync(
            Path.Combine(parentFolder, "Duplicates.txt"),
            list.Select(item => item.ToString()));

        return list;
    }
}

중복 파일을 삭제하는 코드

using System;
using System.Threading.Tasks;
using Spectre.Console;

public static class DuplicateProcessor
{
    public static async Task ProcessOneDriveDuplicates()
    {
        var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        var list   = await Globbing.GetDuplicatesTask(folder);

        if (list.Count > 0)
        {
            AnsiConsole.MarkupLine($"[bold green]Found {list.Count} duplicate files.[/]");
            foreach (var item in list)
            {
                try
                {
                    System.IO.File.Delete(item.FullPath);
                }
                catch (Exception ex)
                {
                    AnsiConsole.MarkupLine(
                        $"[red]Failed to delete {item.FullPath}: {ex.Message}[/]");
                }
            }

            AnsiConsole.MarkupLine("[bold green]Deletion complete.[/]");
        }
        else
        {
            AnsiConsole.MarkupLine("[green]No duplicate files were found.[/]");
        }

        SpectreConsoleHelpers.ContinuePrompt();
    }
}

💡 팁AddExcludePatterns는 권한이 상승된 디렉터리이거나 건드리고 싶지 않은 디렉터리를 건너뛸 때 유용합니다.

요약

  • Spectre.Console를 사용하여 깔끔하고 인터랙티브한 콘솔 프롬프트(로그인, 메뉴 등)를 구현합니다.
  • file‑globbing(Microsoft.Extensions.FileSystemGlobbing)을 활용하여 패턴에 따라 파일 그룹을 찾고 조작합니다.
  • Visual Studio 솔루션 내의 클래스‑라이브러리 프로젝트에 재사용 가능한 코드를 정리하여 깔끔하게 유지하고 여러 콘솔 앱 간에 공유할 수 있도록 합니다.

행복한 코딩 되세요!

Source code

files.[/]");

} else
{
    AnsiConsole.MarkupLine($"[bold green]No duplicate files found in {folder}.[/]");
    return;
}

foreach (var (index, item) in list.Index())
{
    try
    {
        if (File.Exists(item.FullName))
        {
            File.Delete(item.FullName);
        }
        else
        {
            AnsiConsole.MarkupLine($"[yellow bold]{item.FullName}[/]");
        }
    }
    catch (Exception e)
    {
        AnsiConsole.MarkupLine($"[red bold]Failed to delete " +
                                $"{index} {item.FullName}[/]");
    }
}

요약

개발자가 코드를 다루든, 막히는 부분을 해결하기 위해 인공지능을 사용하든, 혹은 AI를 사용하지 않든, 최소 주에 한 번은 새로운 것을 배우려고 노력하세요. 카렌은 일주일에 여러 번 새로운 것을 배우려고 합니다.

0 조회
Back to Blog

관련 글

더 보기 »