푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 애플리케이션
C# 애플리케이션

다른 카테고리

C# 텍스트 연결에 대한 깊은 탐구

Tim Corey
1h 15m 23s

Tim Corey의 "C# 앱 처음부터 끝까지" 시리즈의 11번째 수업에서 팀은 텍스트 기반 데이터 연결을 사용하여 텍스트 파일에 데이터를 저장하는 방법을 설명합니다. 팀은 시청자들에게 이전 수업에서 SQL 연결 및 주요 정리 작업들을 설정했음을 상기시키며 시작합니다. 이제 텍스트 연결에 초점을 맞추고 있으며, 목표는 시스템이 PrizeModel을 받아와 ID가 올바르게 채워진 상태로 반환되도록 텍스트 연결이 SQL 연결과 마찬가지로 작동하도록 만드는 것입니다. 팀은 영상이 간단한 텍스트 파일을 사용하여 데이터를 저장, 읽기 및 업데이트하는 전체 워크플로우를 보여주겠다고 강조합니다.

솔루션 — 텍스트 연결 설정

팀은 DataAccess 폴더 내에서 텍스트 커넥터를 열면서 시작합니다. 그는 샘플 코드를 삭제하고 처음부터 시작합니다. 그는 SQL과 달리 텍스트 파일이 자동 증가하는 ID와 같은 스마트 데이터베이스 기능을 제공하지 않음을 설명합니다. 따라서 첫 번째 작업은 텍스트 파일을 어디에 저장할지를 결정하는 것입니다.

팀은 깨끗한 디자인을 제안합니다: 각 모델을 자신의 텍스트 파일에 저장합니다. 예를 들어, PrizeModel은 PrizeModels.csv라는 자체 파일을 가지게 될 것이며, MatchupModel과 같은 다른 모델은 각각 별도의 파일을 갖게 됩니다. 팀은 이 구조를 SQL 테이블과 비교합니다. 각 파일이 해당 모델의 목록을 포함하는 "테이블"이 됩니다. 이것은 데이터를 쉽게 관리할 수 있고 다른 모델 타입이 혼합되는 것을 방지합니다.

연결 문자열 — 파일 경로 저장

팀은 단일 파일 이름을 저장하는 대신 모든 파일이 저장될 폴더로의 경로를 저장한다고 설명합니다. 이 경로는 app.config의 appSettings 아래에 배치됩니다. 팀은 새로운 키-값 쌍을 추가합니다:

  • 키: filePath

  • 값: 파일이 저장될 폴더 경로

그는 올바른 Windows 구문을 사용하는 것을 강조하고 전체 파일 경로를 구축할 때만 슬래시를 추가하는 것을 선호하기 때문에 경로 끝에 슬래시를 붙이는 것을 피합니다. 이 설정은 중요합니다. 왜냐하면 저장소 위치가 변경되면 app.config만 업데이트하면 되기 때문입니다.

계획 — 텍스트 연결 작동 방식

팀은 상을 저장하기 위한 명확한 계획을 제시합니다:

  1. 모든 상이 포함된 텍스트 파일을 로드합니다.

  2. 텍스트 줄을 PrizeModel의 목록으로 변환합니다.

  3. 목록에서 가장 높은 ID를 찾아 새 ID를 = 가장 높은 ID + 1로 설정합니다.

  4. 새로운 상 모델을 목록에 추가합니다.

  5. 상 목록을 다시 텍스트 라인으로 변환합니다.

  6. 목록을 텍스트 파일에 저장하여 오래된 데이터를 덮어씁니다.

팀은 텍스트 파일이 SQL 데이터베이스에 비해 "어리석다"고 설명합니다. SQL은 ID를 자동으로 관리할 수 있지만 텍스트 파일은 개발자가 직접 논리를 구현해야 합니다. 이것이 팀이 코드를 깨끗하고 재사용 가능하게 유지하기 위해 프로세스를 더 작은 메서드로 나눈 이유입니다.

새로운 클래스 생성 — 텍스트 커넥터 프로세서

팀은 TextConnectorProcessor라는 새로운 클래스를 생성합니다. 그는 메인 네임스페이스를 혼잡하지 않게 하기 위해 DataAccess 폴더 안에 있지만 다른 네임스페이스에 배치합니다. 팀은 네임스페이스가 유연하게 맞춤화될 수 있지만, 단순하고 깔끔하게 유지하는 것을 권장합니다.

그는 클래스를 공개 정적으로 만들고 도우미 메서드를 구축하기 시작합니다.

확장 메서드 — 전체 파일 경로

팀은 확장 메서드를 생성합니다:

public static string FullFilePath(this string fileName)

