4P by neo 2달전 | favorite | 댓글 1개
  • 심플한 크로스플랫폼 Reactive GUI 툴킷
  • 간단함: 프로젝트에 간단히 추가하고 바로 UI를 구축할 수 있음. 추가 도구나 코드 생성 단계가 필요 없음. Go 코드를 작성하면 자체 포함된 바이너리로 네이티브 GUI 애플리케이션 생성 가능
  • 크로스 플랫폼: 가능한 경우 네이티브 위젯을 사용하며, 컴파일 시 실행 중인 플랫폼에 가장 적합한 백엔드를 자동으로 선택함. 현재 FLTK 기반과 Cocoa 기반의 두 가지 백엔드 구현이 제공됨
  • 반응형: 애플리케이션 상태가 변경될 때 UI를 자동으로 업데이트함. 부작용이 없는 렌더링 함수를 제공하고 UseState 훅을 사용하여 애플리케이션 상태를 관리
  • 광범위한 위젯 지원: Spot은 버튼, 레이블, 텍스트 입력, 슬라이더, 드롭다운 등 다양한 UI 컨트롤을 기본적으로 제공

자주 묻는 질문 (FAQs)

"반응형"이란 무엇을 의미하는가?

  • Spot에서 _반응형_이란 애플리케이션 상태가 변경될 때 UI가 자동으로 업데이트됨을 의미함. 이는 상태 변경 시 불변 컴포넌트 트리를 다시 빌드하여 이전 상태와 비교해 어떤 UI 컨트롤이 업데이트되어야 하는지 결정함으로써 이루어짐.

Spot이 사용하는 "네이티브 위젯"이란 무엇인가?

  • 현재 Spot은 macOS에서 Cocoa 백엔드를 사용하고, 다른 모든 플랫폼에서는 FLTK 기반 백엔드를 사용함. 선택적으로 Mac에서도 FLTK를 사용할 수 있음. 향후 Windows에 대한 더 나은 지원이 계획되어 있음.

나만의 훅을 구현할 수 있는가?

  • 예, React와 마찬가지로 나만의 훅을 구현할 수 있음. *spot.RenderContext를 첫 번째 인수로 받는 함수를 만들고 이를 통해 Spot 라이프사이클에 "훅"을 걸 수 있음.

커스텀 컴포넌트를 작성하는 방법은?

  • Spot에서 UI를 컴포넌트로 분리하는 몇 가지 방법이 있음. 주요 방법은 spot.Component 인터페이스를 구현하는 구조체를 만드는 것임. 이 인터페이스는 Render(ctx *spot.RenderContext) spot.Component라는 단일 메서드를 가지고 있음.

제공된 것과 다른 위젯 라이브러리를 사용할 수 있는가?

  • 예, 가능함. spot.Component 인터페이스를 구현하고 네이티브 위젯을 관리하는 구조체를 만들면 됨.

Cocoa 또는 FLTK 이외의 백엔드를 사용할 수 있는가?

  • 현재로서는 이 두 백엔드만 지원됨. 다른 백엔드를 추가하고 싶다면 PR을 제출할 수 있음.

spot/uispot의 차이점은?

  • spot은 반응형 모델과 렌더링 기능을 제공하는 핵심 패키지임. 백엔드에 구애받지 않으며 spot.Control 인터페이스를 구현하는 모든 컨트롤 세트와 함께 사용할 수 있음.
  • spot/uispot과 함께 사용할 수 있는 사전 빌드된 크로스 플랫폼 GUI 컨트롤 세트를 제공함.

"컴포넌트"와 "컨트롤"의 차이점은?

  • Spot에서 _컴포넌트_는 비즈니스 로직과 상태를 포함하는 애플리케이션의 논리적 단위임. 모든 컴포넌트는 다른 컴포넌트로 구성되며 궁극적으로 하나 이상의 "컨트롤"로 렌더링됨.
  • _컨트롤_은 UI 트리에 마운트되고 화면에 시각적 요소를 나타내는 특수한 종류의 컴포넌트임.

Spot에서 "make", "render", "build", "mount", "update" 용어의 의미는?

  • Make: 새로운 컴포넌트 인스턴스를 생성하는 과정. spot.Component 인터페이스를 구현하는 구조체의 인스턴스를 참조하거나 렌더 함수로 spot.Make를 호출하여 수행됨.
  • Render: 컴포넌트의 상태를 빌딩 블록에 적용하여 다른 컴포넌트 인스턴스를 반환하는 과정. 컴포넌트 인스턴스에서 Render 메서드를 호출하여 수행됨.
  • Build: 컴포넌트 인스턴스에서 새로운 UI 트리를 생성하는 과정. 컴포넌트를 재귀적으로 렌더링하여 컨트롤 트리를 생성함.
  • Mount: (가상) 컨트롤 트리에서 실제 UI 컨트롤을 생성하는 과정. 트리 노드에서 Mount를 호출하거나 컴포넌트 인스턴스 또는 렌더 함수로 spot.Mount를 호출하여 수행됨.
  • Update: (마운트된) 컨트롤 트리를 업데이트하는 과정. 트리 노드에서 Update를 호출하여 수행됨.

현재 Spot이 지원하지 않는 기능

  • 자동 레이아웃
  • 다중 창
  • 모달 대화상자
  • 크기 조정 가능한 창
  • 메뉴 바
  • 커스텀 위젯
  • 네이티브 위젯 접근
  • 드래그 앤 드롭
  • 국제화

