기여하기

이 문서 편집

문서를 번역하거나 컴퓨터에서 전체 프로젝트를 여세요.

작업을 제출하기 전까지는 아무것도 게시되지 않습니다.

블로그

Windows용 Wails v2 베타

Wails 릴리스 노트 및 공지

leaanthony읽는 데 5분

Wails 스크린샷

2년이 조금 넘는 시간 전, 시드니의 기차 안에서 Reddit에 Wails를 처음 공개했을 때만 해도 이렇게 큰 관심을 받으리라고는 생각하지 못했습니다. 며칠 뒤, 활발하게 활동하는 한 기술 동영상 블로거가 튜토리얼 영상을 공개하고 긍정적으로 평가했으며, 그때부터 이 프로젝트에 대한 관심이 폭발적으로 증가했습니다.

사람들이 자신의 Go 프로젝트에 웹 프런트엔드를 추가하는 데 열광한다는 사실은 분명했고, 거의 즉시 제가 만든 개념 증명 수준을 넘어 프로젝트를 발전시켰습니다. 당시 Wails는 프런트엔드를 처리하기 위해 webview 프로젝트를 사용했으며, Windows에서 사용할 수 있는 유일한 선택지는 IE11 렌더러였습니다. 많은 버그 보고의 근본 원인은 부족한 JavaScript/CSS 지원과 디버깅용 개발자 도구의 부재라는 이 제약에 있었습니다. 개발 과정은 답답했지만, 이를 바로잡기 위해 할 수 있는 일은 많지 않았습니다.

저는 오랫동안 Microsoft가 결국 브라우저 문제를 해결할 수밖에 없으리라고 확신했습니다. 세상은 계속 발전하고 프런트엔드 개발은 급성장하고 있었지만, IE는 기대에 미치지 못했습니다. Microsoft가 새로운 브라우저 전략의 기반으로 Chromium을 사용하겠다고 발표했을 때, Wails가 이를 활용하여 Windows 개발 환경을 한 단계 끌어올리는 것은 시간문제라고 생각했습니다.

오늘 드디어 Windows용 Wails v2 베타를 발표하게 되어 기쁩니다! 이번 릴리스에는 살펴볼 내용이 아주 많으니, 마실 것을 준비하고 자리에 앉아 시작해 보겠습니다…

CGO 의존성 없음!

아니요, 농담이 아닙니다. CGO 의존성이 없습니다 🤯! Windows는 MacOS 및 Linux와 달리 기본 컴파일러가 함께 제공되지 않습니다. 게다가 CGO에는 mingw 컴파일러가 필요하고 설치 방법도 매우 다양합니다. CGO 요구 사항을 제거하면서 설정이 크게 간소화되었고 디버깅도 훨씬 쉬워졌습니다. 이를 구현하기 위해 저도 상당한 노력을 기울였지만, 가장 큰 공로는 이 작업을 가능하게 한 두어 개의 프로젝트를 시작했을 뿐만 아니라 다른 사람이 그 프로젝트를 이어받아 발전시키는 것도 기꺼이 허용한 John Chadwick에게 돌아가야 합니다. 제가 이 길로 들어서게 해 준 winc 프로젝트의 Tad Vizbaras에게도 감사를 전합니다.

WebView2 Chromium 렌더러

개발자 도구 스크린샷

마침내 Windows 개발자도 애플리케이션에 최고 수준의 렌더링 엔진을 사용할 수 있게 되었습니다! 이제 Windows에서 작동하도록 프런트엔드 코드를 억지로 뜯어고치던 시절은 끝났습니다. 게다가 최고 수준의 개발자 도구 환경도 제공됩니다!

하지만 WebView2 구성 요소를 사용하려면 WebView2Loader.dll이 바이너리 옆에 있어야 합니다. 이 때문에 배포 과정이 저희 Go 개발자들이 익숙한 것보다 조금 더 번거로워집니다. 제가 아는 한 WebView2를 사용하는 모든 솔루션과 라이브러리에는 이 의존성이 있습니다.

하지만 Wails 애플리케이션에는 그러한 요구 사항이 없다는 기쁜 소식을 전해 드립니다! John Chadwick의 마법 같은 기술 덕분에 이 dll을 바이너리 안에 번들로 포함하고, 디스크에 실제로 있는 것처럼 Windows가 로드하게 할 수 있습니다.

