간단한 화면을 벗어나 풍부한 텍스트와 마크다운, 긴 채팅 인터페이스를 구현하려 할 때 SwiftUI와 Apple의 네이티브 SDK가 어떻게 제약이 되는지에 대한 경험담.
거의 이십 년 동안 저는 네이티브 macOS / iOS 개발자로 일해 왔고, 흔히 나오는 “아, 또 Node / Electron이네… 참 아쉽다…”라는 반응에 대해 한마디 하고 싶습니다.
최근 저는 순수 Swift / SwiftUI 앱에서 Markdown 지원이 있는 간단한 채팅을 구현해 보려 했습니다. 그리고 솔직히 말하면, 이런 “네이티브” 도구들이 단순한 화면을 벗어나는 순간 얼마나 미성숙한지가 거의 우스울 정도입니다. 네, SwiftUI에서 그럭저럭 괜찮은 성능을 낼 수는 있습니다. 심지어 덜컥거리는 스크롤링도 괜찮다고, 여기저기 있는 약간의 버벅임도 감수할 만하다고 스스로를 설득할 수도 있습니다. 하지만 SwiftUI 프리미티브로 구성된 Markdown 문서 전체를 선택하고 싶어지는 순간, 그냥 할 수가 없습니다. 설계상 그렇습니다.
그래서 영리하고 경험 많은 사람답게 NSTextView로 옮겨 갑니다. 이제는 TextKit 2도 지원하죠. 훌륭합니다. 문제는, SwiftUI 주변에서 해 두었던 테스트와 성능 관련 작업 대부분을 잃게 된다는 점입니다. 둘이 잘 맞지 않기 때문입니다. 그러고는 이제 2026년이고 모두가 모델의 응답을 스트리밍하니까, 거기에 텍스트를 스트리밍으로 넣어 보려 합니다. 그러면 CPU 사용량이 치솟기 시작합니다. 좋습니다. 우리에겐 아직 AppKit이 있습니다. 아직 NSCollectionView도 있습니다. 성숙하고, 빠르고, 실전에서 검증됐습니다. 그래서 다시 갈아탑니다. 전체를 구현합니다. 그런데 이틀째 되는 날, 셀이 무슨 수를 써도 깜빡인다는 사실을 깨닫습니다. 설계상 그렇습니다.
그러다 순수 TextKit 2처럼 더 저수준으로 내려가는 것까지 고려하게 됩니다. 프로토타입을 만듭니다. 성능은 괜찮습니다. 스트리밍은 여전히 끔찍합니다. 최신 도구들과도 잘 어울리지 않습니다. SwiftUI는 완전히 제거하고, AppKit만 붙들고, 확장되는 텍스트 청크를 수동으로 다루기 시작합니다. 이쯤 되면 거의 모든 것이 망가져 있지만, 어쨌든 텍스트는 선택할 수 있습니다!
그러다 문득, 기본적인 네이티브 macOS 동작과 기능 동등성을 맞추는 데만도 몇 달이 걸리리라는 사실을 깨닫습니다. 컨텍스트 메뉴, 사전 검색, 선택, 접근성, 텍스트 상호작용, 그리고 사용자가 의식하지도 않은 채 기대하는 온갖 자잘한 것들까지 말입니다.
그래서 Markdown 렌더링을 위해 WebKit을 시도합니다. 그리고 됩니다. 물론 주의할 점은 있지만, 대체로 그냥 됩니다. 성능도 좋습니다. 타이포그래피도 거의 완벽합니다. 제어 수준도 적절합니다.
그리고 가능한 한 가장 암울한 순간, 이런 생각이 듭니다. 좋아, 간단한 Electron 프로젝트를 하나 생성해 보자. 다크 사이드로 가는 겁니다.
그러고는 놀라게 됩니다.
텍스트 처리, Markdown 렌더링, 좋은 타이포그래피까지, 이 모든 것이 별다른 설정 없이 바로 작동합니다. 성능도, 순수 TextKit 2 구현으로조차 얻지 못했던 수준입니다. macOS 통합도 갖춰져 있습니다. 화려한 Git diff조차 몇 줄 코드로 렌더링할 수 있습니다. diffs.com 같은 것들은 말할 것도 없습니다.
그리고 나서 스스로에게 묻게 됩니다. 무엇이 잘못된 걸까?
저는 사람들이 하라고 하는 일을 전부 했습니다. 처음부터 끝까지 네이티브로 갔습니다. 저는 플랫폼을 압니다. 선택지도 압니다. SwiftUI도, AppKit도, TextKit도, WebKit도 압니다.
그런데도 여전히 아주 단순한 것을 제대로 만들 수 없습니다. Markdown이 있는 채팅, 그리고 메시지 전체를 선택할 수 있는 기능 말입니다.
그리고 갑자기, 이 시대의 가장 중요한 인터페이스 패턴 중 하나인 채팅, 긴 형식의 리치 텍스트, 유연한 타이포그래피에 의존하는 새로운 앱 대부분이 왜 이런저런 방식으로 웹 기반인지가 훨씬 더 분명해집니다.
실질적인 대안이 없습니다.
SwiftUI는 단순한 화면에는 괜찮습니다. 가능하면 스크롤이 너무 많지 않은 경우가 좋습니다. 성능이 중요한 부분에서는 Swift도 여전히 훌륭합니다. 하지만 네이티브 상호운용성을 활용하면 Electron이나 React Native에서도 그 성능의 대부분을 거의 공짜처럼 얻을 수 있고, 동시에 훨씬 더 나은 텍스트 및 렌더링 모델을 유지할 수 있습니다.
그래서 이제 이것은 더 이상 “빠른 해결책 대 올바른 해결책” 논쟁조차 아닙니다. 긴 형식의 채팅을 위한 리치 텍스트 렌더링을 만들고 싶다면, SwiftUI와 Apple의 네이티브 SDK는 당신을 돕지 않습니다. 그것들은 더 이상 장점이 아니라 제약이 되기 시작합니다.