Rust serde, borrowing 조심하세요! 런타임 에러의 함정

by DD
5개월 전
조회수 17

Rustserde 라이브러리에서 &str과 같은 borrowed type 사용 시 런타임 에러가 발생할 수 있음

serde는 zero-copy deserialization을 지원하지만, escape 문자나 복잡한 데이터 구조에서는 borrowing이 불가능하여 에러 발생

해결책으로 String과 같은 owned type 사용, 또는 Cow<'a, str>#[serde(borrow)] 속성을 사용하여 문제를 해결할 수 있음

serde의 Zero-Copy Deserialization 원리

serdezero-copy deserialization을 통해 입력 데이터를 복사하지 않고 참조를 반환하여 성능을 향상시킨다. 구체적으로, JSON과 같은 형식에서 문자열이 그대로 &str로 매핑될 수 있는 경우, 입력 데이터의 메모리 주소를 직접 참조한다. 따라서, 불필요한 메모리 할당을 줄여 성능 개선을 이룰 수 있다.

Borrowing 실패 시나리오와 문제점

하지만, escape 문자나 복잡한 데이터 구조에서는 borrowing이 불가능하여 런타임 에러가 발생한다. 따라서, serde는 컴파일 타임에 이러한 문제를 감지할 수 없어, 개발자는 예상치 못한 런타임 에러에 직면할 수 있다. 반면, 이러한 문제는 디버깅을 어렵게 만들고, 서비스 안정성을 저해할 수 있다.

안정적인 Deserialization을 위한 해결책

이러한 문제를 해결하기 위해, String과 같은 owned type을 사용하거나, Cow<'a, str>#[serde(borrow)] 속성을 함께 사용해야 한다. 따라서, Cow를 사용하면 입력 데이터의 소유권을 유연하게 관리하면서, 필요한 경우에만 복사를 수행할 수 있다. 결과적으로, 코드의 안정성을 높이고, 예상치 못한 에러를 방지할 수 있다.

TIL: serde's borrowing can be treacherous