푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 일반 문제

DRY 원칙 마스터하기: C#에서 디자인 패턴을 적용하여 코드 깨끗하게 작성하기

Tim Corey
53분 20초

C#의 디자인 패턴은 효율적이고 재사용 가능하며 유지보수하기 쉬운 코드를 작성하는 데 필수적인 도구입니다. 이러한 패턴은 일반적인 소프트웨어 설계 문제에 대한 표준 솔루션을 제공하여 모범 사례를 장려하고 개발자가 중복 코드를 피하도록 돕습니다. 디자인 패턴을 적용하는 핵심 원칙 중 하나는 DRY(Don't Repeat Yourself) 원칙입니다. 이 원칙은 코드의 반복을 최소화하여 가독성과 유지보수성을 향상시키는 것을 강조합니다.

이 글은 Tim Corey의 통찰력 있는 영상 " 디자인 패턴: C#에서 반복하지 마세요(Don't Repeat Yourself) "에서 영감을 받았습니다. 이 영상은 DRY 원칙과 이를 활용하여 더 깔끔하고 체계적인 코드를 작성하는 실질적인 방법에 대해 심도 있게 다룹니다. 이 글은 Tim의 영상에서 다룬 핵심 개념과 전략을 살펴보면서, C# 프로젝트에서 DRY 디자인 패턴 원칙을 효과적으로 구현하는 데 필요한 포괄적인 가이드를 제공하는 것을 목표로 합니다.

Introduction to the DRY Principle in C

서문에서 팀 코리는 "반복하지 마라(Don't Repeat Yourself)"라는 뜻의 DRY 원칙을 설명합니다. 이 원칙은 프로그래밍의 기본 개념으로, 모든 지식이나 논리가 코드의 한 곳에만 표현되도록 하여 중복을 피하는 것을 강조합니다. 팀은 대시보드 폼이 있는 간단한 WinForms 애플리케이션 예제를 사용하여 이 원리를 설명합니다. 양식에는 이름과 성을 입력하는 필드와 이러한 필드를 기반으로 직원 ID를 생성하는 버튼이 포함되어 있습니다.

코드 반복 식별 및 예측

(0:53)에서 Tim은 코드에서 반복되는 부분을 식별하고 예측하는 단계로 넘어갑니다. 그는 WinForms 애플리케이션의 예를 사용하여 메서드가 한 번만 호출되는 경우에도 반복이 발생할 수 있음을 보여줍니다. 해당 애플리케이션에서 직원 ID 생성 로직은 이름과 성의 텍스트 필드에서 부분 문자열을 추출하고 끝에 3자리 코드를 추가하는 방식으로 이루어집니다.

Applying Design Patterns In Csharp For Cleaner Code 1 related to 코드 반복 식별 및 예측

위의 스크린샷(1:31)에서 Tim은 애플리케이션의 기능을 시연하며 이름과 성의 첫 네 글자를 세 자리 코드와 결합하여 직원 ID를 생성하는 방법을 보여줍니다. 그는 코드가 동일한 논리를 명시적으로 반복하지 않기 때문에 DRY 원칙을 따르는 것처럼 보이지만, 반복 패턴 자체에 근본적인 문제가 있어 해결해야 한다고 강조합니다.

(1:51)에서 그는 코드가 간단해 보이지만 직원 ID 생성 로직이 버튼의 클릭 이벤트와 밀접하게 연결되어 있기 때문에 DRY 원칙을 완전히 준수하지 않는다고 지적합니다. 즉, 만약 이 논리가 클라이언트 코드의 다른 곳, 예를 들어 신규 직원 목록을 처리할 때(3:58) 필요한 경우 코드를 반복하거나 수정해야 하므로 중복이 발생한다는 의미입니다.

독립적이고 재사용 가능한 메서드 생성

이 부분에서 팀 코리는 DRY 원칙을 준수하는 독립적이고 재사용 가능한 방법을 만드는 방법을 보여줍니다. 그는 먼저 이벤트 핸들러에서 직원 ID를 생성하는 로직을 별도의 메서드로 분리합니다. 이 리팩토링은 GenerateEmployeeID이라는 개인 메서드를 생성하고 기존 코드를 이 메서드로 이동하는 것을 포함합니다 (5:15). 이벤트 핸들러의 수정된 코드는 단순히 이 메서드를 호출합니다.

