본문으로 건너뛰기
피드

네이티브로 끝까지 가려다 텍스트에서 막힌 macOS 개발자의 고백

frontend 약 6분
vote
0
댓글
북마크

20년 가까이 macOS와 iOS 네이티브 개발을 해온 작성자가 SwiftUI, AppKit, TextKit 2로 마크다운 채팅 UI를 만들다 결국 WebKit과 Electron 쪽이 훨씬 낫다는 결론에 도달한 글이다. 문제는 성능 하나가 아니라 선택, 스트리밍, 스크롤, 접근성, 텍스트 상호작용 같은 ‘사용자가 당연히 기대하는 기본기’가 네이티브 조합에서 계속 깨진다는 점이다.

  • 1

    SwiftUI만으로 마크다운 문서 전체 선택 같은 기본 텍스트 상호작용을 처리하기 어렵다고 지적함

  • 2

    NSTextView와 TextKit 2로 내려가도 SwiftUI와의 통합, 스트리밍 성능, 현대적 UI 조합에서 문제가 생김

  • 3

    WebKit은 마크다운 렌더링, 타이포그래피, 제어권 면에서 훨씬 안정적으로 작동했다고 평가함

  • 4

    Electron은 텍스트 작업과 마크다운 렌더링, Git diff 같은 기능이 예상보다 쉽게 동작했다고 말함

  • 5

    채팅·장문 리치 텍스트 앱에서는 웹 기반 접근이 사실상 표준이 된 이유를 설명함

  • 이 글은 ‘또 Electron이야?’라는 반응에 대한 네이티브 개발자의 반격에 가까움

    • 작성자는 거의 20년 동안 macOS와 iOS 네이티브 개발을 해온 사람임
    • 그런데 단순한 마크다운 채팅 UI를 순수 Swift·SwiftUI로 만들다가, 결국 네이티브 스택이 생각보다 많이 미성숙하다는 결론에 도달함
  • 시작은 아주 평범했음. SwiftUI 앱에서 마크다운을 지원하는 채팅 화면을 만들고 싶었던 것뿐임

    • SwiftUI로 적당한 성능은 낼 수 있음
    • 스크롤이 조금 튀고 약간의 랙이 있어도 스스로 납득할 수는 있음
    • 그런데 SwiftUI primitive로 만든 마크다운 문서 전체를 선택하려고 하면 안 됨. 그냥 설계상 안 되는 영역에 가까움
  • 그래서 NSTextView로 내려갔지만, 여기서도 다른 문제가 터짐

    • TextKit 2 지원이 있으니 괜찮아 보이지만 SwiftUI와 잘 섞이지 않음
    • SwiftUI 쪽에서 해둔 테스트와 성능 작업을 꽤 잃게 됨
    • 2026년식 앱답게 모델 응답을 스트리밍하려고 하면 CPU 스파이크가 보이기 시작함
  • AppKit과 NSCollectionView로 더 내려가도 깔끔하게 끝나지 않음

    • 성숙하고 빠르고 검증된 기술처럼 보이지만, 셀 깜빡임 같은 문제가 계속 남음
    • TextKit 2를 직접 써보면 성능은 괜찮아도 스트리밍 텍스트 처리가 여전히 별로임
    • 결국 SwiftUI를 걷어내고 AppKit에 붙어 확장되는 텍스트 덩어리를 직접 관리하는 상황까지 감

중요

> 작성자가 막힌 건 ‘고급 기능’이 아님. 채팅 메시지의 마크다운을 렌더링하고, 긴 텍스트를 선택하고, 스트리밍으로 자연스럽게 보여주는 기본 UX임

  • 더 무서운 건 기능 패리티 비용임

    • 컨텍스트 메뉴, 사전 조회, 선택, 접근성, 텍스트 상호작용처럼 macOS 사용자가 당연히 기대하는 것들을 다시 맞춰야 함
    • 이걸 제대로 하려면 몇 주가 아니라 몇 달이 걸릴 수 있다는 게 작성자의 판단임
  • WebKit으로 마크다운을 렌더링하자 상황이 갑자기 좋아짐

    • 성능이 좋고, 타이포그래피도 거의 제대로 나오고, 제어권도 충분히 확보됨
    • 당연히 단점은 있지만, 네이티브 텍스트 스택에서 겪던 문제들보다 훨씬 실용적으로 보였다는 얘기임
  • 결국 Electron 프로젝트를 만들어봤고, 작성자는 꽤 충격을 받음

    • 텍스트 작업, 마크다운 렌더링, 좋은 타이포그래피가 거의 기본으로 됨
    • 순수 TextKit 2 구현보다 체감 성능도 더 나았다고 말함
    • Git diff 같은 복잡한 UI도 몇 줄로 붙일 수 있고, macOS 통합도 충분히 가능했다고 봄
  • 결론은 꽤 세다. 채팅 중심 앱, 장문 리치 텍스트, 유연한 타이포그래피가 핵심이면 웹 기반이 사실상 대안이 없다는 것

    • SwiftUI는 단순 화면에는 괜찮고, Swift는 성능 중요한 부분에 여전히 좋음
    • 하지만 리치 텍스트 렌더링이 제품의 중심이면 네이티브 SDK가 장점이 아니라 제약이 될 수 있음
    • 그래서 요즘 채팅-heavy 앱들이 Electron, React Native, WebKit 같은 웹 기반 렌더링을 붙이는 이유가 꽤 명확해짐

