C# wpf 대량의 데이터를 어떻게 불러오나요?

저번에 말씀 드린대로 주기율표를 만드려고 했는데 저번에 winform으로 만든 프로그램에서 배열을 사용해서 라벨에 적용시켰습니다. 근데 그렇게 하면 문제점이 코드가 너무 길어지고 효율설도 떨어집니다. 또한 프로그램이 너무 무거워진 것 같습니다. 배열 말고 대량의 데이터들을 데이터베이스에 입력시켜서 data grid view로 표현하는 것이 최선인것일까요??

좋아요 4

gloomn님이 생각하시는 수준은 사실 업무적으로는 대량의 데이터라고 하지는 않습니다. 어쨌든 나름의 이해를 해서, 다음의 기준으로 데이터베이스에 적재할 것인지, 파일로 적재할 것인지, 소스 코드로 적재할 것인지를 결정할 수 있습니다.

  1. 데이터가 배포 후에도 변경되어야 하고 자주 추가되거나 삭제되어야 하는가?
    → 온라인 서비스가 아닐 경우, SQLite 등 파일 스토리지를 이용해 관리하면 좋습니다.
  2. 파일로 관리될 수 있는 수준의 수십 메가의 데이터이다.
    → 이럴 때는 직렬/역직렬 라이브러리를 이용해 JSON 또는 바이너리로 파일에 저장해서 관리할 수 있습니다.
  3. 데이터가 수정되지 않거나 수정되더라도 프로그램 배포 주기와 같다
    → 이럴 때는 그냥 소스코드에 적재하는 것도 좋은 방법입니다.

WPF에서는 데이터 바인딩을 통해 값을 표현할 수 있을 뿐 아니라 목록도 표현이 가능합니다. 데이터 바인딩 관련 MS 문서를 참고하면 도움이 됩니다.

개요 수준은 위의 문서로 이해할 수 있고 링크를 따라 가면 어떻게 구현하는지도 알 수 있습니다.

WPF는 두가지 방법을 모두 제공합니다. 1. XAML에서 목록을 바로 표현하는 방법 2. 바인딩을 통해 순수 목록 및 정보를 각종 Template를 이용해서 비쥬얼하게 표현하는 방법

그런데 만들고자 하는 정도의 데이터 량은 대량의 데이터라고 할 수 있는 정도는 아니고,

클래스로 정보를 잘 표현한 후, 주기율표에 맞게 IEnumerable로 잘 바인딩 하면 됩니다.

제 생각에는 목록 바인딩을 먼저 시도하기 보다는,

UserControl에 개별로 바인딩도 가능하니, 그렇게 진행해보는건 어떨까 하네요.

좋아요 5

Json파일로 관리하고 싶은데 이때 데이터 바인딩은 어떻게 하나요??

좋아요 1

대표적으로 Newtonsoft.Json의 경우 클래스의 인스턴스로 직렬화 하여 JSON으로 만들고 JSON을 역직렬화 하여 클래스의 인스턴스로 만들 수 있습니다. 그런 후 최종적으로 데이터 바인딩의 대상은 클래스 인스턴스가 됩니다. 결국 일반 바인딩 방식과 다른 점이 없어요.

JObject 말고, Newtonsoft.Json (또는 System.Text.Json) 에서 직렬/역직렬 샘플을 해보세요.

https://www.newtonsoft.com/json/help/html/SerializingJSON.htm

좋아요 2

아직 직렬화, 역직렬화에 대한 개념이 부족해서 더 공부해 봐야겠네요 ㅠㅠ

좋아요 2

저도 json 직렬화가 좋을 것 같아요. 가장 쉽고 간단하면서 잘 보이기 때문입니다.

json이 싫으면 xml도 있긴 한데 이건 쉽지만 눈으로 보기엔 간단해보이지도 않고 XmlArray 태그랑 상속 클래스 들어가면 일부 제약이 있어 어려울 겁니다.

좋아요 1

혹시 json 직렬화 예제가 있을까요??

예제는 인터넷에 많이 검색이 됩니다. 위에 제가 링크한 것도 예제 이고요,
구글링을 하면 됩니다.

키워드 : newtonsoft.json serialize sample
검색결과 :

Samples (newtonsoft.com)

직렬화/역질렬화에서 많이 사용하는 기법이 클래스 인스턴스를 JSON으로 변환(직렬화)하고
JSON을 클래스 인스턴스로 변환(역직렬화)하는 방법입니다.

여기서 필요로 하는 것은 클래스를 엔티티(DAO) 형태로 표현하는 것입니다.

예시)

public class UserInfo
{
    public string UserCode { get; set; }
    public string UserName { get; set; }
}

예제에서는

public class Account
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public IList<string> Roles { get; set; }
}

이런 것 입니다.

클래스로 원자의 정보를 표현하고 그것을 목록으로 만든 후 직렬화 하면 아름답게(?!) JSON으로 변환됩니다.

좋아요 2

참고로 바이너리로 직렬화 하고 싶다 하면 protobuf를 이용하거나 MessagePack을 이용할 수 있습니다.

좋아요 2

protobuf와 메시지 팩은 지금 고려하지 않으셔도 될 것 같습니다. 수준이 많이 높은 것 같지만 알아두면 좋은 내용이네요 :slight_smile:

좋아요 2

그러면 원소의 모든 정보를 클래스에 다 담은 다음에 그것을 직렬화 시켜서 json으로 변환한다음에 json파일에서 xaml로 데이터 바인딩을 하는 것인가요??

좋아요 1

아니에요. 클래스 인스턴스로 바인딩 하는 겁니다. JSON으로 파일로 저장하는것은 프로그램 종료 이후에도 데이터를 유지하기 위함이에요

좋아요 2

https://dotnetfiddle.net/Bep3jT

.NET Fiddle을 처음 써봐서 잘 될지 모르겠네요. 링크 들어가면

Json.NET을 이용해서 주기율표(부분)을 JSON으로 변환하고 다시 인스턴스로 역직렬화 하는 예제를 볼 수 있습니다.

좋아요 3

그럼 직렬화 역직렬화를 하면 클래스에 인스턴스가 생기고 json도 클래스 파일안에 생기는 것인가요??

좋아요 1

표현이 제가 쓰는 표현과 달라 좀 헷갈리는데, 일반적으로 JSON 직렬/역직렬은

클래스 인스턴스 <–> JSON 문자열을 말합니다.

파일로의 저장은 JSON 문자열을 그대로 파일로 저장할 뿐입니다. 반대로 파일에서 불러오는 것은 JSON 문자열로 읽어서 역직렬화를 통해 인스턴스를 생성하는 것이에요.

그러니까 클래스에 인스턴스가 생긴다는것과 JSON도 클래스 파일안에라는 표현이 맞지는 않는것 같습니다.

  • 클래스의 인스턴스 → 직렬화 → JSON 문자열 → 파일 저장 → 파일
  • 파일 → 파일 불러오기 → JSON 문자열 → 역직렬화 → 클래스의 인스턴스

이렇게 이해하는게 맞습니다.

클래스의 인스턴스는 데이터 그 자체입니다. JSON 파일명 등 이것을 메타정보라고 하는데 그것은 별도로 관리를 해야 합니다.

좋아요 3

아하 그렇군요! 덕분에 이해가 잘 되었습니다!

좋아요 1