Tim Corey와 함께 깊이 있는 C# WinForms 토너먼트 데이터베이스에 데이터 저장
"C# App From Start to Finish" 시리즈의 Lesson 19에서는 Tim Corey가 프로젝트의 가장 중요한 이정표 중 하나인 완전히 구축된 WinForms 토너먼트를 데이터베이스(및 텍스트 파일)에 저장하는 과정을 소개합니다. WinForms는 Windows 데스크톱 응용 프로그램을 구축하기 위한 프레임워크로서, 실제 상황에서 데이터 지속성을 입증하는데 이상적입니다.
이 기사는 전적으로 Lesson 19 – Create Tournament Form (Part 5)을 기반으로 하며, Tim의 단계별 추론, 디버깅 프로세스 및 코딩 패턴을 따릅니다.
이론을 제시하는 대신 Tim은 실제 응용 프로그램 코드를 살펴보며 모델이 저장, 재하이드레이션, 디버그, 그리고 불가피한 오류가 발생할 때 수정되는 방식을 보여줍니다. 이는 WinForms에서 실질적인 데이터 지속성을 이해하는데 특히 유용합니다.
소개
수업 시작 부분에서 Tim은 Lesson 19를 소개하며 오늘이 드디어 생성 토너먼트 폼이 완성되는 날임을 설명합니다. 그는 이 폼이 지금껏 가장 큰 폼 중 하나였으며, 많은 이동 부품들이 있어 압도적이라고 느낄 수 있음을 인정합니다. 이 수업에서 WinForms의 이벤트 중심 모델과 신속한 응용 프로그램 개발 기능을 적용하여 실제 폼을 완성하는 방법을 배울 것입니다.
Tim은 복잡성이 관리 가능한 조각으로 나뉘었으며 오늘의 초점은 토너먼트 데이터를 저장하는데 필요한 최종 로직 — SQL 데이터베이스나 텍스트 파일에 저장 — 이며, 그 기능이 종료됨을 확신시킵니다. WinForms은 신속한 응용 프로그램 개발(RAD) 및 내부 비즈니스 도구 또는 경량 유틸리티를 구축하는 데 이상적이며, 비교적 간단한 이벤트 중심 모델과 방대한 온라인 자료 덕분에 새로운 개발자들이 배우기 쉽습니다.
Visual Studio에서 새 프로젝트 생성하기
Windows Forms 앱을 시작하는 것은 Visual Studio로 간단합니다. Visual Studio를 열고 시작 창에서 '새로운 프로젝트 만들기'를 선택하여 시작합니다. '새로운 프로젝트 만들기' 대화 상자에서 'Windows Forms App'을 검색 창에 입력하여 필요한 템플릿을 신속하게 찾습니다. 옵션을 좁히기 위해 언어로 C#을, 플랫폼으로 Windows를 필터링하십시오.
'Windows Forms App (.NET Framework)' 프로젝트 유형을 찾으면 선택한 다음 다음을 클릭하십시오. '새 프로젝트 구성' 창에서 프로젝트 이름(예: HelloWorld)을 입력하고 위치를 선택한 후 생성 버튼을 클릭하십시오. Visual Studio는 새 솔루션을 생성하고 응용 프로그램의 GUI(그래픽 사용자 인터페이스) 역할을 하는 메인 폼을 엽니다. 이 폼에서 사용자 인터페이스를 설계하고 컨트롤을 추가하여 Windows 데스크톱 응용 프로그램의 기반을 다질 것입니다. 템플릿은 .NET Framework에 필요한 모든 파일과 참조를 포함하고 있으므로 바로 응용 프로그램의 기능과 기능성을 구축하는 데 집중할 수 있습니다.
생성 토너먼트 버튼 로직 검토하기
Tim은 리뷰로 시작합니다. 그는 프로그램의 생성 토너먼트 버튼에서 모든 것이 시작된다고 설명합니다. C# WinForms 프로그램에서는 특정 사용자의 액션, 예를 들어 생성 토너먼트 버튼을 클릭하는 것과 같은 것에 응답하여 코드를 실행하는 이벤트 핸들러를 작성합니다. 이 지점까지 응용 프로그램은 이미:
사용자 입력을 검증했습니다
토너먼트 객체를 구축했습니다
- 메모리 내 라운드와 대진을 생성했습니다
Tim이 설명하는 누락된 부분은 그 데이터를 지속시키는 것입니다. 이전에 앱은 토너먼트, 상, 항목을 저장할 수 있었지만, 라운드 정보가 누락되어 있었습니다. 이 레슨이 해결하는 부분입니다.
SQL에서 토너먼트 저장하기: 큰 그림
팀이 SQL 커넥터의 CreateTournament 메서드로 이동하여, 데이터를 저장하는 명확한 패턴을 준수해야 함을 강조합니다:
토너먼트 자체를 저장하세요
토너먼트 ID를 가져오세요
상금을 저장하세요
참가자를 저장하세요
- 이제: 라운드와 대진을 저장하세요
참고: 모든 관련 데이터를 올바르게 연결하고 애플리케이션의 데이터 무결성을 유지하려면 이 저장 순서를 따르는 것이 중요합니다.
팀은 패턴이 좋으며, 이번 레슨도 이전에 설정한 동일한 패턴을 따르고 있음을 강조합니다.
WinForms는 버튼, 텍스트 상자, 라벨과 같은 재사용 가능한 UI 요소 생성을 지원하여 애플리케이션의 데이터 구조 일관성을 유지하는 데 도움을 줍니다.
데이터 구조 복잡성 이해하기
여기서 팀은 라운드를 저장하는 것이 왜 더 복잡한지 설명하기 위해 멈춥니다.
토너먼트는 라운드를 가집니다
각 라운드는 MatchupModel의 리스트입니다
- 각 대진은 MatchupEntryModel 객체를 포함합니다
팀은 이것이 리스트의 리스트고, 이 단계에서는 그러한 복잡성이 정상적이라고 설명합니다. 그는 시청자에게 당황하지 말라고 권장하며, 이는 실제 데이터를 모델링한 자연스러운 결과일 뿐이라고 설명합니다.
그는 또한 WinForms 애플리케이션이 데이터 그리드 및 UI 컨트롤과 같은 구성 요소를 사용하여 구축되어 개발자가 기능이 풍부한 데스크톱 애플리케이션을 효과적으로 만들 수 있도록 도움을 준다는 점도 강조합니다. Windows Forms 클래스 라이브러리의 모든 시각적 요소는 사용자 인터페이스를 구축하고 사용자 정의할 수 있는 일관된 기반을 제공하는 Control 클래스로부터 파생됩니다.
저장 순서가 중요한 이유
비디오의 가장 중요한 설명 중 하나가 여기에서 발생합니다.
팀은 데이터는 순서대로 저장되어야 한다고 설명합니다, 왜냐하면:
대진 항목은 상위 대진 ID가 존재하기 전까지 저장될 수 없습니다
- 라운드는 이전 라운드에 ID가 있을 때까지 다음 라운드를 참조할 수 없습니다
그는 객체가 동일한 메모리 주소를 참조하기 때문에 한 곳에서 ID가 채워지면 모든 참조가 자동으로 업데이트된다고 설명합니다. 그러나, 개발자는 .NET WinForms 애플리케이션에서 이벤트 중심 프로세스의 일반적인 부분으로서 ID가 할당될 때 객체 참조를 수정해야 할 수도 있습니다.
모든 모델이 ID를 갖도록 보장하기
팀은 중요한 수정을 지적합니다: MatchupEntryModel에 아직 ID 속성이 없습니다.
즉시 필요하지 않더라도, 팀은 일관성과 미래 사용을 위해 모든 데이터베이스에 지원된 모델이 ID를 가져야 한다고 설명하며 추가합니다. 기본적으로 Windows Forms 애플리케이션은 Form1.Designer.cs와 같은 파일을 사용하여 애플리케이션의 표준 구조 및 동작을 보장하며 UI 코드를 자동으로 생성합니다.
논리를 단순한 단계로 나누기
이 섹션은 C WinForms 애플리케이션에서 데이터를 저장하기 위한 튜토리얼로 작용합니다.
팀은 자신이 가장 좋아하는 교육 비유 중 하나를 사용합니다: '코끼리를 한 입에 한 입씩 먹는 것'.
그는 저장 논리를 명확한 단계로 나눕니다:
각 라운드를 순회하세요
각 라운드 내에서 대진을 순회하세요
각 대진을 저장하세요
대진 항목을 순회하세요
- 각 항목을 저장하세요
각 단계는 자체적으로 간단하며, 함께 모이면 강력합니다.
시각적으로 간단한 기본 드래그 앤 드롭 디자이너인 Visual Studio를 이용하면 WinForms는 내부 도구, 프로토타입, 간단한 애플리케이션을 구축하기에 우수합니다.
라운드 및 대진을 순회하기
팀은 각 라운드 자체가 MatchupModel의 리스트인 라운드 리스트를 순회하는 방법을 보여줍니다.
그는 처음에는 var을 피하고 그 이유를 설명합니다: 명시적 유형은 개발자가 특히 중첩된 리스트를 다룰 때 자신이 무엇을 순회하고 있는지 이해하는 데 도움이 됩니다. 명확한 코드는 Windows Forms 개발에서 여러 프로그래밍 언어를 사용할 때 특히 중요하며, 이는 유지보수를 개선하고 여러 언어에 대한 현지화 지원을 제공합니다.
그는 또한 중요한 철학을 공유합니다:
"최고의 코드는 초보 개발자도 이해할 수 있는 코드입니다."
Windows Forms 애플리케이션은 이벤트 중심이며 Microsoft .NET Framework의 지원을 받습니다.
대진 삽입 저장 프로시저 만들기
팀은 SQL로 전환하여 spMatchups_Insert를 만듭니다.
그는 필드를 명확히 설명합니다:
토너먼트 ID
대진 라운드
- 승자 ID (널 가능)
대진이 일어나는 때를 추적하기 위해 날짜와 같은 필드를 추가할 수 있습니다.
팀은 의도적으로 이 단계에서 승자를 설정하지 않습니다. 비록 대진이 부전승일지라도, 그는 실제 경기와 동일한 논리를 사용하여 승자를 나중에 결정하는 것을 선호합니다.
Windows Forms는 기존 Windows API를 관리 코드로 래핑하여 기본 Windows 사용자 인터페이스 공용 컨트롤에 대한 액세스를 제공합니다.
대진 항목 저장 및 NULL 처리하기
팀은 spMatchupEntries_Insert라는 또 다른 저장 프로시저를 만듭니다.
그는 설명합니다:
경기는 아직 진행되지 않았기 때문에 점수는 NULL입니다
NULL은 0과 같지 않습니다
- TeamCompeting은 나중 라운드에서 NULL일 수 있습니다
그는 왜 0은 실존하는 값이고 NULL은 아직 값이 존재하지 않음을 의미하는지 축구와 골프의 기억에 남는 예를 사용해 설명합니다.
애플리케이션 설정은 Windows Forms 프로젝트에서 다양한 데이터 시나리오, 예를 들어 NULL 값이 컨트롤에 표시되거나 처리되는 방식을 다루도록 구성할 수 있습니다.
Windows Forms는 Microsoft .NET, .NET Framework, 또는 Mono의 일부로 포함됩니다.
.NET Framework 애플리케이션의 기능 및 운영
.NET Framework에 기반한 Windows Forms 앱은 현대 Windows 데스크톱 애플리케이션을 생성하기 위한 강력한 기능 세트를 제공합니다. Windows Forms (WinForms)를 사용하면 직관적이고 상호작용하는 사용자 인터페이스를 설계하기 쉽게 만들어주는 풍부한 그래픽 사용자 인터페이스 (GUI) 라이브러리를 이용할 수 있습니다. WinForms는 Microsoft .NET, .NET Framework, Mono에 포함된 무료 오픈 소스 프레임워크로, 관리 코드를 통해 기본 Windows 컨트롤 및 Windows API와의 통합을 매끄럽게 지원합니다.
Visual Studio IDE는 Windows Forms Designer와 같은 도구를 통해 개발 경험을 향상시킵니다. 이를 사용하면 버튼, 텍스트 상자, 라벨과 같은 일반적인 컨트롤을 양식에 직접 드래그 앤 드롭할 수 있습니다. 이 시각적 접근 방식은 UI 설계를 빠르게 하며 속성 창을 사용해 속성과 이벤트를 사용자 정의할 수 있게 합니다. 내장된 코드 편집, 디버깅, 프로젝트 관리 기능을 통해 Visual Studio는 Windows 데스크탑 애플리케이션을 구축, 테스트 및 세부 조정하는 과정을 간소화합니다. 비즈니스 도구, 유틸리티 또는 교육용 소프트웨어를 생성하든지 간에, .NET Framework와 WinForms는 기능이 풍부하고 응답성이 뛰어난 사용자 친화적인 애플리케이션을 제공하기 위한 강력한 플랫폼을 제공합니다.
편집과 계속으로 디버깅하기
예외가 발생할 때, 팀은 당황하지 않고 가르칩니다.
그는 Visual Studio의 편집과 계속 기능을 사용합니다:
실행 중지
null 체크 삽입
- 앱을 다시 시작하지 않고 실행 계속하기
UI 컨트롤을 디버깅하고 액세스하는 속도를 높이는 'Ctrl' 조합('Ctrl + Alt + X'로 도구 상자 열기 등)과 같은 키보드 단축키를 사용할 수 있습니다.
그는 다음을 보여줍니다:
TeamCompeting이 null인지 확인
.ID에 액세스하는 대신 null을 SQL에 전달
- ParentMatchup에도 동일한 논리 적용
이것은 팀이 실제로 사용하는 것과 동일한 실제 디버깅 워크플로입니다.
Visual Studio는 C# 개발을 위한 다양한 특징과 도구를 제공하며, 이에 Windows Forms Designer가 포함됩니다.
SQL에서 데이터 검증하기
작은 버그 두 개를 수정한 후, 팀은 데이터베이스를 질의합니다.
그는 확인합니다:
대진이 올바르게 저장되었습니다
라운드 번호가 정확합니다
부전승 논리가 작동합니다
- 부모-자식 관계가 정확합니다
저장 후 데이터베이스에서의 올바른 관계와 데이터를 주목하세요. 이는 애플리케이션 논리가 의도한 대로 작동하는 것을 검증하는 데 중요한 시각적 피드백입니다.
팀은 매우 복잡한 기능에서 단지 두 가지 오류만 발생했다고 강조하고, 이 성공을 계획, 패턴 및 작업을 작은 조각으로 나눈 덕분이라고 칭찬합니다.
Windows Forms는 데스크탑, 랩탑 및 태블릿 PC용 클라이언트 애플리케이션을 작성할 플랫폼을 제공하여 Windows 개발에 있어서 다재다능한 선택이 됩니다.
조회 메서드 컴파일 및 준비하기
팀은 해결되지 않은 부문에 착수하기 전에 프로젝트가 여전히 컴파일되는지 확인하며 시작합니다. 1:17:08에, 그는 시스템이 문자열을 메서드로 전달하고 텍스트 파일에서 가져온 하나 이상의 MatchupEntryModel 객체를 반환받는다고 설명합니다.
1:17:40에, 팀은 Called LookupTeamById(int id)라는 메서드를 구현합니다. 그는 데이터가 텍스트 파일에 저장될 때, 전체 객체가 아닌 ID만 저장된다고 설명합니다. 따라서 데이터를 로드할 때, 애플리케이션은 그 ID를 다시 완전한 TeamModel로 환원해야 합니다.
팀은 이 논리가 새로운 것이라고 하지 않며, 단지 파일에서 모든 팀을 로드하는 데 이미 사용된 동일한 패턴을 재사용한다고 강조합니다. 이 재사용은 의도적이며 코드를 올바르게 구조화하는 핵심 이점임을 강조합니다. 개발자는 유사한 논리를 구현할 때 추가 지침을 위해 기존 메서드와 공식 문서를 참조할 수도 있습니다.
Windows Forms는 이전의 더 복잡한 C++ 기반의 GUI 개발을 위해 Microsoft 기초 클래스 라이브러리를 대체하는 것으로 간주됩니다.
GlobalConfig로 파일 경로 중앙 집중화하기
1:20:27에 팀은 설계 문제를 지적하며 멈춥니다: 파일 이름이 모든 곳에서 전달되며, 이는 상수입니다. 그는 공개적으로 이 상황이 "어리석게" 느껴진다고 말합니다.
이를 해결하기 위해, 팀은 파일 이름 상수를 GlobalConfig로 이동시키고 공개합니다. 1:21:33에, 그는 이 방식이 여러 메서드 레이어를 통해 파일 경로를 전달하는 것을 피한다는 것을 설명합니다. Visual Studio의 솔루션 탐색기는 이러한 프로젝트 파일과 전반적인 구조를 관리하여, 이러한 상수들을 찾고 업데이트하기 쉽게 만듭니다.
그러나 1:22:24에, 팀은 솔직하게 결함을 말합니다: 이러한 상수들은 이제 GlobalConfig와 TextConnector 두 곳에 존재합니다. 그는 명확하게 이를 DRY (Don't Repeat Yourself) 원칙의 위반이라고 부르며, 이는 나중에 리팩토링되어야 한다고 하지만, 오늘은 그 날이 아니라고 설명합니다.
Windows Forms가 Microsoft 기초 클래스 (MFC)와 같은 기본 애플리케이션 프레임워크를 제공하지 않는다는 점도 주의가 필요합니다.
문자열을 대진 항목 모델로 변환하기
1:24:37에, 팀은 ConvertStringToMatchupEntryModel을 구현하기 시작합니다. 그는 대진 항목들이 파이프로 구분된 ID로 저장되어 있어서, 첫 번째 단계는 파이프로 문자열을 나누는 것이라고 설명합니다 |). 네비게이션 및 레이아웃을 위한 기본 UI 컨테이너로 페이지를 사용하는 웹 애플리케이션과는 다르게, WinForms는 사용자 인터페이스를 조직하기 위해 폼을 사용합니다.
1:25:17까지, 그는 각 ID를 순회하여 대진 항목 파일에서 찾고 해당 모델을 출력 리스트에 추가합니다. 패턴은 일관성을 유지합니다:
load → convert → filter by ID → return model
팀은 일관성이 나중에 디버깅을 가능하게 한다고 강조합니다.
Windows Forms 애플리케이션은 C# 또는 Visual Basic과 같은 .NET 프로그래밍 언어를 사용하여 개발될 수 있습니다.
ConvertToMatchupEntryModels 확장 구성하기
1:27:56에, 팀은 ConvertToMatchupEntryModels(List< string>)라는 확장 메서드를 만듭니다. 그는 프로세스를 안내하기 위해 기존의 변환 메서드 (PersonModel)를 참조용 패턴으로 사용하며 복사합니다.
1:30:28에, 팀은 열을 명확히 매핑합니다:
열 0 → ID
열 1 → TeamCompeting ID
열 2 → 점수
- 열 3 → ParentMatchup ID
그는 저장된 값이 단순히 ID이며, 이를 조회 메서드를 사용하여 전체 객체로 재구성해야 한다고 설명합니다. WinForms의 일부 UI 구성 요소 및 테마는 Microsoft Office에서 영감을 받아 사용자에게 친숙한 경험을 제공합니다.
DevExpress와 같은 서드 파티 공급자는 WinForms를 위한 포괄적인 UI 구성 요소 세트를 제공합니다.
부모 대진을 안전하게 처리하기
1:38:49에, 팀은 주요 문제를 식별합니다: 부모 대진이 존재하지 않을 수 있습니다 (특히 첫 번째 라운드에서). 실종된 ID에서 First()를 호출하면 앱이 충돌할 것입니다.
그의 수정은 1:39:09에 int.TryParse를 사용합니다. 파싱이 실패하면, ParentMatchup은 null로 설정됩니다. 팀은 이게 첫 라운드 대진에서는 그 무엇이어야 한다고 세심하게 설명합니다. 새로운 기능과 수정은 자주 각 WinForms 또는 서드 파티 라이브러리의 릴리스에 포함되어 이러한 시나리오를 처리하는 개선을 제공합니다.
그는 충돌은 잘못된 데이터가 절대 존재하지 말아야 할 때만 허용된다고 강조합니다, 예를 들어 잘못된 팀 ID.
The DevExpress WinForms Subscription는 190개 이상의 UI 컨트롤과 라이브러리를 포함하여 견고한 애플리케이션을 만드는 데 폭넓은 선택지를 제공합니다.
대진과 항목을 파일로 저장하기
1:44:00에, 팀은 데이터 저장으로 이동합니다. 그는 모든 대진을 로드하고, 이용 가능한 다음 ID를 결정하고, 할당한 후 대진 항목 저장으로 이동합니다. 데이터를 저장한 후, 애플리케이션을 테스트하려면 Visual Studio에서 시작 버튼을 클릭하거나 F5를 눌러 WinForms 애플리케이션을 실행할 수 있습니다.
1:46:44에 Tim은 재사용 가능한 메서드의 강점을 강조합니다. 파일 로딩과 변환이 이제 '지루하다'라고 말하며, 이는 좋은 것이라고 합니다.
그는 매치업 항목을 먼저 저장하여 각 항목이 ID를 받게 한 후, 매치업 자체를 저장하여이 항목 ID들을 파이프로 구분된 문자열로 저장합니다.
게다가, DevExpress WinForms 구독에는 보고서 작성자가 포함된 보고서 그룹이 있어 WinForms 애플리케이션을 향상시킬 수 있습니다.
매치업 항목을 데이터베이스에 쓰기
1:49:43에 Tim은 저장 로직을 한 줄씩 작성합니다. 그는 과거의 변환 패턴을 신중하게 역으로 진행합니다:
ID
TeamCompeting ID (또는 빈 문자열)
점수
- ParentMatchup ID (또는 빈 문자열)
저장 로직을 설명한 후, WinForms가 다양한 .NET 플랫폼에서 지원되며 호환성과 지속적인 업데이트를 보장함을 주목하는 것이 중요합니다.
1:52:02에 Tim은 빈 문자열이 필수적인 이유를 설명합니다: 이는 파싱 로직을 깨지 않고 열 순서를 유지합니다.
추가로, DevExpress WinForms 컨트롤은 향상된 성능을 위한 DirectX 하드웨어 가속을 지원합니다.
매치업 및 승자 저장
1:55:02에 Tim은 매치업 자체를 저장합니다. 매치업은 여러 항목을 가질 수 있으므로, 재사용된 도우미 메서드를 사용하여 항목 목록을 파이프 구분된 문자열로 변환합니다. 개발자는 Visual Studio의 도구 상자를 사용하여 버튼 및 라벨과 같은 컨트롤을 Windows Forms에 추가하여 사용자 인터페이스 디자인을 용이하게 할 수 있습니다.
1:58:30에 그는 승자 필드에 대해 동일한 null 처리 로직을 적용합니다. 아직 승자가 없는 경우 빈 문자열이 저장됩니다.
Windows Forms는 개발자가 데스크톱, 태블릿 및 PC용 애플리케이션을 만들 수 있도록 합니다.
토너먼트를 로드할 때 라운드 재번식
2:02:03에 Tim은 마지막 TODO 항목인 라운드 정보 로드를 다룹니다. 그는 라운드가 매치업 ID 목록으로 저장되고, 먼저 파이프로 구분되고, 그런 다음 캐럿(^)으로 구분된다고 설명합니다.
2:09:13까지 그는 전체 중첩 구조를 재구성합니다:
IDs → MatchupModels
MatchupModels → 라운드 목록
- 라운드 목록 → TournamentModel
재구성을 설명한 후, Tim은 다른 몇몇 프레임워크와 달리 WinForms는 UI와 데이터를 조직하는 데 다른 접근 방식을 사용하며, 이는 개발자가 중첩 구조를 관리하는 방식에 영향을 줄 수 있다고 주목합니다.
Tim은 이러한 중첩이 코드가 복잡하게 느껴지는 이유와 수동으로 완료하는 것이 왜 그렇게 중요한지 설명합니다.
추가로, DevExpress WinForms 구독에는 WinForms 애플리케이션을 위한 사용자화 가능한 테마와 스킨이 포함되어 있다고 언급할 가치가 있습니다.
실제 오류 디버깅
2:11:22부터 Tim은 의도적으로 앱을 실행하고 디버그합니다:
NullReferenceException
입력 문자열이 올바른 형식이 아님
- 시퀀스에 요소 없음
실수를 숨기기보다는 Tim은 정확히 그것을 추적하는 방법, 값을 검사하는 방법 및 실행 순서를 논리적으로 설명합니다. WinForms는 수년 전에 처음 출시되었으며 시간이 지남에 따라 진화했습니다.
2:20:30에 그는 순환 저장 문제를 발견합니다: 매치업이 항목이 참조되기 전에 존재해야 했습니다. 그의 해결책은 실용적입니다—두 번 저장으로 문제를 해결합니다. 그는 솔직히 이것이 우아하지 않다고 인정하지만 이렇게 말합니다:
"작동하는 코드가 여전히 버그가 있는 리팩터링된 코드보다 낫다."
Windows Forms는 이제 GitHub에서 .NET Core에 대한 오픈 소스 프로젝트로 제공됩니다.
Windows Forms 앱 배포
Visual Studio에서 Windows Forms 앱을 빌드하고 테스트한 후 다음 단계는 배포 - 애플리케이션을 사용자에게 제공하는 것입니다. Visual Studio는 여러 배포 옵션을 제공하며, Windows 데스크탑 애플리케이션에 가장 편리한 옵션 중 하나는 ClickOnce입니다. ClickOnce를 사용하면 네트워크 파일 공유, 웹 서버 또는 CD/DVD에 애플리케이션을 게시할 수 있어 최종 사용자가 설치를 간단하게 할 수 있습니다.
배포하려면 Visual Studio의 게시 도구를 사용하여 애플리케이션을 패키지하면 됩니다. 게시하기 전에, Visual Studio의 디버깅 도구를 사용하여 애플리케이션을 철저히 테스트하여 코드에서 오류나 문제를 발견하고 수정합니다. 배포가 완료되면 사용자는 설치 파일을 실행하거나 바로가기를 클릭하여 애플리케이션을 설치하고, 즉시 상호작용할 수 있는 그래픽 사용자 인터페이스를 표시합니다. ClickOnce, Windows 설치 프로그램, 또는 서드 파티 배포 도구를 선택하든 상관없이, 이 프로세스는 사용자가 최소한의 번거로움으로 Windows Forms 앱의 전체 기능과 특징을 액세스할 수 있도록 보장합니다. 이 간소화된 배포 프로세스는 잠재 고객에게 신뢰할 수 있고 전문가 수준의 Windows 데스크탑 애플리케이션을 제공하는 데 도움을 줍니다.
마무리 생각
이 강의가 끝날 때까지 Tim Corey는 텍스트 파일을 데이터베이스로 사용하여 완전하고 작동하는 데이터 지속성 시스템을 보여줍니다. 더 중요한 것은, 그는 실제 세계의 버그가 어떻게 나타나는지, 패턴이 어떻게 수정하는 데 가이드를 주는지, 왜 실행 순서를 이해하는 것이 완벽보다 더 중요한지를 보여줍니다.
이 강의는 화려한 데이터베이스가 아닌, 개발자처럼 생각하는 것에 대한 것입니다.