기술 맥락

  • 이 글의 핵심 선택지는 ‘네이티브냐 웹이냐’가 아니라 ‘텍스트 렌더링을 누가 책임지냐’예요. 단순 버튼과 리스트는 SwiftUI로도 충분하지만, 장문 마크다운 채팅은 선택, 스크롤, 스트리밍, 접근성이 한꺼번에 걸리거든요.

  • SwiftUI에서 AppKit, TextKit 2로 내려갈수록 제어권은 늘어나지만 기본 UX를 직접 맞춰야 하는 비용도 같이 커져요. 사용자는 텍스트 선택이나 컨텍스트 메뉴를 기능이라고 생각하지 않지만, 앱 개발자는 그걸 하나씩 다시 구현해야 해요.

  • WebKit과 Electron이 강한 이유는 브라우저가 지난 수십 년 동안 텍스트와 문서 렌더링 문제를 계속 풀어왔기 때문이에요. 마크다운, 코드 블록, diff, 타이포그래피, 선택 동작이 웹 생태계에서는 이미 많이 닦여 있어요.

  • 그래서 이 글은 Electron 찬양이라기보다 제품 요구사항에 맞는 렌더링 엔진을 고르자는 얘기에 가까워요. 네이티브 앱이라도 텍스트가 핵심이면 웹 엔진을 섞는 게 더 엔지니어링다운 선택일 수 있어요.

‘Electron 또 씀?’이라는 반응에 대한 꽤 날카로운 반박이다. 리치 텍스트가 제품의 핵심이면 네이티브라는 이름값보다 브라우저의 텍스트 모델이 더 실용적인 선택일 수 있다는 얘기다.

댓글

댓글

댓글을 불러오는 중...

frontend

요즘 픽셀 폰트가 그냥 복고 감성이 아닌 이유

1990년대 기기 화면 느낌을 현대 폰트 시스템으로 재해석한 픽셀 폰트 몇 가지를 소개한 글이다. 핵심은 예쁜 복고풍 글자 모양만이 아니라, 실제 제품에서 쓸 수 있게 기준선, 자간, 메타데이터, 세로 메트릭까지 챙기는지가 중요하다는 점이다.

frontend

HTML의 `<dl>`이 생각보다 쓸모 많은 이유

이 글은 HTML의 description list, 즉 `<dl>`, `<dt>`, `<dd>`가 단순 용어 사전용 태그가 아니라 이름-값 쌍 UI를 표현하는 꽤 강력한 시맨틱 도구라고 설명한다. 숙소 편의시설, 요금 내역, 기술 용어 설명, 게임 능력치표처럼 흔한 패턴을 중첩 `<div>` 대신 의미 있는 HTML로 만들 수 있다는 얘기다.

frontend

HTML을 캔버스 안에 넣는 데모 모음이 등장함

구글 크롬 랩스 저장소에 HTML-in-Canvas 관련 데모와 프레임워크 지원 목록이 정리됐다. Duck Hunt 스타일 폼, 흔들리는 버튼, 셰이더 기반 페이지 전환, 천처럼 매달린 폼 같은 실험적 예제가 포함돼 있고 Three.js와 PlayCanvas 쪽 샘플도 연결돼 있다.

frontend

싱글 페이지 앱이 웹을 너무 비싸게 만들었다는 불평

이 글은 싱글 페이지 앱(SPA)이 사용자 경험을 좋게 만든다는 명분 아래 웹의 초기 로딩 비용, 도구 복잡도, 개발 진입 장벽을 키웠다고 비판한다. 페이스북 로그인 페이지의 CSS 3.8MB, 레딧 몇 개 클릭 후 33MB 다운로드 같은 숫자를 들며, 지금의 프론트엔드 생태계가 사람보다 대기업의 요구에 맞춰져 있다고 주장한다.

frontend

Tailwind를 떠나며 다시 CSS 구조를 배운 이야기

Julia Evans가 몇 년간 써온 Tailwind를 걷어내고, 의미 있는 HTML과 순수 CSS로 사이트를 다시 정리한 경험을 공유했다. 핵심은 Tailwind를 단순히 버린 게 아니라, Tailwind가 줬던 제약과 시스템을 CSS 코드베이스 안에서 직접 재구성했다는 점이다.