JSON 직렬화를 통한 클래스-파일 동기화

JSON 직렬화를 통한 클래스-파일 동기화

JSON 직렬화는 데이터를 간결하고 가독성 높은 JSON 형식으로 변환하여 파일에 저장하거나 네트워크를 통해 전송할 수 있는 과정입니다. JSON은 특히 웹 애플리케이션과의 데이터 교환에서 널리 사용되며, XML에 비해 더 간단하고 직관적입니다. 이번 글에서는 C#에서 JSON 직렬화를 사용하여 클래스와 파일 간 데이터를 동기화하는 방법, 주요 라이브러리, 그리고 성능 최적화 방법에 대해 소개합니다.

JSON 직렬화의 개념

JSON 직렬화는 객체 데이터를 텍스트 형식의 JSON 문자열로 변환하는 것입니다. 이러한 변환 과정을 통해 데이터를 파일로 저장하거나 네트워크를 통해 전송할 수 있습니다. 역직렬화는 JSON 문자열을 다시 객체로 복원하는 과정입니다. JSON은 데이터를 직관적이고 간결하게 표현할 수 있어 설정 파일이나 API 데이터 교환에서 자주 사용됩니다.

JSON 직렬화를 사용하는 방법

C#에서 JSON 직렬화를 수행하기 위해 System.Text.Json 또는 Newtonsoft.Json 라이브러리를 사용할 수 있습니다. 이 두 라이브러리는 JSON 직렬화를 손쉽게 처리할 수 있도록 도와줍니다.

System.Text.Json을 사용한 직렬화

System.Text.Json은 .NET Core와 .NET 5 이상에서 기본적으로 제공되는 경량의 JSON 직렬화 라이브러리입니다. JSON 직렬화를 위해 이 라이브러리를 사용하는 방법을 살펴보겠습니다.

using System.Text.Json;
public static void SaveUserSettings(UserSettings settings, string filePath)
{
    string jsonString = JsonSerializer.Serialize(settings);
    File.WriteAllText(filePath, jsonString);
}

위 코드는 UserSettings 객체를 JSON 문자열로 직렬화하여 파일에 저장하는 예제입니다. JsonSerializer.Serialize 메서드를 사용해 객체를 JSON 문자열로 변환합니다.

JSON에서 객체로 역직렬화하기

파일에 저장된 JSON 문자열을 객체로 복원하려면 JsonSerializer.Deserialize 메서드를 사용합니다.

public static UserSettings LoadUserSettings(string filePath)
{
    string jsonString = File.ReadAllText(filePath);
    return JsonSerializer.Deserialize<UserSettings>(jsonString);
}

이 코드는 파일에서 JSON 문자열을 읽어와 UserSettings 객체로 변환합니다.

Newtonsoft.Json을 사용한 직렬화

Newtonsoft.Json (또는 Json.NET)은 C#에서 가장 널리 사용되는 JSON 직렬화 라이브러리 중 하나입니다. 유연한 기능과 높은 호환성 덕분에 많은 개발자들이 사용하고 있습니다.

JSON 직렬화와 역직렬화 예제

using Newtonsoft.Json;
public static void SaveUserSettings(UserSettings settings, string filePath)
{
    string jsonString = JsonConvert.SerializeObject(settings, Formatting.Indented);
    File.WriteAllText(filePath, jsonString);
}
public static UserSettings LoadUserSettings(string filePath)
{
    string jsonString = File.ReadAllText(filePath);
    return JsonConvert.DeserializeObject<UserSettings>(jsonString);
}

위 코드에서 JsonConvert.SerializeObject 메서드를 사용하여 객체를 JSON 문자열로 변환하고, JsonConvert.DeserializeObject 메서드를 사용하여 파일에서 JSON 데이터를 읽어와 객체로 변환합니다. Formatting.Indented 옵션을 사용하면 JSON 출력이 사람이 읽기 쉽도록 들여쓰기가 적용됩니다.

컬렉션의 직렬화

여러 객체를 JSON 형식으로 저장해야 하는 경우에는 리스트와 같은 컬렉션을 직렬화할 수 있습니다. 여러 사용자 설정을 JSON 파일로 저장하는 예제를 보겠습니다.

컬렉션 직렬화 예제

ApplicationSettings 클래스를 정의하여 여러 사용자의 설정을 관리합니다.

public class ApplicationSettings
{
    public List<UserSettings> Users { get; set; }
    public ApplicationSettings()
    {
        Users = new List<UserSettings>();
    }
}

이제 ApplicationSettings 객체를 JSON 파일에 저장하고 불러오는 메서드를 구현합니다.

