[Open WebUI] JSON.parse(JSON.stringify())를 structuredClone으로 교체
PR 링크: open-webui/open-webui#22104 상태: Merged | 변경: +2 / -8
들어가며
JavaScript에서 객체의 딥 복사를 위해 JSON.parse(JSON.stringify(obj)) 패턴이 흔히 사용됩니다. 하지만 이 방식은 문자열 직렬화와 파싱이라는 두 번의 비용이 발생합니다. 모던 브라우저는 structuredClone API를 제공하며, 이는 직렬화 과정 없이 내부적으로 효율적인 복사를 수행합니다. 또한 이 PR에서는 이미 새로 생성된 리터럴 객체에 대한 불필요한 JSON 라운드트립도 함께 제거합니다.
핵심 코드 분석
도구 실행 결과 복사
Before:
if (cb) {
cb(JSON.parse(JSON.stringify(res)));
}
After:
if (cb) {
cb(structuredClone(res));
}
불필요한 복사 제거
Before:
if (cb) {
cb(
JSON.parse(
JSON.stringify({
error: 'Tool Server Not Found'
})
)
);
}
After:
if (cb) {
cb({ error: 'Tool Server Not Found' });
}
왜 이게 좋은가
- 성능 향상:
structuredClone은 JSON 문자열화/파싱 없이 내부적으로 복사하므로 더 빠릅니다. - 타입 보존:
JSON.stringify는undefined,Date,RegExp등을 제대로 처리하지 못하지만,structuredClone은 이들을 올바르게 복사합니다. - 불필요한 복사 제거: 리터럴 객체
{ error: 'Tool Server Not Found' }는 이미 새 객체이므로 복사할 이유가 없습니다. - 코드 가독성 개선: 의도가 명확해집니다. "이 객체를 깊은 복사한다"라는 의미를 직접적으로 전달합니다.
참고 자료
관련 포스트
- [Open WebUI] CodespanToken에서 JS 트랜지션을 CSS 애니메이션으로 교체하여 메인 스레드 부하 제거
- [Open WebUI] TTS 문장 파싱을 showCallOverlay 가드로 감싸 불필요한 O(n^2) 연산 제거
- [Open WebUI] O(n²) unshift를 O(n) push+reverse로 교체하여 메시지 빌드 최적화
- [Open WebUI] CodeEditor에서 EditorView 미해제로 인한 메모리 누수 수정
- [Open WebUI] UserMessage에서 JSON 직렬화 대신 structuredClone과 빠른 경로 비교 적용
PR Analysis 의 다른글
- 이전글 [Open WebUI] Sidebar 컴포넌트 메모리 누수 수정: onDestroy에서 onMount return으로 전환
- 현재글 : [Open WebUI] JSON.parse(JSON.stringify())를 structuredClone으로 교체
- 다음글 [Open WebUI] StatusHistory 비교에 O(1) 길이 검사 추가로 직렬화 비용 절감
댓글