# Spot - Go 언어용, React와 비슷한 데스크탑 GUI 툴킷

> Clean Markdown view of GeekNews topic #15001. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=15001](https://news.hada.io/topic?id=15001)
- GeekNews Markdown: [https://news.hada.io/topic/15001.md](https://news.hada.io/topic/15001.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-05-26T09:45:04+09:00
- Updated: 2024-05-26T09:45:04+09:00
- Original source: [github.com/roblillack](https://github.com/roblillack/spot)
- Points: 4
- Comments: 1

## Topic Body

- 심플한 크로스플랫폼 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에 대한 더 나은 지원이 추가되면 더 많은 개발자들이 사용할 수 있을 것임.

## Comments



### Comment 25596

- Author: neo
- Created: 2024-05-26T09:45:04+09:00
- Points: 1

#### [Hacker News 의견](https://news.ycombinator.com/item?id=40469592)   
##### 해커뉴스 댓글 모음 요약  
  
- 지원되는 플랫폼을 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를 생성하는 명령이 있으면 좋겠음.