지원되는 UI 컨트롤 목록

  • Button: 액션을 시작하는 간단한 버튼 (Fl_Button, NSButton)
  • Checkbox: 상호 배타적인 두 가지 옵션 중 하나를 선택하는 컨트롤 (Fl_Check_Button, NSButton (NSButtonTypeSwitch))
  • ComboBox: 텍스트 입력이 가능한 드롭다운 메뉴 (ComboBox, NSComboBox)
  • Dial: 원형 상태 컨트롤 (Fl_Dial, NSProgressIndicator (with NSCircular style))
  • Dropdown: 여러 옵션 중 하나를 선택하는 드롭다운 메뉴 (Fl_Choice, NSComboBox)
  • Image: 이미지 컨트롤 (Image, NSImageView)
  • Label: 간단한, 편집 불가능한 텍스트 레이블 (Fl_Box, NSTextField)
  • ListBox: 스크롤 가능한 컨트롤로, 주어진 목록에서 하나 또는 여러 항목을 선택할 수 있음 (Fl_Select_Browser/Fl_Multi_Browser, NSTableView)
  • ProgressBar: 장기 실행 작업의 진행 상황을 시각화하는 진행 막대 컨트롤 (Fl_Progress, NSProgressIndicator)
  • Slider: 수평 슬라이더 입력 컨트롤 (Fl_Slider, NSSlider)
  • Spinner: 위/아래 버튼이 있는 숫자 입력 컨트롤 (Fl_Spinner, NSTextField+NSStepper)
  • TextField: 단일 라인 텍스트 입력 컨트롤 (Fl_Input, NSTextField)
  • TextView/TextEditor: 다중 라인 텍스트 내용을 보기/편집할 수 있는 범용 텍스트 상자 (Text, NSTextView)
  • Window: 화면에 (최상위) 창을 나타내는 컨트롤 (Fl_Window, NSWindow)

GN⁺의 의견

  • Spot은 Go 언어로 크로스 플랫폼 GUI 애플리케이션을 쉽게 개발할 수 있게 해줌. 특히 반응형 모델을 도입하여 개발자가 UI 업데이트에 신경 쓰지 않고 애플리케이션 로직에 집중할 수 있게 함.
  • 현재 지원되지 않는 기능들이 많아, 복잡한 애플리케이션을 개발할 때는 제한이 있을 수 있음. 특히 자동 레이아웃이나 다중 창 같은 기능이 필요하다면 다른 툴킷을 고려해야 함.
  • Spot의 단순성과 크로스 플랫폼 지원은 작은 프로젝트나 프로토타입 개발에 매우 유용할 수 있음. 하지만 대규모 애플리케이션에서는 기능의 한계가 있을 수 있음.
  • Spot의 커뮤니티와 문서화가 더 발전하면, 더 많은 개발자들이 쉽게 접근하고 사용할 수 있을 것임. 특히 커스텀 훅과 컴포넌트 작성 방법에 대한 예제가 더 많아지면 좋을 것임.
  • Spot의 백엔드 확장 가능성은 흥미로움. 특히 Windows에 대한 더 나은 지원이 추가되면 더 많은 개발자들이 사용할 수 있을 것임.

Hacker News 의견

해커뉴스 댓글 모음 요약

  • 지원되는 플랫폼을 README에 명시하면 좋겠음. Flutter 문서처럼 작성하는 것을 제안함.
  • Go를 사용해 내부 개발 도구를 만들고자 하는데, 현재 Wails를 사용 중이며 만족하고 있음. 이 프로젝트도 흥미로워 보이며 한번 살펴볼 가치가 있음.
  • Go가 크로스 플랫폼 UI 개발에 좋은 경험을 제공할 수 있다고 생각함.
    • 빌드 복잡성을 관리하는 것이 크로스 플랫폼 개발의 큰 어려움인데, Go는 이를 거의 제거함.
    • 네이티브 컨트롤의 크기가 플랫폼마다 다를 때 크로스 플랫폼 레이아웃을 어떻게 해결할지 궁금함.
  • 가상 컨트롤 트리 접근 방식의 장점이 무엇인지 궁금함.
    • 사용자에게 표시되는 컨트롤을 직접 업데이트하는 것과 비교했을 때 어떤 이점이 있는지 알고 싶음.
  • 몇 년 전부터 이런 것을 찾고 있었음.
    • Windows 지원이 필요해서 C++로 전환하여 wxWidgets를 사용함.
  • 노력은 칭찬하지만, Windows 지원이 없는 크로스 플랫폼은 아쉬움.
  • 3주 전에 이 프로젝트를 알았더라면 좋았을 것임.
    • Go로 포팅된 React나 React-like 프레임워크가 훌륭한 개발 경험을 제공할 것이라고 생각함.
  • Fltk는 Windows를 지원함.
    • 다른 솔루션을 사용하기 때문에 Windows를 아직 지원하지 않는 것인지 궁금함.
  • 이 코드가 GOMAXPROCS를 최소 2로 설정해야 함을 의미하는지 궁금함.
  • 크로스 플랫폼 빌드가 어떻게 이루어지는지 궁금함.
    • 각 플랫폼별 패키지 관리, 컨테이너, 서명 문제를 해결하지 않고도 MacOS .app과 Windows exe를 생성하는 명령이 있으면 좋겠음.