단계 및 예시:

  1. 초기 코드: 직원 ID 생성 로직은 버튼의 클릭 이벤트 핸들러에 직접 구현되어 있었습니다.

    Applying Design Patterns In Csharp For Cleaner Code 2 related to 단계 및 예시:

  2. 리팩토링된 코드: Tim은 해당 메서드를 더욱 유연하게 만들어 개선했습니다. 특정 UI 요소에 의존하는 대신, 이제 이 메서드는 firstNamelastName를 매개변수로 받아 생성된 ID를 반환합니다. 이러한 변경으로 해당 메서드를 다양한 컨텍스트와 UI 요소에서 사용할 수 있게 되었습니다.

    private string GenerateEmployeeID(string firstName, string lastName)
    {
      string employeeID = firstName.Substring(0, 4) + lastName.Substring(0, 4) + DateTime.Now.Millisecond.ToString();
      return employeeID;
    }
    private string GenerateEmployeeID(string firstName, string lastName)
    {
      string employeeID = firstName.Substring(0, 4) + lastName.Substring(0, 4) + DateTime.Now.Millisecond.ToString();
      return employeeID;
    }

    Tim은 클릭 이벤트에서 이 메서드가 어떻게 호출되는지 보여줍니다.

    employeeIdText.Text = GenerateEmployeeID(firstNameText.Text, lastNameText.Text);
    employeeIdText.Text = GenerateEmployeeID(firstNameText.Text, lastNameText.Text);

    그는 또한 이 방법을 사용하면 코드를 반복 작성하지 않고도 여러 직원 기록이 포함된 CSV 파일을 처리하는 등 애플리케이션의 다른 부분에서도 사용할 수 있다고 언급했습니다.

클래스 라이브러리 구축 및 사용

팀 코리는 코드 재사용성과 유지보수성을 더욱 향상시키기 위해 클래스 라이브러리라는 개념을 살펴봅니다. 그는 GenerateEmployeeID 메서드를 여러 프로젝트에서 사용할 수 있는 클래스 라이브러리 객체로 캡슐화하는 방법을 설명합니다.

(8:00)에서 Tim은 디자인이 사용자 요구 사항이나 회사 정책에 따라 그래픽과 애니메이션을 통해 더욱 상호 작용할 수 있도록 계속 변경된다고 설명합니다. 그래서 그는 솔루션 내에 정확한 필드와 직원 ID 생성 버튼이 있는 WPF 프로젝트를 도입합니다.

Tim은 (9:15)에서 클래스 라이브러리를 사용하는 것에 대한 강력한 주장을 펼치며, 반복을 피하려면 새 WPF 프로젝트에 코드를 복사해서 붙여넣어야 한다고 말합니다. 따라서 DRY 원칙을 지키기 위해 클래스 라이브러리에 클래스를 만들어야 합니다.

단계 및 예시:

  1. 클래스 라이브러리 생성:

    • Tim은 (9:47)에 .NET Framework 에서 DRYDemoLibrary라는 이름으로 새 클래스 라이브러리 프로젝트를 생성합니다.

    • 그는 이 라이브러리 안에 공용 클래스 EmployeeProcessor를 정의하고 메서드 GenerateEmployeeID를 이 클래스 안으로 이동합니다:

      public class EmployeeProcessor
      {
       public string GenerateEmployeeID(string firstName, string lastName)
       {
          string employeeID = firstName.Substring(0, 4) + lastName.Substring(0, 4) + DateTime.Now.Millisecond.ToString();
          return employeeID;
       }
      }
      public class EmployeeProcessor
      {
       public string GenerateEmployeeID(string firstName, string lastName)
       {
          string employeeID = firstName.Substring(0, 4) + lastName.Substring(0, 4) + DateTime.Now.Millisecond.ToString();
          return employeeID;
       }
      }
  2. 프로젝트에서 클래스 라이브러리 사용하기:

    • Tim은 WinForms(13:18) 및 WPF 프로젝트(14:00)에서 DRYDemoLibrary 클래스 라이브러리에 대한 참조를 추가합니다.

    • 그런 다음 그는 클래스 라이브러리에서 GenerateEmployeeID 메서드를 호출하여 이전 코드를 대체합니다:

      EmployeeProcessor processor = new EmployeeProcessor();
      employeeIDText.Text = processor.GenerateEmployeeID(firstNameText.Text, lastNameText.Text);
      EmployeeProcessor processor = new EmployeeProcessor();
      employeeIDText.Text = processor.GenerateEmployeeID(firstNameText.Text, lastNameText.Text);
    • 이 접근 방식은 메서드가 한 곳에 유지 관리되므로 중복을 제거합니다. Tim은 동일한 클래스 라이브러리를 코드 중복 없이 서로 다른 UI 프레임워크(WinForms 및 WPF)에서 사용할 수 있음을 보여줍니다.
  3. 장점:

    • 일관성: Tim은 로직을 클래스 라이브러리에 집중시킴으로써 로직 변경 사항(예: 버그 수정)이 모든 프로젝트에 일관되게 적용되도록 보장합니다.

    • 유지보수 부담 감소: 메서드 변경은 클래스 라이브러리에서만 하면 되므로, 코드 불일치를 방지하고 유지보수 오버헤드를 줄일 수 있습니다.

