1P by neo 7달전 | favorite | 댓글 1개
  • Thunderbird에 Exchange 지원 기능을 추가하기 위해 Rust 언어를 사용하여 개발 중임
    • 7월 출시 예정인 다음 ESR(Extended Support) 버전에서는 이메일만 우선 지원하고, 캘린더와 주소록 기능은 추후 지원 예정
    • Brendan Abolivier, Ikey Doherty, Sean Burke가 이 작업을 진행 중

Rust 언어 선택 이유

  • Thunderbird는 오래된 프로젝트로 많은 오래된 C++ 코드를 가지고 있음
  • 새로운 기능 개발을 위해서는 강력하면서도 장기적인 유지보수성이 있는 언어가 필요함
  • Rust는 메모리 안전성, 성능, 모듈성, 생태계 등의 장점이 있음
  • Firefox와 공유하는 CI 인프라가 이미 Rust를 지원하고 있음
  • XPCOM을 통해 Rust, C++, JavaScript 간 호출이 가능함
  • Rust의 강력한 도구를 활용하여 오래된 아키텍처를 개선할 수 있음
  • Rust는 다양한 플랫폼을 지원하여 Android용 Thunderbird/K-9 Mail 등 다른 프로젝트에서도 재사용 가능

직면했던 어려움들

  • 기존 코드에는 Rust와 잘 맞지 않는 비동기 패턴들이 많음
  • Firefox와 Thunderbird 코드베이스에는 Rust 바인딩이 없는 기능들이 많음
  • Thunderbird 빌드 시스템이 Firefox 코드를 서브트리로 가져오는 방식이라 Rust 코드 통합이 어려웠음
    • Cargo 워크스페이스를 중첩할 수 없어서 빌드 도구 mach를 수정하여 해결
  • XPCOM은 원래 C++을 위해 설계되어 Rust에서 사용하기에는 많은 boilerplate 코드가 필요함
    • Rust로 프로토콜별 로직을 구현하고 C++로 브릿지 클래스를 만들어 기존 코드와 결합하는 방식으로 해결

Rust를 이용한 Exchange 지원 구현

  • EWS(Exchange Web Services) API는 HTTP로 통신하며 XML 형식의 요청과 응답을 사용함
  • HTTP 요청 전송을 위해 Firefox의 necko 네트워킹 컴포넌트를 사용하지만 XPCOM을 통해 노출되어 사용하기 불편함
    • xpcom_async 크레이트를 만들어 XPCOM의 비동기 작업을 Rust의 async/await 문법으로 변환
    • moz_http 크레이트를 만들어 reqwest 스타일의 HTTP 클라이언트 API 제공
  • XML 요청/응답 처리를 위해 기존 크레이트들을 사용하려 했으나 EWS의 요구사항을 만족시키지 못함
    • xml_struct 크레이트를 만들어 Rust 데이터 구조체와 XML 간의 직관적인 매핑을 제공
    • ews 크레이트를 만들어 EWS용 타입 정의와 xml_struct 및 serde 기반 XML 직렬화/역직렬화 API 제공

향후 계획

  • 다음 주요 기능 개발에 앞서 자동화된 테스트를 확충하는 중
    • 단위 테스트 외에도 모의 EWS 서버를 만들어 통합 테스트 진행 중
  • 오류 처리 개선 작업 진행 중
    • EWS의 오류 동작이 문서화가 잘 되어있지 않아 프로토콜 수준과 사용자 개입이 필요한 수준 등 다양한 층위에서 처리 필요
  • EWS 프로토콜 지원 확대 및 Thunderbird UI와의 연동 작업 진행 중
    • 최근 EWS 계정 추가, 원격 서버에서 폴더 계층 동기화, UI에 폴더 표시 등의 기능 구현 완료
    • 다음은 원격 서버에서 메시지 목록 가져오기와 Thunderbird의 발신 메일 지원 기능 일반화 예정
  • 모든 작업에 대해 문서화를 진행하여 향후 유지보수성 확보할 예정
    • 기존 Thunderbird의 메일 프로토콜 아키텍처와 개선 방향에 대한 문서화도 진행 중

GN⁺의 의견

  • Thunderbird에 Rust를 도입하여 오래된 아키텍처를 현대화하는 것은 매우 긍정적인 변화로 보임. Rust의 장점을 활용하면서 기존 코드베이스와의 호환성을 유지하기 위해 다양한 노력을 기울이고 있음.
  • 개발 과정에서 만들어진 xpcom_async, moz_http, xml_struct, ews 등의 크레이트들은 Thunderbird 외의 다른 프로젝트에서도 유용하게 활용될 수 있을 것 같음.
  • 하지만 Thunderbird의 오래된 아키텍처와 Firefox 코드베이스에 의존적인 빌드 시스템 등은 앞으로도 Rust 도입에 걸림돌이 될 수 있음. 장기적으로는 이런 문제들을 해결하기 위한 노력도 필요해 보임.
  • EWS는 기업이나 교육기관에서 많이 사용되는 이메일 서비스인 만큼, Thunderbird에서 EWS를 지원하게 되면 사용자 저변 확대에 큰 도움이 될 것으로 보임. 다만 EWS가 Microsoft의 독점 프로토콜인 만큼, 오픈소스 프로젝트에서 구현하기에는 어려움이 있을 수 있음.
  • 전반적으로 Thunderbird 프로젝트가 Rust 도입을 계기로 아키텍처 현대화와 기능 확장을 위해 활발히 노력하고 있는 것으로 보임. 오픈소스 이메일 클라이언트의 대표주자로서 Thunderbird의 발전은 사용자들에게 큰 혜택이 될 것임.
Hacker News 의견
  • EWS가 2년 후 제거 예정임에도 불구하고 구현하는 이유에 대한 의문 제기됨
  • Thunderbird가 Firefox Quantum 업데이트 이전처럼 속도가 느린 문제가 있음. 수천 개의 메일이 있는 폴더 간 전환 시 지연이 발생하지만 Outlook에서는 즉시 전환됨
  • 전략적으로 사람들이 Thunderbird를 사용하도록 하는 것이 목표라면 타당하지만, 이념적으로는 JMAP 지원이 더 좋을 것이라는 의견 제시됨
  • 20년 전 IT 업계에서 Linux를 사용하는 사람이 적었을 때 Exchange 클라이언트를 찾기 어려웠던 상황을 회상함
  • 제목이 Rust 프로그래밍에 관한 내용으로 변경되었지만, 실제 내용은 Thunderbird의 Exchange 지원에 관한 것이 아니라는 지적이 있음
  • Exchange를 싫어하지만 Windows에서 일반 텍스트 메일을 보낼 수 있게 되어 기쁘다는 의견 표명됨
  • Outlook에서 전환할 때 PST 파일 가져오기 기능을 기본으로 제공하여 사용자가 쉽게 전환할 수 있도록 해야 한다는 제안이 있음
  • Thunderbird가 EWS 지원 측면에서 Gnome의 Evolution과 경쟁할 수 있는 적절한 경쟁자가 되기를 바람
  • SMTP/2 + IMAP5 등 새로운 프로토콜이 절실히 필요함을 강조함
  • OWL 확장 기능을 사용해야 했던 상황에서 이번 개선이 반가울 것이라는 의견 제시됨