이 메서드는 app.config의 filePath와 파일 이름을 결합하여 전체 파일 경로를 생성합니다. Tim은 ConfigurationManager.AppSettings["filePath"]을 어떻게 사용하는지 시연하고 C# 문자열에서는 슬래시를 이스케이프해야 하는 필요성을 설명합니다(\를 사용하여).

그 후 그는 메서드를 확장 메서드로 변환하여 다음과 같이 사용할 수 있게 합니다:

"PrizeModels.csv".FullFilePath()

Tim은 이 확장 메서드가 텍스트 커넥터에만 필요하므로 솔루션 전체에서 항상 보이는 것을 피하기 위해 별도의 네임스페이스에 보관합니다.

파일 로드 메서드 — 텍스트 데이터 읽기

다음으로 Tim은 또 다른 확장 메서드를 만듭니다:

public static List<string> LoadFile(this string file)

이 메서드는 파일이 존재하는지 File.Exists()를 사용하여 확인합니다. 파일이 존재하지 않으면 빈 리스트를 반환하고, 존재하면 File.ReadAllLines()를 사용하여 모든 줄을 읽어 리스트로 변환합니다.

Tim은 이 애플리케이션의 첫 실행시 누락된 파일을 적절히 처리하는 것이 중요함을 강조합니다.

텍스트를 상 모델로 변환하기

Tim은 로드된 텍스트 줄들을 상 모델 리스트로 변환하는 메서드를 만듭니다:

public static List<PrizeModel> ConvertToPrizeModels(this List<string> lines)

그는 각 줄이 콤마로 구분된 값(CSV)으로 필드가 콤마로 구분되어 있음을 설명합니다. Tim은 각 줄을 열로 나누고 적절한 데이터 유형으로 구문 분석합니다:

  • ID → int.Parse()

  • PlaceNumber → int.Parse()

  • PlaceName → string

  • PrizeAmount → decimal.Parse()

  • PrizePercentage → double.Parse()

Tim은 또한 데이터가 유효하지 않을 경우 애플리케이션이 의도적으로 충돌하도록 한다고 설명합니다. 이것은 데이터를 손상된 상태로 계속 유지하는 대신 문제를 초기 단계에서 나타나게 하는 것의 이점을 제공합니다.

최대 ID 찾기

Tim은 텍스트 커넥터로 돌아가 가장 높은 ID를 찾는 방법을 설명합니다:

int currentID = prizes.OrderByDescending(x => x.ID).First().ID + 1;

그는 파일이 비어 있다면 충돌할 수 있어서 체크를 추가합니다:

if(prizes.Count > 0)
{
    currentID = prizes.OrderByDescending(x => x.ID).First().ID + 1;
}

이것은 첫 번째 기록이 1의 ID를 갖도록 보장합니다.

모델 추가 및 저장

Tim은 리스트에 새 상을 추가한 다음, 리스트를 다시 텍스트 라인으로 변환합니다:

public static void SaveToPrizeFile(this List<PrizeModel> models, string fileName)

그는 문자열 보간법을 사용하여 각 CSV 라인을 만들어 문자열 리스트에 추가합니다. 마지막으로 그는 다음을 사용합니다:

File.WriteAllLines(fileName.FullFilePath(), lines);

Tim은 WriteAllLines가 파일을 덮어쓰는 것이 바람직한 동작이라고 설명하는데, 이는 데이터가 업데이트된 내용으로 새로 고쳐지기 때문입니다.

모델 반환

Tim은 ID가 지정된 PrizeModel을 반환함으로써 메서드를 종료합니다. 이는 다른 애플리케이션에서 SQL처럼 새 상을 사용할 수 있게 합니다.

텍스트 연결 테스트하기

Tim은 Program.cs로 전환하여 데이터 연결을 SQL에서 텍스트로 변경합니다. 애플리케이션을 실행하고 상을 생성할 때, 시스템은 처음에 기록이 누락되어 충돌합니다. Tim은 bug(버그)를 if(prizes.Count > 0) 체크로 빠르게 수정한 다음 다시 실행합니다.

그는 데이터가 PrizeModels.csv 파일에 정확하게 저장되었음을 입증하고 파일을 Notepad 또는 Excel에서 여는 방법을 보여줍니다.

최종 생각 — 확장 메서드와 네임스페이스

Tim은 강의를 마치면서 확장 메서드가 올바른 네임스페이스가 포함될 때만 나타난다고 시청자들에게 상기시킵니다. 이는 복잡함과 잠재적인 네이밍 충돌을 피하는 데 도움이 됩니다. 그는 이 두 가지 강의가 애플리케이션의 나머지를 위한 강력한 기초를 만들고 있으며 향후 개발을 위한 무대를 마련한다고 언급합니다.

Hero Worlddot related to C# 텍스트 연결에 대한 깊은 탐구
Hero Affiliate related to C# 텍스트 연결에 대한 깊은 탐구

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

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

아이언 서포트 팀

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