Rust로 GNOME 앱 빌드하기, 6부: 피드 가져오기
이 글에서는 사용자 인터페이스를 멈추지 않고 GNOME 애플리케이션에 네트워크 가져오기를 통합하는 방법을 자세히 설명합니다. 이전 단계에서는 피드 이름을 표시하는 사이드바를 만들었지만, 피드를 선택하면 내용이 아니라 디스플레이 텍스트만 업데이트되었습니다. 피드 선택 신호 핸들러 내에서 직접 네트워크 페치를 시도하는 단순한 해결책으로, 페치 기간 동안 애플리케이션 창 전체가 멈춰버립니다. 이 멈춤은 GTK의 메인 루프가 단일 스레드에서 실행되기 때문에 차단하면 UI 업데이트나 반응이 전혀 없기 때문입니다.핵심 문제는 GTK/GObject 타입이 스레드 안전하지 않다는 점으로, 이는 백그라운드 스레드에서 직접 조작할 수 없다는 뜻입니다. 이 솔루션은 UI 작업을 위한 GTK의 GLib 메인 루프와 네트워크 요청과 같은 I/O 바운드 작업을 위한 Tokio 런타임 두 개의 별도 실행기를 실행하는 것을 포함합니다. 이 엑세큐터들은 GLib 루프가 차단되지 않고, Tokio가 GTK/GObject 타입을 직접 건드리지 않는 규칙을 엄격히 따릅니다. 이들 간의 통신은 GLib 컨텍스트의 미래가 Tokio의 결과를 기다릴 수 있는 단일 '이음새'에서 이루어지며, 그 결과 안전하게 메인 컨텍스트로 일반 값으로 돌아갑니다.이를 구현하기 위해 애플리케이션은 Tokio와 'reqwest' 의존성을 추가합니다. Tokio 런타임은 GTK 애플리케이션이 시작되기 전에 'main'에서 한 번 빌드되며, 핸들은 'GazetteApplication' 구조체에 저장됩니다. 비동기 'fetch_feed' 함수를 포함하는 새로운 'src/fetch.rs' 모듈이 생성됩니다. 이 함수는 Tokio 런타임 내에서 'reqwest'를 사용하여 RSS/Atom 피드를 다운로드하고 파싱하며, 'Vec' 구조체를 반환합니다<FeedItem>. 이 'FeedItem'은 GObject가 아닌 일반 Rust 구조체로, 스레드 안전 규칙을 위반하지 않고 GLib 메인 스레드로 안전하게 전달할 수 있도록 보장합니다.