public static void SaveApplicationSettings(ApplicationSettings appSettings, string filePath)
{
    string jsonString = JsonSerializer.Serialize(appSettings);
    File.WriteAllText(filePath, jsonString);
}
public static ApplicationSettings LoadApplicationSettings(string filePath)
{
    string jsonString = File.ReadAllText(filePath);
    return JsonSerializer.Deserialize<ApplicationSettings>(jsonString);
}

위 예제에서는 여러 객체를 포함하는 컬렉션을 JSON 파일에 저장하고 불러올 수 있습니다.

JSON 직렬화의 유용한 팁

기본값 무시하기

기본값을 직렬화하지 않도록 하여 파일 크기를 줄이고 불필요한 정보를 제거할 수 있습니다.

public class UserSettings
{
    public string UserName { get; set; }
    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
    public int FontSize { get; set; } = 12;
    public string Theme { get; set; }
}

JsonIgnoreCondition.WhenWritingDefault를 사용하여 FontSize가 기본값인 경우 직렬화에서 제외합니다.

옵션 설정을 통한 커스터마이징

JSON 직렬화 시 JsonSerializerOptions을 사용하여 다양한 옵션을 설정할 수 있습니다.

var options = new JsonSerializerOptions
{
    WriteIndented = true,
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
string jsonString = JsonSerializer.Serialize(settings, options);

위 예제에서는 WriteIndented 옵션을 사용하여 JSON을 들여쓰기 형식으로 출력하고, PropertyNamingPolicy를 CamelCase로 설정하여 JSON 형식에서 속성 이름을 소문자로 시작하도록 합니다.

JSON 직렬화의 장단점

장점

  • 간결성: JSON은 간단하고 직관적인 형식으로, XML보다 더 가볍고 읽기 쉽습니다.
  • 웹과의 호환성: JSON은 JavaScript와 자연스럽게 호환되며, 웹 애플리케이션과 API에서 자주 사용됩니다.
  • 다양한 플랫폼에서 사용 가능: JSON은 대부분의 프로그래밍 언어에서 쉽게 사용할 수 있어 플랫폼 간 데이터 교환에 적합합니다.

단점

  • 복잡한 구조 표현의 제한: JSON은 XML과 달리 복잡한 데이터 구조나 관계를 표현하는 데 한계가 있을 수 있습니다.
  • 스키마 검증 기능 미비: XML처럼 스키마(XSD)를 통해 데이터 검증을 강제할 수 있는 내장 기능이 없습니다.

JSON 직렬화 시 성능 최적화 전략

System.Text.JsonNewtonsoft.Json의 비교

  • System.Text.Json은 가벼운 직렬화 라이브러리로, 성능과 메모리 효율성이 좋습니다. 단, 기능이 제한적이며 복잡한 직렬화 시 Newtonsoft.Json보다 어려울 수 있습니다.
  • Newtonsoft.Json은 유연성과 기능 면에서 뛰어나며, 사용자 정의 직렬화 로직을 쉽게 작성할 수 있습니다. 하지만 System.Text.Json에 비해 메모리 사용량이 많고 성능이 다소 떨어질 수 있습니다.

큰 파일을 다룰 때 비동기 처리 사용

큰 JSON 파일을 다룰 때는 비동기 처리를 사용하여 성능을 향상시킬 수 있습니다.

public static async Task SaveUserSettingsAsync(UserSettings settings, string filePath)
{
    using FileStream fs = new FileStream(filePath, FileMode.Create);
    await JsonSerializer.SerializeAsync(fs, settings);
}
public static async Task<UserSettings> LoadUserSettingsAsync(string filePath)
{
    using FileStream fs = new FileStream(filePath, FileMode.Open);
    return await JsonSerializer.DeserializeAsync<UserSettings>(fs);
}

위 코드는 비동기로 JSON 데이터를 파일에 저장하고 불러오는 예제입니다. 비동기 처리를 통해 메인 스레드를 차단하지 않으면서 파일 입출력을 처리할 수 있습니다.

결론

JSON 직렬화는 객체 데이터를 간단하고 가독성 높은 형식으로 변환하여 파일로 저장하거나 네트워크를 통해 전송하는 데 매우 유용합니다. C#에서는 System.Text.JsonNewtonsoft.Json을 사용하여 손쉽게 JSON 직렬화를 구현할 수 있으며, 각 라이브러리의 장단점에 따라 상황에 맞는 도구를 선택할 수 있습니다. JSON 직렬화를 적절히 사용하면 웹 애플리케이션과의 데이터 교환, 설정 파일 저장 등 다양한 시나리오에서 유용하게 데이터를 동기화하고 관리할 수 있습니다. 성능 최적화와 관련된 팁들을 함께 적용하여 효율적이고 가독성 높은 직렬화 솔루션을 구축하시길 바랍니다.