Haskell로 GTK 애플리케이션 만들기, 1부
요약
본 글은 Haskell 언어를 사용하여 GTK 애플리케이션을 개발하는 과정과 경험을 공유합니다. GTK4의 변화와 GUI 툴킷의 미래에 대한 비판적 시각을 제시하며, 복잡한 이벤트 처리 및 아키텍처 설계에 대한 기술적인 논의를 포함하고 있습니다.
핵심 포인트
- Haskell로 GTK 앱 개발은 react-banana나 reflex 같은 라이브러리를 사용한다.
- GTK4는 GNOME 중심 툴킷으로 범용성이 떨어진다는 비판이 있다.
- GUI 이벤트 처리는 콜백 지옥을 피하기 위해 채널 기반의 갱신 루프가 필요하다.
- Haskell 개발 시 복잡한 패키지 의존성 문제가 발생할 수 있어 C++ 사용도 고려된다.
아직도 GTK를 쓰는 사람이 있나? 예전에 ruby-gtk2로 배우기 시작했는데, 썩 좋은 경험은 아니었지만 위젯과 UI의 핵심 개념은 여럿 익힐 수 있었음. GTK3는 GTK2보다 나빠진 부분도 있었지만 부분적인 CSS 지원 같은 개선도 있었고, wxWidgets 등을 쓸 때면 그 기능이 늘 아쉬움.
하지만 GTK4에서 기존 기능이 대거 깨지거나 사라짐. 창을 왼쪽 위에 배치하는 main_window_widget.move(0, 0) 같은 단순한 기능도 그중 하나임. Ruby에서 .top_left라는 별칭을 만들어 잘 쓰고 있었고 우회 방법도 있지만, 사라진 기능이 이것만이 아님. GTK4는 GNOME 중심 툴킷이고, GTK5는 Wayland 전용이 될 테니 더 나빠질 것으로 봄.
GNOME·GTK 개발자들과 소통하는 건 시간 낭비였고, 나만 그런 것도 아님. GNOME 사용자에게는 유용하겠지만, 개발자들의 주장과 달리 GTK는 더 이상 범용 툴킷이라 보기 어려움. GNOME을 쓰지 않는 우리가 굳이 GTK의 명맥을 유지해 줘야 할 이유가 있을까? 더 분산된 방식으로 개발할 수 있는 툴킷이 필요함. 다만 자금 조달이 어렵고 웹이 지배적이 된 뒤 GUI 분야가 크게 위축된 듯해서, 나에게도 뾰족한 대안은 없음.
.backdrop::after의 backdrop-filter를 .backdrop picture의 filter로 교체하면 간단히 스크롤 성능을 높일 수 있음.
스크롤 성능이 정말 나빠서 읽는 재미가 떨어짐. 하필 GUI를 다루는 글이라 더 아쉬움.
데스크톱과 모바일 브라우저의 읽기 모드 아이콘을 눌러 보면 좋음. 이런 페이지뿐 아니라, 이미 전부 불러온 콘텐츠를 유료 구독 팝업으로 가리는 사이트 등에서도 유용함.
import GI.Awd qualified as Adw는 부디 오타이길 바람.
LSP가 거들었을 수도 있음. Adw.foo를 입력하자 “GI.Awd에서 foo를 찾았는데, 입력한 이름으로 가져올까요?”라고 제안했을 법함.
몇 년째 Haskell GUI를 만들고 있는데, gtk-gi 신호를 수동으로 연결하면 금방 복잡해져서 주로 react-banana나 reflex를 사용함. 여기의 Elm 아키텍처는 설계상 깔끔해 보이지만, 위젯 트리에서 오는 비동기 이벤트를 콜백 지옥 없이 어떻게 처리하는지 궁금함.
모든 GI 콜백을 채널로 감싸서 갱신 루프에 전달하는 방식으로 구현했나?
이 경우 Haskell이 로컬 HTTP 포트를 열고 사용자가 브라우저로 접속하는 구조인가? 아니면 Tauri/Electron 같은 형태인가?
나처럼 Linux에서 Haskell이 초래하는 복잡한 패키지 의존성 때문에 Haskell을 피하는 사람도 있다는 점을 알아 두면 좋겠음. Pandoc이 이 문제로 악명 높음. 그냥 C++을 쓰는 편을 권함.
사용하는 배포판은 원래 의도된 방식대로 Haskell 라이브러리를 정적 링크하지 않나? pandoc 설치에 필요한 건 libgmp뿐임.
그건 전적으로 배포판 탓임. Arch Linux의 패키징 방식은 사용자에게 불친절하며, Fedora에서는 그런 일을 겪지 않음.
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기