C# 애플리케이션 개발: Tim Corey의 “팀 폼 만들기 파트 2” 심층 분석 (레슨 13)
이 기사에서는 Tim Corey의 "C# App Start to Finish" 시리즈 강의 13번을 따라 C# 애플리케이션 개발을 더 깊게 살펴볼 것입니다. Tim은 어떻게 UI 컨트롤(콤보 박스, 리스트 박스 및 버튼)이 데이터와 연결되는지를 집중하여 기능적인 Windows Forms 애플리케이션 구축 과정을 보여줍니다. 이 강의는 데이터 바인딩, 리스트 관리, Dapper를 사용한 데이터베이스 연결, 기본 검증 및 디버깅과 같은 주요 개념을 시연하여 실제 C# 애플리케이션 구축에 필수적인 기술들을 제공합니다.
Create Team Form 계속하기
Tim은 Lesson 13이 "Add New Member" 섹션이 연결된 이전 비디오의 연속임을 상기시킵니다. 이 강의에서 Tim은 주 목표가 드롭다운(콤보 박스)과 리스트 박스를 연결하고 새로 생성된 사람 객체를 연결하여 리스트에 나타나도록 하는 것이라고 설명합니다. Tim은 계획을 명확히 설정합니다: 이 강의는 UI 연결, 데이터 이동 및 리스트 동기화에 집중할 것입니다—C# 데스크톱 애플리케이션을 구축하는 기본적인 측면.
드롭다운과 리스트 박스 데이터 이해하기
Tim은 콤보 박스와 리스트 박스 뒤에는 Person 객체의 리스트가 있을 것임을 설명합니다. 이것은 UI 요소가 데이터 모델 컬렉션에 바인딩되는 Windows Forms의 데이터 바인딩의 고전적 예입니다.
그는 클래스 레벨에서 두 개의 비공개 리스트를 만듭니다:
availableTeamMembers – 팀에 추가할 수 있는 사람들
- selectedTeamMembers – 팀에 이미 추가된 사람들
Tim은 기대되는 동작을 명확히 합니다: 드롭다운에서 사람을 선택하고 추가하면 그들은 availableTeamMembers에서 selectedTeamMembers로 이동해야 합니다. 이것은 UI가 기본 데이터를 반영하는 데스크톱 앱 개발에서 표준적인 CRUD 운영 패턴입니다.
Tim이 팀원들을 토너먼트에 의해 제한하지 않는 이유
Tim은 "왜 팀 멤버를 토너먼트에 따라 제한하지 않는가?"라는 일반적인 디자인 질문에 대해 설명합니다. 그는 Create Team 양식이 토너먼트에 직접 연결되지 않았으며 여러 토너먼트가 동시에 실행될 수 있다고 설명합니다.
Tim은 실용적인 예를 사용합니다: 만약 농구 토너먼트와 탁구 토너먼트가 동시에 실행된다면, 한 사람은 두 개 모두에 참여할 수 있습니다. 드롭다운을 제한하는 것은 복잡한 논리를 요구하고 버그를 유발할 수 있습니다. 대신 Tim은 더 단순한 접근 방식을 선택합니다:
- 사람이 팀에 추가된 후에만 드롭다운에서 제거합니다.
이 접근 방식은 불필요한 경우 복잡성을 피하는 실용적인 소프트웨어 디자인 결정을 보여줍니다.
WireUpLists 메서드 만들기
Tim은 WireUpLists 메서드를 만들어 리스트를 UI 컨트롤에 연결합니다. 이 메서드는 availableTeamMembers 리스트를 콤보 박스에, selectedTeamMembers 리스트를 리스트 박스에 바인딩합니다.
Tim은 현대 Windows Forms에서 별도의 BindingSource를 사용하지 않고 컨트롤에 리스트를 직접 바인딩할 수 있는 주요 개선점을 지적합니다. 이것은 Windows Forms 데이터 바인딩 작업을 하는 개발자들에게 유용한 팁입니다.
Full Name을 가진 DisplayMember 추가하기
Tim은 콤보 박스가 읽을 수 있는 이름을 표시해야 한다고 설명합니다. DisplayMember 속성은 Person 모델의 문자열 속성을 기대합니다. 팀은 이름이 중복될 수 있기 때문에 이름만 사용하면 안 된다고 경고합니다.
그래서 Tim은 읽기 전용 속성인 FullName을 생성합니다:
public string FullName
{
get
{
return "$ {FirstName} $ {LastName}";
}
}이는 중요한 UI 관행을 보여줍니다: 항상 사용자 친화적인 정보를 표시하도록 UI를 설정하고 객체의 원래 데이터를 표시하지 않도록 합니다.
테스트를 위한 샘플 데이터 생성하기
Tim은 목록과 UI를 테스트하기 위해 CreateSampleData라는 메서드를 만듭니다. 그는 두 목록에 샘플 Person 객체를 추가하고 생성자에서 WireUpLists를 호출합니다.
이는 실제 데이터베이스에 연결하기 전 Windows Forms 애플리케이션을 신속하게 구축하고 테스트할 수 있는 유용한 기술입니다.
샘플 데이터를 실제 데이터로 대체하기
Tim은 샘플 데이터를 주석처리하고 실제 데이터를 로드할 준비를 합니다. 그는 IDataConnection 인터페이스에 GetPerson_All 메서드를 추가합니다. Tim은 자신의 네이밍 규칙을 설명합니다:
생성 = 삽입
- 가져오기 = 선택
이는 C# 애플리케이션의 데이터 액세스 레이어에서 표준 네이밍 전략입니다.
Dapper를 이용한 SQL 데이터 검색 구현하기
Tim은 Dapper와 저장 프로시저를 사용하여 GetPerson_All의 SQL 버전을 구현합니다:
connection.Query<PersonModel>("spPeople_GetAll").ToList();Tim은 디버깅을 쉽게 하기 위해 직접 반환 대신 출력 변수를 의도적으로 사용합니다. 이는 디버깅 관행이 코드 설계에 어떻게 영향을 미칠 수 있는지를 보여줍니다.
상수를 사용하여 중복된 코드 청소하기
Tim은 중복된 연결 문자열 이름을 상수로 변경합니다. 그는 반복이 나쁜 관행이며 나중에 오류를 초래할 수 있다고 설명합니다.
이는 중요한 소프트웨어 공학 원칙입니다: DRY (Don't Repeat Yourself).
드롭다운에 실제 데이터 로드하기
Tim은 LoadListData()를 생성하고 GetPerson_All()을 사용하여 availableTeamMembers를 채웁니다. selectedTeamMembers 목록은 빈 상태로 유지되며, 이는 새로운 팀이 시작할 때 비어 있기 때문에 올바른 것입니다.
이는 UI를 데이터베이스나 텍스트 파일과 같은 실제 데이터 원본에 연결하는 방법을 보여줍니다.
회원 추가 버튼 연결하기
Tim은 회원 추가 버튼 이벤트 핸들러를 생성합니다. 논리는 다음과 같습니다:
드롭다운에서 선택된 사람 가져오기
사용 가능 목록에서 제거
선택된 목록에 추가
- UI 새로고침
Tim은 콤보 박스가 객체를 Object로 저장하기 때문에 선택된 항목을 PersonModel로 캐스팅해야 한다고 설명합니다. 이는 C#의 형변환 및 객체 처리의 중요성을 강조합니다.
새로 고침 문제 디버깅하기
Tim은 항목을 이동한 후 UI가 새로 고쳐지지 않는다는 것을 발견합니다. 디버깅 후 해결책을 찾습니다:
DataSource를 null로 설정
- 그런 다음 목록을 다시 할당
이는 콤보 박스와 리스트 박스를 새로 고침하도록 강제합니다. Tim은 디버깅 기술이 필수적이며 데이터 바인딩이 어떻게 작동하는지 이해하는 데 종종 필요하다고 강조합니다.
선택된 제거 버튼 연결하기
Tim은 버튼 이름을 '선택된 제거'로 변경하고 이벤트 핸들러를 생성합니다. 이는 추가 작업을 반대로 수행합니다:
selectedTeamMembers에서 제거
availableTeamMembers로 다시 추가
- UI 새로고침
Tim은 버그를 발견합니다: 항목이 선택되지 않았을 경우 null 값이 추가됩니다. 그는 검증을 추가합니다:
if (p != null)
{
// 계속 진행
}이는 기본적인 검증과 오류 예방을 보여줍니다.
테스트의 중요성
Tim은 사용자가 애플리케이션을 망치려고 할 수 있다고 생각하며 테스트하는 것이 중요하다고 강조합니다. 그는 실제 사용자가 예기치 않은 작업을 수행할 수 있기 때문에 의도적으로 애플리케이션을 망치려는 테스트를 권장합니다.
이는 신뢰할 수 있는 소프트웨어 구축을 위한 중요한 교훈입니다.
'회원 생성' 버튼 연결하기
Tim은 '회원 생성' 버튼을 수정하여 새 사람을 데이터 저장소에 저장하고 즉시 선택된 목록에 추가합니다. 이는 Windows Forms 애플리케이션에서 CRUD 작업을 구현하는 방법을 보여줍니다.
텍스트 파일용 GetPerson_All 구현
Tim은 텍스트 파일 버전의 GetPerson_All이 없음을 깨닫습니다. 그는 간단한 행을 사용하여 이를 구현합니다:
return PeopleFile.FullFilePath.LoadFile().ConvertToPersonModels();이는 복잡한 로직 없이 파일 기반 저장소를 쉽게 구현할 수 있음을 보여줍니다.
모든 것이 작동하는지 확인하기
Tim은 앱을 실행하고 드롭다운이 이제 텍스트 파일과 데이터베이스에서 사람을 로드한다는 것을 확인합니다. 그는 새로운 사람을 추가하고 즉시 나타나는 것을 보고 전체 시스템이 올바르게 작동하고 있음을 보여줍니다.
다음 단계는 무엇인가요?
Tim은 다음 비디오에서 팀 자체를 생성하는 것에 중점을 둘 것이라고 설명하며 마무리합니다. 이는 데이터베이스나 텍스트 파일에 여러 데이터를 저장하여 기능을 완료하는 과정입니다.
마지막으로
Tim Corey의 레슨 13은 C# Windows Forms 애플리케이션 개발의 실제 예입니다. UI 컨트롤 연결 및 데이터 바인딩에서 디버깅과 검증까지, Tim은 실제 데스크톱 애플리케이션을 구축하는 데 필요한 실용적인 프로그래밍 기술을 가르칩니다. 이 레슨은 C#에서 데이터 바인딩, Dapper, SQL CRUD 작업 및 UI 기반 프로그래밍을 배우고 싶은 개발자에게 특히 가치가 있습니다.
학습을 계속하고 싶다면, Tim의 다음 레슨에서는 팀 생성 기능을 완료하고 모든 것을 작동 중인 애플리케이션으로 묶습니다.