Go 개발자 여러분, 기뻐하십시오! 단일 바이너리의 꿈은 계속됩니다!

새로운 기능

Wails 메뉴 스크린샷

네이티브 메뉴 지원을 요청하는 분이 많았습니다. 이제 Wails가 이를 지원합니다. 애플리케이션 메뉴를 사용할 수 있으며, 대부분의 네이티브 메뉴 기능을 지원합니다. 여기에는 표준 메뉴 항목, 체크박스, 라디오 그룹, 하위 메뉴 및 구분선이 포함됩니다.

v1에서는 창 자체를 더 세밀하게 제어할 수 있게 해 달라는 요청이 아주 많았습니다. 이를 위한 새로운 런타임 API가 추가되었다는 기쁜 소식을 전합니다. 다양한 기능을 제공하며 다중 모니터 구성도 지원합니다. 대화 상자 API도 개선되었습니다. 이제 모든 대화 상자 관련 요구를 충족할 수 있도록 세밀하게 구성 가능한 최신 네이티브 대화 상자를 사용할 수 있습니다.

이제 프로젝트와 함께 IDE 구성을 생성할 수 있습니다. 따라서 지원되는 IDE에서 프로젝트를 열면 애플리케이션을 빌드하고 디버그할 수 있도록 이미 구성되어 있습니다. 현재는 VSCode를 지원하며, 조만간 Goland 같은 다른 IDE도 지원할 수 있기를 바랍니다.

VSCode 스크린샷

에셋을 번들로 묶을 필요 없음

v1의 큰 불편 중 하나는 애플리케이션 전체의 JS와 CSS를 각각 하나의 파일로 합쳐야 한다는 점이었습니다. v2에서는 어떤 방식으로도 에셋을 번들로 묶을 필요가 없다는 기쁜 소식을 전합니다. 로컬 이미지를 로드하고 싶으신가요? 로컬 src 경로가 지정된 <img> 태그를 사용하십시오. 멋진 글꼴을 사용하고 싶으신가요? 글꼴을 복사한 뒤 CSS에 해당 경로를 추가하십시오.

와, 웹 서버 같은데요…

맞습니다. 웹 서버처럼 작동하지만 웹 서버는 아닙니다.

그렇다면 에셋은 어떻게 포함하나요?

모든 에셋을 포함하는 단일 embed.FS을 애플리케이션 구성에 전달하기만 하면 됩니다. 에셋이 최상위 디렉터리에 있을 필요조차 없습니다. Wails가 알아서 처리합니다.

새로운 개발 환경

브라우저 스크린샷

이제 에셋을 번들로 묶을 필요가 없어지면서 완전히 새로운 개발 환경을 사용할 수 있게 되었습니다. 새로운 wails dev 명령은 애플리케이션을 빌드하고 실행하지만, embed.FS의 에셋을 사용하는 대신 디스크에서 직접 로드합니다.

또한 다음과 같은 기능도 제공합니다.

  • 핫 리로드 - 프런트엔드 에셋을 변경하면 애플리케이션 프런트엔드가 자동으로 다시 로드됩니다.
  • 자동 재빌드 - Go 코드를 변경하면 애플리케이션이 다시 빌드되고 재실행됩니다.

이와 함께 포트 34115에서 웹 서버가 시작됩니다. 이 서버는 접속하는 모든 브라우저에 애플리케이션을 제공합니다. 연결된 모든 웹 브라우저는 에셋 변경 시 핫 리로드 같은 시스템 이벤트에 반응합니다.

Go에서는 애플리케이션에서 구조체를 사용하는 데 익숙합니다. 구조체를 프런트엔드로 전송하여 애플리케이션의 상태로 사용하면 유용한 경우가 많습니다. v1에서는 이 과정 대부분을 수동으로 처리해야 해서 개발자에게 다소 부담이 되었습니다. v2에서는 개발 모드로 실행되는 모든 애플리케이션이 바인딩된 메서드의 입력 또는 출력 매개변수로 사용되는 모든 구조체에 대해 TypeScript 모델을 자동으로 생성합니다. 이를 통해 두 환경 간에 데이터 모델을 원활하게 주고받을 수 있습니다.