클래스 라이브러리를 여러 프로젝트에 통합하기

팀 코리는 DRYDemoLibrary 클래스 라이브러리를 다양한 유형의 프로젝트에서 사용하는 방법을 계속해서 탐구하고 있으며, 특히 이 라이브러리를 새로운 콘솔 애플리케이션에 통합하는 데 중점을 두고 있습니다. 이는 라이브러리의 기능이 단일 인스턴스나 동일 솔루션 내의 애플리케이션뿐만 아니라 다양한 애플리케이션에서 재사용될 수 있음을 보여줍니다.

단계 및 예시:

  1. 새로운 솔루션 및 프로젝트 생성:

    • Tim은 (17:29)에서 콘솔 애플리케이션용 새 솔루션을 만들어 Windows 서비스나 콘솔 앱과 같은 다른 유형의 프로젝트에서 DRYDemoLibrary를 사용해야 할 수도 있는 시나리오를 시뮬레이션합니다.

    그는 새 프로젝트의 이름을 ConsoleUI로 정하고 기본적인 콘솔 애플리케이션을 설정하는 방법을 보여줍니다.

      class Program
      {
         static void Main(string[] args)
         {
            Console.ReadLine();
         }
      }
      class Program
      {
         static void Main(string[] args)
         {
            Console.ReadLine();
         }
      }
  2. 클래스 라이브러리에 참조 추가하기:

    • Tim은 새 프로젝트에 DRYDemoLibrary DLL에 대한 참조를 추가하는 방법을 설명합니다. 이 과정은 클래스 라이브러리 프로젝트의 bin 폴더에 있는 DLL 파일을 찾아 콘솔 애플리케이션에 추가하는 것을 포함합니다.

      using DRYDemoLibrary;
      using DRYDemoLibrary;
    • 참조가 추가되면 Tim(19:24)은 라이브러리의 EmployeeProcessor 클래스를 사용하여 사용자 입력에 따라 직원 ID를 생성합니다.

      Console.WriteLine("What is your first name?");
      string firstName = Console.ReadLine();
      
      Console.WriteLine("What is your last name?");
      string lastName = Console.ReadLine();
      
      EmployeeProcessor processor = new EmployeeProcessor();
      string employeeID = processor.GenerateEmployeeID(firstName, lastName);
      
      Console.WriteLine($"Your employee ID is {employeeID}");
      Console.WriteLine("What is your first name?");
      string firstName = Console.ReadLine();
      
      Console.WriteLine("What is your last name?");
      string lastName = Console.ReadLine();
      
      EmployeeProcessor processor = new EmployeeProcessor();
      string employeeID = processor.GenerateEmployeeID(firstName, lastName);
      
      Console.WriteLine($"Your employee ID is {employeeID}");
  3. 콘솔 애플리케이션 실행:

    • Tim은 콘솔 애플리케이션을 실행하여 라이브러리를 사용하여 직원 ID가 성공적으로 생성됨을 보여줍니다. 이는 클래스 라이브러리의 동일한 코드를 여러 프로젝트에서 재사용할 수 있음을 확인시켜 줍니다.

      Applying Design Patterns In Csharp For Cleaner Code 3 related to 단계 및 예시:

  4. DLL 업데이트:

    • Tim은 DLL이 변경될 경우 해당 DLL을 참조하는 프로젝트에서 업데이트할 수 있다고 간략하게 언급합니다. 그는 이 영상에서 자세히 다루지는 않지만, NuGet 패키지를 사용하는 것이 여러 프로젝트에 걸쳐 DLL을 관리하고 업데이트하는 데 권장되는 접근 방식이라고 언급합니다.

