핵심 요약
- 한 Rust 개발자가 경로를 표현하는 열거형(Component)의 각 변형을 독립된 전용 구조체 타입으로 분리한 개발 경험을 전했습니다.
- 기존처럼 단순 문자열을 받을 때 발생하던 잘못된 경로 결합이나 심볼릭 링크 버그를 컴파일 타임에 안전하게 차단할 수 있게 되었습니다.
- 작성자는 AI 없이 차 안에서 직접 작성한 코드라며, 사소해 보이지만 컴파일러의 엄격한 검증을 활용하는 타입 설계의 만족감을 강조했습니다.
요약 개발자 커뮤니티에서 Rust 프로그래밍 중 경로(Path) 처리를 다루며 느낀 소소한 개발 쾌감과 타입 설계 경험을 공유한 글이 눈길을 끌었습니다.
글쓴이는 Rust 표준 라이브러리의 `std::path::Component` 열거형(enum)을 다루던 중 영감을 얻었다고 전했습니다. 이 열거형은 경로를 구성하는 개별 요소(루트 디렉터리, 일반 디렉터리/파일 이름, 부모 디렉터리 `..`, 현재 디렉터리 `.` 등)를 표현하는 sum type이지만, 임의의 component 하나를 인자로 받는 함수 인터페이스는 타입 범위가 너무 넓어 버그의 여지가 있었습니다.
예를 들어 기존에는 절대 경로에 새 경로 요소를 덧붙일 때 일반 문자열(`OsStr`)을 넘기도록 설계하면, 상대 경로 문자열이나 `..` 또는 의도치 않게 또 다른 절대 경로가 들어와 기존 경로가 덮어씌워지는 문제가 발생할 수 있었습니다. 이에 글쓴이는 열거형의 각 variant(예: `Component::Normal`)마다 1:1로 대응하는 전용 래퍼 타입(`NormalComponent`)을 정의했습니다. 이를 통해 컴파일 타임에 '반드시 일반 하위 경로 컴포넌트임'을 증명해야만 절대 경로에 결합(`join_normal`)할 수 있도록 강제했습니다.
또한 경로는 단순 텍스트 표기(lexical)와 디스크상의 실제 물리 위치(physical)가 다를 수 있어 심볼릭 링크나 윈도우 특유의 네임스페이스(`\\?\`) 경로에서 예측 불가능한 버그가 발생하기 쉬운데, 디렉터리를 거슬러 올라가는 `up` 함수에도 `ParentDirComponent` 타입을 요구함으로써 컴파일러 수준에서 안전성을 확보했다고 설명했습니다.
작성자는 비록 대단한 혁신은 아니지만 열거형(sum type)의 각 요소를 독립적인 타입으로 쪼개어 컴파일러에게 엄격한 확신을 요구하는 이러한 꼼꼼한 설계 방식이 개발자로서 매우 즐겁고 만족스러웠다고 밝혔습니다. 아울러 이 코드는 AI 도구의 도움 없이 아이들의 축구 연습을 기다리며 차 안에서 오프라인 상태로 직접 작성한 결과물이라고 덧붙였습니다.
Sponsored · 광고