Tauri

Sunyeop Lee·2022년 1월 8일
1

Tauri (https://tauri.studio/)를 이용하면 Web Frontend - Rust Backend의 앱을 개발할 수 있다. electron과 달리 chrome을 내장하지 않고 시스템 브라우저를 이용함으로써 앱이 디스크와 메모리 용량을 적게 차지하는 것이 특징이다. 아직 beta라 부족한 점도 많지만 점차 기능이 추가되어 짱짱해질 것으로 생각된다. Rust로 되어있어 안정적이고 속도가 빠르다. Tauri 개발자도 보안에 신경을 많이 쓰는듯.
내가 tauri를 시작한 이유는 사실, 개인적으로 업무 일지를 작성하는데 귀찮아서 미루고 미루다 몇달치를 밀려서 썼기 때문이다. 몇달 전의 일을 쓰려니 재택근무를 했는지 휴가를 썼는지도 알기 힘들었다. 그래서 date picker에서 날짜를 선택하면 그 날 있었던 일을 보여줌으로써 일지 작성에 도움이 될 앱을 개발하고자 했다.
내 helper app이 하는 일은 크게 세가지다.

  1. 일자별 법인카드 사용내역 표시
  2. 일자별 휴가 결재상신내역 표시
  3. 일자별 캘린더 이벤트 표시

1과 2는 그룹웨어와 비즈플레이가 웹 인터페이스를 제공하기 때문에 개발자 도구에서 네트워크 패킷을 까보고 API를 알아내 Rust로 API client를 구현하려고 했다. 그러나 기대와 다르게 인증 과정이 굉장히 쓸모없이 복잡했다. 그룹웨어는 아이디와 패스워드를 암호화해서 전송(https인데 왜)해서 암호화 알고리즘을 Rust로 똑같이 구현할 필요가 있었고, 비즈플레이는 로그인을 해서 최초 세션을 할당받는 도메인과 실제 카드 영수증 앱이 돌아가는 도메인이 달라서 중간에서 브릿지를 거치는 부분까지 구현해야했다.
너무나도 귀찮았던 나는 iframe을 시도했는데 cross origin 에러가 발생해서 포기했고, 그 다음으로는 selenium을 시도해봤지만 사용자마다 환경이 다르므로 설정이 귀찮을 것으로 생각되어 포기했다. 그러다가 Tauri에서 multiple windows를 지원함을 알고 url을 그룹웨어/비즈플레이로 설정해서 새 윈도우를 띄우는데 성공했다. 그러나 Rust backend와 통신(invoke, emit, listen 등)이 동작하지 않았다. 알고보니 이는 보안을 위해 의도된 동작이었는데 (https://github.com/tauri-apps/tauri/issues/2383), workaround를 알아내어 소개한다.
바로 url 없이 windows를 정의해둔 뒤, tauri::window::Window::eval을 이용해 location.replace 함수를 호출하는 것이다. 이렇게 하면 최초 url 로딩시에 remote가 아니라고 생각하여 __TAURI__를 inject 해주는 것 같다. 이후 location.replace 함수를 이용해 url을 변경해도 __TAURI__는 유지된다. 이후, tauri::Builder를 생성할 때 on_page_load hook을 등록하여 유저가 로그인을 해서 랜딩 페이지로 이동했을 때 법인카드 사용내역과 휴가 결재상신내역을 보여주기 위한 페이지로 이동시키도록 했다.\
마지막으로 캘린더 이벤트 표시를 위해서도 여러 선택지가 있었고 삽질을 많이 했는데, 검토한 방식은 다음과 같았다.

  1. Google Calendar API
  2. CalDav
  3. iCal 파싱

1, 2는 api 셋업 과정이 복잡해서 포기. 3은 구글 캘린더 설정에서 private ics url을 제공하고 있어 간단하게 데이터를 가져올 수 있어서 맘에 들었다. 그러나 iCal이 생각보다 너무 복잡한 포맷을 가지고 있어 애를 먹었다. ical-rs 같은 걸 시도해보긴 했으나 property 레벨까지 파싱해주지는 않아서 date format을 파싱하는 것도 여간 귀찮은 일이 아니었다 - '하루종일' 기능을 선택하면 시간 없이 date만 표시하는 포맷도 있다 (..)
Rust에서 ical 파서가 맘에 안든다면 javascript로 된 ical 파서를 쓰면 되지 않을까? npm에는 훌륭한 ical 파서 라이브러리가 있었다. 그리고 cors 문제로 fetch API를 통해 ics를 가져올 수는 없었지만 Rust backend가 그 일을 대신 해주었고, 캘린더 데이터를 가져와 필터링하여 보여주는데 성공했다 ㅎㅎ Tauri에서는 각 스택의 강점을 정말 잘 살릴 수 있던 것 같았다. 이제 앱에 사용성과 에러 핸들링을 좀더 개선하여 동료들에게 배포해볼 예정이다.

0개의 댓글