C

CodeDeck AI

2025. 11. 8. · 1 Views

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

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


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

들어가며

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

목차

  1. Serde_기본_설정
  2. 기본_구조체_직렬화
  3. JSON으로_직렬화하기
  4. JSON에서_역직렬화하기
  5. 필드명_변경하기
  6. 선택적_필드_처리
  7. 기본값_설정하기
  8. 중첩된_구조체_처리
  9. 벡터와_배열_처리
  10. Pretty_JSON_출력

1. Serde_기본_설정

개요

Serde를 사용하기 위해 Cargo.toml에 필요한 의존성을 추가합니다. serde와 serde_json은 Rust에서 직렬화/역직렬화를 위한 필수 라이브러리입니다.

코드 예제

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

설명

derive 기능을 활성화하면 구조체에 자동으로 직렬화 기능을 추가할 수 있습니다. serde_json은 JSON 형식으로 변환하는 기능을 제공합니다.


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

개요

Serialize와 Deserialize trait을 derive하여 구조체를 JSON으로 변환할 수 있습니다. 가장 기본적인 Serde 사용 방법입니다.

코드 예제

use serde::{Serialize, Deserialize};

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

설명

derive 매크로를 사용하면 컴파일러가 자동으로 직렬화/역직렬화 코드를 생성해줍니다. 별도의 구현 없이 바로 사용할 수 있습니다.


3. JSON으로_직렬화하기

개요

Rust 구조체를 JSON 문자열로 변환하는 방법입니다. serde_json::to_string 함수를 사용하여 간단하게 변환할 수 있습니다.

코드 예제

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

let json = serde_json::to_string(&user)?;
println!("{}", json);
// {"name":"김철수","age":25}

설명

to_string 함수는 구조체를 받아 JSON 문자열로 변환합니다. 에러가 발생할 수 있으므로 ? 연산자로 처리합니다.


4. JSON에서_역직렬화하기

개요

JSON 문자열을 다시 Rust 구조체로 변환하는 방법입니다. serde_json::from_str 함수를 사용합니다.

코드 예제

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

let user: User = serde_json::from_str(json_str)?;
println!("{} is {} years old", user.name, user.age);
// 이영희 is 30 years old

설명

from_str 함수는 JSON 문자열을 파싱하여 지정한 타입의 구조체로 변환합니다. 타입 추론이 필요하므로 명시적으로 타입을 지정해야 합니다.


5. 필드명_변경하기

개요

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

코드 예제

#[derive(Serialize, Deserialize)]
struct Product {
    #[serde(rename = "product_id")]
    id: u32,
    #[serde(rename = "product_name")]
    name: String,
}

설명

API 응답의 필드명이 snake_case이고 Rust는 camelCase를 사용할 때 유용합니다. rename으로 자동 변환됩니다.


6. 선택적_필드_처리

개요

JSON에 없을 수도 있는 필드는 Option 타입으로 처리합니다. 값이 없으면 자동으로 None이 됩니다.

코드 예제

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

설명

email이나 age가 JSON에 없어도 에러가 발생하지 않습니다. Option<T>를 사용하면 누락된 필드를 안전하게 처리할 수 있습니다.


7. 기본값_설정하기

개요

JSON에 필드가 없을 때 사용할 기본값을 설정할 수 있습니다. default 속성을 사용합니다.

코드 예제

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

fn default_port() -> u16 { 8080 }

설명

port 필드가 JSON에 없으면 default_port 함수가 반환하는 8080이 자동으로 사용됩니다.


8. 중첩된_구조체_처리

개요

구조체 안에 다른 구조체가 포함된 경우에도 Serde가 자동으로 처리해줍니다. 모든 구조체에 derive를 추가하면 됩니다.

코드 예제

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

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

설명

중첩된 구조체도 자동으로 직렬화/역직렬화됩니다. 각 구조체에 derive를 추가하는 것만 잊지 않으면 됩니다.


9. 벡터와_배열_처리

개요

Vec나 배열 같은 컬렉션도 Serde가 자동으로 JSON 배열로 변환해줍니다. 복잡한 구현 없이 바로 사용할 수 있습니다.

코드 예제

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

설명

Vec<T>는 JSON 배열로 자동 변환됩니다. 원시 타입뿐만 아니라 구조체의 Vec도 처리할 수 있습니다.


10. Pretty_JSON_출력

개요

읽기 쉽게 들여쓰기가 적용된 JSON을 출력하려면 to_string_pretty 함수를 사용합니다. 디버깅이나 로깅에 유용합니다.

코드 예제

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

let json = serde_json::to_string_pretty(&user)?;
println!("{}", json);

설명

to_string_pretty는 줄바꿈과 들여쓰기가 적용된 JSON을 생성합니다. 사람이 읽기 편한 형식으로 출력됩니다.


마치며

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

관련 태그

#Rust #Serde #Serialization #Deserialization #JSON

#Rust#Serde#Serialization#Deserialization#JSON

댓글 (0)

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