DLL 업데이트 및 NuGet 패키지 관리

팀 코리는 클래스 라이브러리를 관리하고 업데이트하기 위해 NuGet 패키지를 사용하는 개념을 간략하게 소개합니다. 이러한 접근 방식은 특히 규모가 큰 프로젝트나 조직에서 종속성 및 업데이트를 처리하는 데 있어 확장성이 뛰어난 솔루션을 제공합니다.

핵심 요점:

  1. NuGet 패키지 생성:

    • Tim은 DLL 파일을 수동으로 관리하는 대신 클래스 라이브러리용 NuGet 패키지를 만들 것을 제안합니다. 이 과정에는 DLL을 NuGet 패키지로 패키징하고 NuGet 서버(개인 또는 공용)에 업로드하는 작업이 포함됩니다.
  2. 패키지 업데이트:

    • NuGet 패키지를 사용하면 패키지 버전을 업데이트하는 것만으로 해당 라이브러리를 참조하는 모든 프로젝트에서 라이브러리를 업데이트할 수 있습니다. 이렇게 하면 일관성이 보장되고 버전 불일치 또는 업데이트 누락 위험이 줄어듭니다.
  3. 장점:

    • 중앙 집중식 관리: NuGet 패키지는 라이브러리 버전 및 종속성을 중앙 집중식으로 관리할 수 있는 방법을 제공합니다.

    • 업데이트 용이성: 여러 프로젝트에 걸쳐 라이브러리를 업데이트하는 것이 더 쉽고 안정적입니다.

    • 통합: NuGet 다양한 개발 도구 및 환경과 통합되어 라이브러리 종속성 관리 프로세스를 간소화합니다.

단위 테스트에서 DRY 원칙을 구현하는 방법: 속성 강좌

