C

CodeDeck AI

2025. 11. 8. · 1 Views

Rust Serde 직렬화 역직렬화 완벽 가이드

Rust의 Serde 라이브러리를 사용하여 데이터를 JSON, TOML 등 다양한 형식으로 변환하는 방법을 학습합니다. 초급자도 쉽게 따라할 수 있도록 기본 개념부터 실전 예제까지 단계별로 설명합니다.


카테고리:Rust
언어:Rust
난이도:intermediate
메인 태그:#Rust
서브 태그:
#Serde#Serialization#Deserialization#JSON

들어가며

이 글에서는 Rust Serde 직렬화 역직렬화 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. Serde_기본_설정
  2. 기본_구조체_직렬화
  3. 구조체를_JSON으로_변환
  4. JSON을_구조체로_변환
  5. 예쁜_JSON_출력
  6. 필드명_변경하기
  7. 옵셔널_필드_처리
  8. 기본값_설정하기
  9. 중첩_구조체_직렬화
  10. 벡터_직렬화
  11. HashMap_직렬화
  12. 파일로_저장하고_읽기

1. Serde_기본_설정

개요

Serde를 사용하기 위해 Cargo.toml에 필요한 의존성을 추가합니다. serde와 serde_json 크레이트가 기본적으로 필요합니다.

코드 예제

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

설명

derive 기능을 활성화하면 구조체에 자동으로 직렬화/역직렬화 기능을 추가할 수 있습니다. serde_json은 JSON 형식 변환을 위한 크레이트입니다.


2. 기본_구조체_직렬화

개요

Serialize와 Deserialize 트레이트를 자동으로 구현하여 구조체를 JSON으로 변환합니다.

코드 예제

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct User {
    name: String,
    age: u32,
}

설명

derive 매크로를 사용하면 별도의 코드 작성 없이 User 구조체를 JSON으로 변환하거나 JSON에서 User 구조체로 변환할 수 있습니다.


3. 구조체를_JSON으로_변환

개요

to_string 함수를 사용하여 Rust 구조체를 JSON 문자열로 직렬화합니다.

코드 예제

let user = User {
    name: String::from("김철수"),
    age: 25,
};

let json = serde_json::to_string(&user).unwrap();
println!("{}", json);

설명

to_string 함수는 구조체를 받아서 JSON 형식의 문자열로 변환합니다. 결과는 {"name":"김철수","age":25} 형태가 됩니다.


4. JSON을_구조체로_변환

개요

from_str 함수를 사용하여 JSON 문자열을 Rust 구조체로 역직렬화합니다.

코드 예제

let json_data = r#"{"name":"이영희","age":30}"#;

let user: User = serde_json::from_str(json_data)
    .unwrap();
println!("{}", user.name);

설명

JSON 문자열을 파싱하여 User 타입의 구조체로 변환합니다. 변환 실패 시 에러를 반환하므로 unwrap으로 처리합니다.


5. 예쁜_JSON_출력

개요

to_string_pretty 함수를 사용하면 들여쓰기가 적용된 읽기 쉬운 JSON을 생성할 수 있습니다.

코드 예제

let user = User {
    name: String::from("박민수"),
    age: 28,
};

let pretty_json = serde_json::to_string_pretty(&user)
    .unwrap();
println!("{}", pretty_json);

설명

개발 중 디버깅이나 로그 출력 시 가독성 좋은 JSON이 필요할 때 유용합니다. 줄바꿈과 들여쓰기가 자동으로 추가됩니다.


6. 필드명_변경하기

개요

rename 속성을 사용하여 Rust 구조체 필드명과 JSON 키 이름을 다르게 매핑할 수 있습니다.

코드 예제

#[derive(Serialize, Deserialize)]
struct Product {
    #[serde(rename = "productName")]
    name: String,
    #[serde(rename = "productPrice")]
    price: f64,
}

설명

API가 camelCase를 사용하지만 Rust는 snake_case를 선호할 때 유용합니다. JSON에서는 productName으로 표시되지만 코드에서는 name으로 사용합니다.


7. 옵셔널_필드_처리

개요

Option 타입을 사용하면 JSON에 없을 수 있는 필드를 안전하게 처리할 수 있습니다.

코드 예제

#[derive(Serialize, Deserialize)]
struct Profile {
    username: String,
    email: Option<String>,
    phone: Option<String>,
}

설명

email이나 phone이 JSON에 없어도 에러가 발생하지 않고 None으로 처리됩니다. 필드가 있으면 Some(값) 형태로 저장됩니다.


8. 기본값_설정하기

개요

default 속성을 사용하여 JSON에 필드가 없을 때 사용할 기본값을 지정합니다.

코드 예제

#[derive(Serialize, Deserialize)]
struct Config {
    host: String,
    #[serde(default = "default_port")]
    port: u16,
}

fn default_port() -> u16 { 8080 }

설명

JSON에 port 필드가 없으면 자동으로 8080 값이 사용됩니다. 설정 파일 파싱 시 유용한 패턴입니다.


9. 중첩_구조체_직렬화

개요

구조체 안에 다른 구조체를 포함하는 경우에도 자동으로 직렬화됩니다.

코드 예제

#[derive(Serialize, Deserialize)]
struct Address {
    city: String,
    street: String,
}

#[derive(Serialize, Deserialize)]
struct Person {
    name: String,
    address: Address,
}

설명

내부의 Address 구조체도 Serialize/Deserialize를 구현하면 자동으로 중첩된 JSON 객체로 변환됩니다.


10. 벡터_직렬화

개요

Vec나 배열 같은 컬렉션 타입도 자동으로 JSON 배열로 변환됩니다.

코드 예제

#[derive(Serialize, Deserialize)]
struct Team {
    name: String,
    members: Vec<String>,
}

let team = Team {
    name: String::from("개발팀"),
    members: vec!["철수".into(), "영희".into()],
};

설명

members 필드는 JSON에서 배열 형태로 표현됩니다. 모든 표준 컬렉션 타입이 지원됩니다.


11. HashMap_직렬화

개요

HashMap을 사용하면 동적인 키-값 쌍을 JSON 객체로 변환할 수 있습니다.

코드 예제

use std::collections::HashMap;

#[derive(Serialize, Deserialize)]
struct Settings {
    values: HashMap<String, String>,
}

설명

HashMap의 각 엔트리가 JSON 객체의 키-값 쌍으로 변환됩니다. 동적인 설정값 저장에 유용합니다.


12. 파일로_저장하고_읽기

개요

직렬화된 데이터를 파일에 저장하고 다시 읽어올 수 있습니다.

코드 예제

use std::fs::File;

// 저장
let file = File::create("user.json").unwrap();
serde_json::to_writer_pretty(&file, &user).unwrap();

// 읽기
let file = File::open("user.json").unwrap();
let user: User = serde_json::from_reader(file).unwrap();

설명

to_writer와 from_reader를 사용하면 메모리를 효율적으로 사용하면서 파일 입출력을 수행할 수 있습니다.


마치며

이번 글에서는 Rust Serde 직렬화 역직렬화 완벽 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#Rust #Serde #Serialization #Deserialization #JSON

#Rust#Serde#Serialization#Deserialization#JSON

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.