- 심플한 크로스플랫폼 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/ui
와 spot
의 차이점은?
-
spot
은 반응형 모델과 렌더링 기능을 제공하는 핵심 패키지임. 백엔드에 구애받지 않으며 spot.Control
인터페이스를 구현하는 모든 컨트롤 세트와 함께 사용할 수 있음.
-
spot/ui
는 spot
과 함께 사용할 수 있는 사전 빌드된 크로스 플랫폼 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에 대한 더 나은 지원이 추가되면 더 많은 개발자들이 사용할 수 있을 것임.