이와 함께 바인딩된 모든 메서드를 래핑하는 또 다른 JS 모듈도 동적으로 생성됩니다. 이 모듈은 메서드에 대한 JSDoc을 제공하여 IDE에서 코드 완성과 힌트를 사용할 수 있게 합니다. Go 코드를 래핑하도록 자동 생성된 모듈에서 Tab 키를 누를 때 데이터 모델이 자동으로 import되는 모습은 정말 멋집니다!

원격 템플릿

원격 템플릿 스크린샷

애플리케이션을 빠르게 실행할 수 있게 하는 것은 항상 Wails 프로젝트의 핵심 목표였습니다. Wails를 처음 출시했을 당시에는 React, Vue, Angular 등 당시의 다양한 최신 프레임워크를 지원하고자 했습니다. 프런트엔드 개발 세계는 선호가 뚜렷하고 변화가 빠르며 최신 흐름을 따라가기도 어렵습니다! 그 결과 기본 템플릿은 금세 낡았고 유지 관리에 골칫거리가 되었습니다. 또한 최신 기술 스택을 위한 멋진 최신 템플릿도 제공하지 못했습니다.

v2에서는 커뮤니티가 Wails 프로젝트에 의존하지 않고 직접 템플릿을 만들어 호스팅할 수 있도록 하고 싶었습니다. 이제 커뮤니티에서 지원하는 템플릿으로 프로젝트를 만들 수 있습니다! 이를 계기로 개발자들이 활기찬 프로젝트 템플릿 생태계를 조성하기를 바랍니다. 개발자 커뮤니티가 무엇을 만들어 낼지 정말 기대됩니다!

맺음말

Wails v2는 프로젝트의 새로운 기반입니다. 이번 릴리스의 목표는 새로운 접근 방식에 관한 피드백을 받고 정식 릴리스 전에 버그를 모두 해결하는 것입니다. 여러분의 의견을 적극 환영합니다. 피드백은 v2 베타 토론 게시판에 남겨 주세요.

이 지점에 도달하기까지 수많은 우여곡절과 방향 전환, 원점 회귀가 있었습니다. 초기의 기술적 결정 중 일부를 변경해야 했던 것이 한 가지 이유였고, 해결 방법을 만드는 데 시간을 들였던 몇몇 핵심 문제가 업스트림에서 해결된 것도 또 다른 이유였습니다. Go의 embed 기능이 좋은 예입니다. 다행히 모든 것이 적절한 시점에 맞아떨어졌고, 오늘날에는 우리가 구현할 수 있는 최상의 솔루션을 갖추게 되었습니다. 기다린 보람이 있었다고 생각합니다. 불과 2개월 전만 해도 이는 불가능했을 것입니다.

또한 다음 분들께도 진심으로 감사드립니다 :pray:. 이분들이 없었다면 이번 릴리스는 존재하지 못했을 것입니다.

  • Misite Bao - 중국어 번역에 엄청난 노력을 기울였으며 버그를 찾아내는 능력도 탁월했습니다.
  • John Chadwick - go-webview2와 go-winloader에서 보여 준 그의 놀라운 작업 덕분에 오늘날의 Windows 버전을 구현할 수 있었습니다.
  • Tad Vizbaras - 그의 winc 프로젝트를 실험해 본 것이 순수 Go 기반 Wails로 향하는 여정의 첫걸음이었습니다.
  • Mat Ryer - 그의 지원과 격려, 피드백은 프로젝트를 발전시키는 데 큰 원동력이 되었습니다.

마지막으로 JetBrains를 비롯한 모든 프로젝트 후원자께 특별히 감사드립니다. 이분들의 지원은 보이지 않는 곳에서 여러 방면으로 프로젝트를 발전시키는 원동력이 됩니다.

프로젝트가 흥미진진한 다음 단계로 접어드는 지금, 사람들이 Wails로 무엇을 만들지 기대됩니다!

Lea.

추신: MacOS 및 Linux 사용자도 소외감을 느낄 필요가 없습니다. 이 새로운 기반으로 포팅하는 작업이 활발히 진행 중이며, 어려운 작업은 대부분 이미 완료되었습니다. 조금만 더 기다려 주세요!

추신 2: 여러분이나 여러분의 회사에서 Wails를 유용하게 사용하고 있다면 프로젝트 후원을 고려해 주세요. 감사합니다!