이 부분에서 팀 코리는 DRY(Don't Repeat Yourself) 원칙을 적용하여 단위 테스트를 향상시키는 방법을 보여줍니다. 그는 개발 작업, 특히 단위 테스트에 중점을 두고 DRY 원칙을 구현하는 방법을 보여줍니다.

초기 테스트 설정

팀은 먼저 DLL의 버그로 인해 현재 실패하는 단위 테스트를 실행합니다. 그는 코드가 메인 솔루션 외부에 있더라도 문제를 식별하는 데 있어 단위 테스트의 중요성을 강조합니다. 해당 코드는 4글자 입력을 예상했지만 Tim이 3글자 이름을 전달했고, 이로 인해 DLL 파일이 솔루션에 직접 포함되지 않더라도 오류가 발생합니다.

Applying Design Patterns In Csharp For Cleaner Code 4 related to 초기 테스트 설정

버그를 해결하기 위한 코드 리팩토링

팀(Tim)은 이름 처리 문제를 해결하기 위해 코드를 리팩토링했습니다. 그는 새로운 클래스 라이브러리 프로젝트를 생성하여 DRY 원칙을 개발에 적용하는 방법을 설명합니다(23:50). 이러한 접근 방식을 통해 여러 객체에 대한 변경 사항을 한 번만 적용하고 수정 작업을 반복하지 않고도 효과적으로 테스트할 수 있습니다.

Applying Design Patterns In Csharp For Cleaner Code 5 related to 버그를 해결하기 위한 코드 리팩토링

단위 테스트 추가하기

Tim은 클래스 라이브러리 프로젝트에 EmployeeProcessorTest라는 새로운 테스트 클래스를 추가하고 XUnit을 사용하여 단위 테스트를 설정합니다. 그는 직원 ID를 생성하는 테스트 메서드를 만드는 방법을 보여주고 실제 값에 의존하는 대신 종속성을 모킹하는 것의 중요성에 대해 논의합니다.

Applying Design Patterns In Csharp For Cleaner Code 6 related to 단위 테스트 추가하기

테스트 메서드 작성하기

Tim은 GenerateEmployeeID_ShouldCalculate라는 단위 테스트 메서드를 작성합니다. 그는 다양한 시나리오를 테스트하기 위해 인라인 데이터를 사용하여 이론을 설정하고, 해당 방법이 예상대로 결과를 반환하는지 확인합니다. 그는 또한 Assert.Equal을 사용하여 출력을 검증하는 방법을 설명합니다.

public class EmployeeProcessorTest
{
   [Theory]
   [InlineData("Timothy", "Corey", "TimoCore")]
   public void GenerateEmployeeID_ShouldCalculate(string firstName, string lastName, string expectedStart)
   {
      // Arrange
      var processor = new EmployeeProcessor();

      // Act
      var actualStart = processor.GenerateEmployeeID(firstName, lastName).Substring(0, 8);

      // Assert
      Assert.Equal(expectedStart, actualStart);
   }
}
public class EmployeeProcessorTest
{
   [Theory]
   [InlineData("Timothy", "Corey", "TimoCore")]
   public void GenerateEmployeeID_ShouldCalculate(string firstName, string lastName, string expectedStart)
   {
      // Arrange
      var processor = new EmployeeProcessor();

      // Act
      var actualStart = processor.GenerateEmployeeID(firstName, lastName).Substring(0, 8);

      // Assert
      Assert.Equal(expectedStart, actualStart);
   }
}

유닛 테스트 실행

팀은 테스트 조건과 결과를 제어하기 위해 날짜 및 시간 값과 같은 동적 데이터를 모킹하는 것이 중요하다고 강조합니다. 그는 동적 문자열을 다룰 때의 어려움과 제어된 값을 사용하여 다양한 시나리오를 테스트하는 방법에 대해 논의합니다. 그 후에 유닛 테스트를 실행하는데, 그 전에 테스트 실행을 위해 필요한 두 개의 NuGet 패키지 xunit.runner.consolexunit.runner.visualstudio를 추가합니다.

Applying Design Patterns In Csharp For Cleaner Code 7 related to 유닛 테스트 실행

하나의 인라인 데이터에 대한 모든 테스트를 성공적으로 실행한 후 출력은 다음과 같습니다.

Applying Design Patterns In Csharp For Cleaner Code 8 related to 유닛 테스트 실행

이제 (31:30)에 Tim은 또 다른 인라인 데이터를 추가하고 서브스트링 두 번째 매개변수를 expectedStart.Length로 변경했습니다:

public class EmployeeProcessorTest
{
   [Theory]
   [InlineData("Timothy", "Corey", "TimoCore")]
   [InlineData("Tim", "Corey", "TimCore")]
   public void GenerateEmployeeID_ShouldCalculate(string firstName, string lastName, string expectedStart)
   {
      var processor = new EmployeeProcessor();
      var actualStart = processor.GenerateEmployeeID(firstName, lastName).Substring(0, expectedStart.Length);
      Assert.Equal(expectedStart, actualStart);
   }
}
public class EmployeeProcessorTest
{
   [Theory]
   [InlineData("Timothy", "Corey", "TimoCore")]
   [InlineData("Tim", "Corey", "TimCore")]
   public void GenerateEmployeeID_ShouldCalculate(string firstName, string lastName, string expectedStart)
   {
      var processor = new EmployeeProcessor();
      var actualStart = processor.GenerateEmployeeID(firstName, lastName).Substring(0, expectedStart.Length);
      Assert.Equal(expectedStart, actualStart);
   }
}

(32:05)에서 두 번째 가설을 적용하여 단위 테스트를 다시 실행한 후 테스트가 실패했습니다.

Applying Design Patterns In Csharp For Cleaner Code 9 related to 유닛 테스트 실행

private 메서드를 사용하여 코드 개선하기

DRY 원칙을 따르기 위해 Tim은 실제 EmployeeProcessor 클래스 아래 DRYDemoLibrary에서 개인 메서드 GetPartOfName을 생성하여 코드를 더 리팩토링합니다. 이 메서드는 이름의 일부를 추출하여 코드 재사용성과 가독성을 향상시킵니다. 팀은 다음과 같이 변경했습니다.

public string GenerateEmployeeID(string firstName, string lastName)
{
   string employeeID = $@"{GetPartOfName(firstName, 4)}{GetPartOfName(lastName, 4)}{DateTime.Now.Millisecond.ToString()}";
   return employeeID;
}

private string GetPartOfName(string name, int numberOfCharacters)
{
   string output = name;

   if (name.Length > numberOfCharacters)
   {
      output = name.Substring(0, numberOfCharacters);
   }

   return output;
}
public string GenerateEmployeeID(string firstName, string lastName)
{
   string employeeID = $@"{GetPartOfName(firstName, 4)}{GetPartOfName(lastName, 4)}{DateTime.Now.Millisecond.ToString()}";
   return employeeID;
}

private string GetPartOfName(string name, int numberOfCharacters)
{
   string output = name;

   if (name.Length > numberOfCharacters)
   {
      output = name.Substring(0, numberOfCharacters);
   }

   return output;
}

단위 테스트 업데이트

팀은 부분 문자열의 예상 길이를 수정하는 등 코드 변경 사항을 반영하여 단위 테스트를 업데이트합니다. 그는 이러한 테스트를 실행하면 문제를 신속하게 파악하고 코드가 새로운 요구 사항을 충족하는지 검증하는 데 도움이 된다고 설명합니다. 팀은 새로운 이론을 추가한 다음 단위 테스트를 실행하여 출력 결과가 예상대로 나오는지 확인합니다.

Applying Design Patterns In Csharp For Cleaner Code 10 related to 단위 테스트 업데이트

.NET Standard 라이브러리를 활용하여 활용도 확장

.NET Standard 라이브러리 생성

Tim Corey는 클래스 라이브러리의 활용도를 높이기 위해 .NET Framework 클래스 라이브러리에서 .NET Standard 클래스 라이브러리로 전환할 것을 권장합니다. 이러한 변경으로 라이브러리는 다음과 같은 다양한 플랫폼에서 호환될 수 있게 되었습니다.

  • 윈도우 플랫폼 : WinForms, WPF 및 콘솔 애플리케이션
  • 크로스 플랫폼 : .NET Core, Xamarin(iOS 및 Android용), Linux 및 macOS

.NET Standard 라이브러리를 생성하는 단계:

  1. 새 프로젝트 추가 : 솔루션을 마우스 오른쪽 버튼으로 클릭하고 새 프로젝트 추가를 선택합니다.
  2. .NET Standard 선택 : .NET Framework 클래스 라이브러리를 선택하는 대신 .NET Standard 선택합니다. 이 라이브러리 유형은 다양한 플랫폼을 지원합니다.

    Applying Design Patterns In Csharp For Cleaner Code 11 related to .NET Standard 라이브러리를 생성하는 단계:

  3. 코드 마이그레이션 : 기존 코드(예: EmployeeProcessor 클래스)를 새 .NET Standard 라이브러리에 복사하여 붙여넣으세요. 이 과정에는 약간의 조정이 포함될 수 있지만 핵심 논리는 그대로 유지됩니다.

.NET Standard 로 변환하면 다양한 플랫폼에서 라이브러리에 액세스할 수 있으므로 여러 애플리케이션 유형에서 코드 중복을 줄이고 개발 노력을 절약할 수 있습니다.

코드 및 테스트에서 반복을 피하는 방법

개발 과정에서 반복을 줄이기

팀 코리는 .NET Standard 라이브러리를 채택함으로써 코드베이스뿐만 아니라 개발 프로세스에서도 코드 반복을 최소화할 수 있다고 강조합니다. 서로 다른 플랫폼별 프로젝트에서 코드를 중복 작성하는 대신, 여러 환경에서 작동하는 단일 라이브러리에 코드를 중앙 집중화할 수 있습니다.

이익:

  • 통합 코드베이스 : 다양한 플랫폼에서 하나의 코드베이스를 사용하면 코드 유지 관리 및 업데이트에 필요한 노력을 줄일 수 있습니다.
  • 간소화된 테스트 : .NET Standard 라이브러리를 사용하면 단위 테스트를 한 번만 작성하여 지원되는 모든 플랫폼에 적용되는지 확인할 수 있습니다.

테스팅 및 디버깅: 팀은 노력과 반복 작업을 더욱 줄이는 방법으로 유닛 테스팅을 소개합니다. 자동화된 테스트는 애플리케이션의 각 반복 버전을 수동으로 테스트할 필요 없이 코드의 정확성을 검증합니다.

드라이 타입 제품 사용 팁: 언제 사용을 멈춰야 할지 알기

팀 코리는 유지보수 가능한 코드를 작성하는 데 있어 DRY(Don't Repeat Yourself) 원칙을 따르는 것이 중요하지만, 언제 어디에 적용해야 하는지 아는 것도 중요하다고 강조합니다. 모든 상황에 동일한 접근 방식이 필요한 것은 아니므로, 팀의 통찰력에서 영감을 얻은 몇 가지 실용적인 팁을 소개합니다.

  1. 코드 비하인드 및 UI에 코드를 넣지 마십시오 : Tim은 로직을 코드 비하인드 파일이나 사용자 인터페이스에 직접 배치하는 것을 권장하지 않습니다. 예를 들어, 비즈니스 로직은 폼이나 버튼 클릭 이벤트에 포함되어서는 안 됩니다. 대신, 그러한 로직은 별도의 클래스나 라이브러리에 보관하십시오. 이러한 분리는 깔끔한 아키텍처를 유지하는 데 도움이 되며, 다양한 사용자 인터페이스에서 코드를 더욱 재사용할 수 있도록 해줍니다.

  2. .NET Standard 라이브러리 활용 : 라이브러리를 만들 때 Tim은 가능하면 .NET Framework 라이브러리 대신 .NET Standard 라이브러리를 사용할 것을 권장합니다. .NET Standard 라이브러리는 활용도가 높아 .NET Core, Xamarin 등 다양한 플랫폼에서 코드를 사용할 수 있도록 해줍니다. 이러한 접근 방식은 코드 중복을 줄이고 코드 이식성을 향상시킵니다.

  3. 플랫폼별 코드 분리 : 파일 처리 또는 구성 관리와 같은 플랫폼별 요구 사항으로 인해 일부 코드는 .NET Standard 라이브러리에 적합하지 않을 수 있습니다. Tim은 이러한 경우 .NET Standard 코드용 라이브러리 하나와 플랫폼별 코드용 라이브러리 하나, 이렇게 두 개의 라이브러리를 만들 것을 권장합니다. 이렇게 하면 플랫폼별 요구 사항을 충족하면서도 핵심 로직을 재사용할 수 있습니다.

  4. 단위 테스트를 강조하세요 : Tim은 코드에 대한 단위 테스트를 작성할 것을 강력히 권장합니다. 단위 테스트는 버그를 조기에 발견하고 코드가 예상대로 작동하는지 확인하는 데 도움이 됩니다. 디버깅 도구는 전체 애플리케이션을 수동으로 테스트하지 않고도 변경 사항을 신속하게 확인할 수 있으므로 디버깅 프로세스 속도를 크게 향상시킬 수 있습니다.

  5. 프로젝트 규모를 고려하세요 : Tim은 매우 작은 프로젝트나 실험적인 프로젝트의 경우 별도의 라이브러리를 만들고 광범위한 단위 테스트를 수행하는 데 드는 추가 비용이 불필요할 수 있다고 인정합니다. 하지만 실제 운영 환경에 적용할 경우에는 소규모 프로젝트가 시간이 지남에 따라 성장하고 발전하는 경우가 많으므로, 처음부터 깔끔한 아키텍처를 구축하고 단위 테스트를 수행하는 것이 좋습니다.

이러한 팁을 따르면 DRY 원칙을 효과적으로 적용하면서 코드 재사용 및 유지보수성에 대한 필요성과 실질적인 고려 사항 사이의 균형을 맞출 수 있습니다.

결론

디자인 패턴을 통해 DRY 원칙을 숙달하는 것은 깔끔하고 유지보수 가능한 C# 코드를 작성하는 데 필수적입니다. Tim Corey가 보여준 것처럼 DRY 원칙을 효과적으로 적용하려면 재사용 가능한 메서드를 만들고, 클래스 라이브러리를 활용하며, 더 넓은 호환성을 위해 .NET Standard 수용해야 합니다. 이러한 방법들을 언제 어떻게 적용해야 하는지 이해함으로써 코드의 품질과 유연성을 크게 향상시킬 수 있습니다.

더 자세한 내용을 알고 싶으시면 팀 코리의 관련 영상을 여기에서 확인하세요. 팀의 최신 콘텐츠를 확인하려면 그의 유튜브 채널을 방문하세요.

Hero Worlddot related to DRY 원칙 마스터하기: C#에서 디자인 패턴을 적용하여 코드 깨끗하게 작�...
Hero Affiliate related to DRY 원칙 마스터하기: C#에서 디자인 패턴을 적용하여 코드 깨끗하게 작�...

사랑하는 것을 공유하여 더 많은 수익을 얻으세요

당신은 .NET, C#, Java, Python, 또는 Node.js를 다루는 개발자를 위한 콘텐츠를 만드나요? 당신의 전문성을 추가 수입으로 전환하세요!

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해