C.W.K.
Stream
Lesson 04 of 04 · published

실전의 매크로

~10 min · macros, serde, ecosystem

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

이제 두 매크로 종류를 다 이해했어. 이 레슨이 그걸 네가 실제로 만날 매크로 — 네 Rust 프로그램을 조용히 돌리는 것들 — 에 뿌리내려.

매일 쓰는 선언적 매크로

println!, format!, vec!, assert!, assert_eq!, panic! — 다 표준 라이브러리의 macro_rules! 매크로야. 함수가 아니라 매크로로 존재하는 건 정확히 가변 인자나 컴파일 타임 포맷 검사가 필요해서야. 이 퀘스트에서 ! 를 칠 때마다 하나를 호출한 거야.

생태계를 움직이는 절차적 매크로

serde 의 #[derive(Serialize, Deserialize)] 가 네 struct 정의에서 직렬화 레이어 전체를 생성해 — Rust 에서 거의 제일 많이 쓰이는 절차적 매크로. #[tokio::main] 이 async 런타임을 부트스트랩하고. #[derive(thiserror::Error)] 가 Error Handling 트랙에서 네 에러 보일러플레이트를 생성했지. 이 매크로들이 Rust 가 시스템 언어인데도 고수준으로 느껴지는 이유야.

매크로가 Rust 가 시스템 언어치고 보일러플레이트가 그렇게 적은 이유야. 직렬화, 에러 타입, async 세팅, derive — 다 한 줄 annotation 에서 컴파일 타임에 생성돼. 너는 의도를 쓰고; 매크로가 메커니즘을 써. 그게 Rust 를 안전하고 빠를 뿐 아니라 생산적으로 만드는 레버리지야.

핵심

생산적인 Rust 프로그래머가 되려고 매크로를 쓸 필요는 없어 — 읽을 줄 알아야 해: #[derive(...)] 가 뭘 생성하는지 알아보고, ! 가 컴파일 타임 확장이란 걸 알고, 잘 테스트된 생태계 매크로를 믿어. 보일러플레이트가 진짜 함수나 제네릭으로 안 풀릴 때만 직접 써. 그 판단 — 함수 먼저, 매크로 마지막 — 이 성숙한 Rust 의 표식이야.

Code

serde: 한 줄 annotation 이 직렬화를 생성한다·rust
// Cargo.toml:  serde = { version = "1", features = ["derive"] }
//              serde_json = "1"
use serde::{Serialize, Deserialize};

// annotation 하나가 직렬화 구현 전체를 생성:
#[derive(Serialize, Deserialize, Debug)]
struct Config {
    name: String,
    port: u16,
}

fn main() {
    let c = Config { name: "app".into(), port: 8080 };
    // serde_json 이 생성된 impl 로 struct 를 JSON 으로 바꿈:
    let json = serde_json::to_string(&c).unwrap();
    println!("{json}"); // {"name":"app","port":8080}
}

External links

Exercise

프로젝트에 serde 를 더하고, struct 에 SerializeDeserialize 를 derive 하고, serde_json 으로 JSON 을 왕복해: struct -> 문자열 -> struct. 그다음 돌아봐: 두 derive 매크로가 파싱/포맷팅 코드 몇 줄을 아꼈고, 손으로 유지하면 뭐가 들었을까?
Hint
작은 struct 라도 손으로 쓴 직렬화는 지루하고 버그 나기 쉽고, 필드마다 늘어. 두 derive 가 자동으로 생성하고 유지해 — 필드를 더하면 다음 빌드에 매크로가 코드를 재생성해. 그게 레버리지야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.