RUST MACROS

매크로 출력 선택

macro_rules!, derive, attribute/function-like proc macro는 모두 코드를 생성하지만 입력 형태, 타입 정보 접근, 디버깅 방식이 달라서 문제에 맞게 선택해야 한다.

01

반복 문법인지

println!, vec!처럼 토큰 패턴 반복이면 macro_rules!가 간단하다.

declarative
02

trait 구현인지

Serialize, Debug처럼 타입 정의에서 구현을 만들면 derive가 맞다.

#[derive]
03

문법 변환인지

SQL DSL, route attribute처럼 입력 토큰을 분석해야 하면 proc macro를 쓴다.

TokenStream
04

디버깅 준비

cargo expand로 생성 코드를 확인하고 오류 위치가 사용자 코드에 잘 매핑되는지 본다.

expansion
macro_rules!
빠르고 의존성 적음 패턴 매칭은 강하지만 복잡한 문법 분석과 타입 정보 접근은 어렵다.
syntax pattern
derive macro
입력 타입에 impl 생성 필드와 attribute를 읽어 trait 구현을 자동 작성한다.
struct/enum input
attribute macro
항목 전체를 감싸 변환 함수, 모듈, struct에 붙어 코드 전후를 생성할 수 있다.
#[route]
function-like proc
커스텀 DSL 가능 강력하지만 컴파일 시간, 오류 메시지 품질, 유지보수 비용이 커진다.
DSL cost

도입 기준

일반 함수 우선 타입 시스템과 함수로 해결되면 매크로보다 그쪽이 디버깅 쉽다.
확장 코드 확인 cargo expand 결과가 사람이 이해 가능한지 본다.
오류 메시지 잘못된 입력에서 사용자가 고칠 위치를 알 수 있게 span을 관리한다.