2주만에 피그마 플러그인 개발하기 - Flamel 3D icon AI generator

400만 유저의 피그마. 잘 만든 플러그인은 글로벌 고객의 유입을 기대할 수 있습니다. 2주만에 배포까지 완료한 플라멜의 3D 아이콘 AI 생성기 플러그인 개발 과정을 소개합니다.
Flamel Team's avatar
Nov 27, 2024
2주만에 피그마 플러그인 개발하기 - Flamel 3D icon AI generator
💫
글로벌 디자인 협업툴 피그마에도 플러그인이 있습니다. 잘 만든 유용한 피그마 플러그인은 글로벌 고객의 유입을 기대할 수 있습니다. 플라멜은 첫번째 플러그인, Flamel - 3D icon AI generator을 공개했습니다. 2주만에 배포한 피그마 플러그인 개발 과정에 대해 소개합니다.

Figma Plugin, 왜 사용할까?

피그마는 UI/UX 디자인 작업, 버전 히스토리 기록, 팀원 간의 실시간 협업을 단일 프로그램에서 할 수 있게 해주는 강력한 웹 기반 디자인 도구입니다. 피그마의 실시간 협업 기능 덕분에, 전 세계의 많은 회사들이 피그마를 활용하고 있으며, 토스 사내에서도 디자인 툴로 적극적으로 채택하고 있는 것으로 알려져 있습니다.
하지만 모든 도구가 그렇듯이, 피그마도 모든 기능을 완벽하게 제공하지는 않습니다. 필요한 경우, 피그마가 제공하지 않는 기능을 다양한 서드파티 플러그인으로 보완할 수 있습니다. 예를 들어, Font Changer 플러그인은 파워포인트에서의 글꼴 바꾸기 작업처럼, 다량의 글꼴을 일괄 변경할 수 있게 도와주며, Iconify 플러그인은 다양한 오픈소스 아이콘을 한번에 검색하고 쉽게 사용할 수 있도록 돕습니다. 이는 작업자들의 번거로움을 줄여주고 피그마 내에서 모든 작업을 수행할 수 있도록 도와 작업 속도를 대폭 향상시킵니다. 내게 필요한 피그마 플러그인은 피그마 커뮤니티에서 검색을 통해 찾을 수 있습니다.

왜 3D Icon Generator 플러그인일까?

앞서 언급한 Iconify 플러그인은 피그마에서 가장 인기있는 플러그인 중 하나지만, 기존 아이콘 에셋을 검색하는 것에서 그치는 점이 아쉬웠습니다. 특히 3D 아이콘에 있어서는 제한적인 모습입니다. 사실 3D 아이콘은 최근에서야 유행하고 있는 에셋으로, 오픈소스로 활용할 수 있는 에셋 자체가 제한적인 것이 현실이죠.
그래서인지 3D 아이콘 생성은 AI 이미지 어시스턴트, 플라멜에서 가장 큰 인기를 끌고 있는 카테고리입니다. 원하는 3D 아이콘을 3D 툴로 직접 만들기 위해서는 보통 4-5시간이 소요되는데요, 플라멜에서는 귀엽고 세련된 스타일의 3D 아이콘을 20초만에 만들어낼 수 있습니다. 최근에는 톤앤매너를 유지한 다양한 3D 아이콘 에셋이 꾸준히 업데이트 되고 있구요!
플라멜(flamel.app)에서 확인할 수 있는 경제/금융 3D 아이콘팩
플라멜(flamel.app)에서 확인할 수 있는 경제/금융 3D 아이콘팩
이렇게 제작된 3D 아이콘은 주로 UI/UX 디자인에 적용됩니다. 기획자와 디자이너는 UI/UX 디자인을 위해 주로 피그마를 활용하고 있으니, 피그마에서 바로 3D 아이콘 생성 작업을 한다면 기존 워크플로우에 그대로 녹아들어 작업 효율을 높일 수 있을 것입니다.
신한은행 기업인터넷뱅킹 (bizbank.shinhan.com) 메인페이지에 사용된 3D 아이콘
신한은행 기업인터넷뱅킹 (bizbank.shinhan.com) 메인페이지에 사용된 3D 아이콘
피그마 플러그인을 출시한지 2달이 지난 지금, 약 5천명의 글로벌 유저가 플러그인을 다운받았으며, 100개국 유저가 실제 플라멜 웹 서비스에 유입되었습니다. 실제 니즈가 큰 분야였음을 알 수 있습니다.
notion image

피그마 플러그인 아키텍쳐

그럼 본격적으로 피그마 플러그인 개발에 대해 소개하기에 앞서, 피그마 플러그인의 아키텍쳐에 대해서 알아보도록 하겠습니다.
피그마 플러그인 아키텍처 / 출처: https://www.figma.com/plugin-docs/how-plugins-run/#plugin-environment
피그마 플러그인 아키텍처 / 출처: https://www.figma.com/plugin-docs/how-plugins-run/#plugin-environment
공식문서에 의하면 피그마 플러그인은 위와 같이 샌드박스 환경과 iframe 환경으로 분리 되어 있습니다. 쉽게 설명하면 샌드박스 환경은 피그마 디자인 파일 그 자체로 볼 수 있고, iframe 환경은 피그마 캔버스 위에 띄워지는 플러그인 모달로 이해할 수 있습니다. 즉, 샌드박스를 통해 피그마 디자인 파일에서 보여지는 요소들을 제어할 수 있으며(i.e. 파일에 이미지 띄우기, 플러그인 띄우기, 파일상에 존재하는 디자인 컴포넌트 정보 활용하 기, 등) iframe 상에서는 플러그인 모달의 UI 요소들을 제어할 수 있습니다.
 
한가지 주의해야 할 점은, 샌드박스는 최소한의 Javascript 환경으로 이루어져 있어 Javascript ES6+를 사용할 수 있으나, 브라우저 API (document.querySelector(), document.getElementById(),…)는 사용할 수가 없습니다. 이는 iframe에서만 가능합니다.

보일러 플레이트 및 플러그인 개발 환경 셋팅

0. 보일러 플레이트 활용

플러그인 아키텍처를 파악한 후, 기본 보일러플레이트를 설정해봅시다. 처음부터 자신만의 플러그인 개발 환경을 구성하고 싶다면, 피그마 공식 문서의 "Plugin Quickstart Guide"를 참고할 수 있습니다.
$ git clone https://github.com/CoconutGoodie/figma-plugin-react-vite

1. 피그마가 플러그인 코드를 읽는 원리 (manifest.json)

피그마는 manifest.json 파일을 통해 플러그인 코드를 실행합니다. 위 보일러플레이트에서는 manifest.json 대신 figma.manifest.ts 파일이 존재하며, 이는 Vite를 통해 나중에 manifest.json으로 번들링됩니다.
다음은 해당 파일의 구조입니다:
export default { name: "Figma-Plugin-React-Vite", id: "1222852692367737510", api: "1.0.0", main: "plugin.js", ui: "index.html", capabilities: [], enableProposedApi: false, editorType: ["figma", "figjam"], };
주요 필드 설명:
  • name: 플러그인의 이름으로, 사용자에게 표시됩니다.
  • main: 플러그인의 JavaScript 파일 경로입니다.
  • ui: 플러그인 모달의 HTML 파일 경로입니다.

2. 플러그인을 실행시켜보자

보일러플레이트를 설정한 후, 플러그인을 실행해봅시다. 먼저 Figma 데스크탑 버전이 필요합니다. 다운로드 후, 아래 명령어를 실행하여 보일러플레이트를 빌드합니다.
npm install npm run dev
빌드가 완료되면 dist 폴더 내에 index.html, manifest.json, plugin.js 파일이 생성된 것을 확인할 수 있습니다.

플러그인 실행 절차:

  1. Figma 데스크탑 앱 실행
  1. 우측 클릭 후 "Plugins > Development > Import plugin from manifest…" 선택
  1. manifest.json 파일을 업로드
  1. Figma에서 아무 디자인 파일을 열고, "Plugins > Development"에서 플러그인을 실행
notion image

3. 보일러 플레이트의 구조에 대한 설명 (피그마의 아키텍처와 연관 지어서)

보일러플레이트의 구조를 피그마 아키텍처와 연관 지어 설명하겠습니다.
앞서 언급했듯이 피그마 플러그인은 샌드박스와 iframe 환경으로 나뉩니다. 보일러플레이트 소스 코드를 보면 src 디렉토리 내에 common, plugin, ui 파일들이 있습니다.

1) src/plugin

피그마 document와 상호작용하는 코드를 포함합니다. 예를 들면, 플러그인 모달에서 피그마 디자인 파일에 특정 아이콘이나 이미지를 추가하거나, 디자인 파일의 컴포넌트 정보를 가져오는 로직이 여기에 있습니다.

2)src/ui

플러그인 모달과 관련된 React 파일들이 위치한 디렉토리입니다.

3) src/common

uiplugin 파일에서 공통으로 사용되는 로직들이 포함된 디렉토리입니다.

번들링 과정을 포함한 개발 프로세스:

  • 피그마에서 실행할 로직: src/plugin/plugin.ts → 빌드 → dist/plugin.js (실행 파일)
  • 플러그인 모달에서 실행할 로직: src/ui/index.html → 빌드 → dist/index.html (실행 파일)
  • manifest.json 로직: figma.manifest.ts → 빌드 → dist/manifest.json (Figma에 업로드)

4. 피그마에서 개발자 콘솔 실행 방법

  1. Figma 데스크톱 앱에서 플러그인을 실행합니다. Figma 웹 버전에서는 플러그인 개발자 콘솔을 사용할 수 없으므로, 반드시 데스크톱 앱을 사용해야 합니다.
  1. 플러그인 실행 후, Figma 메뉴에서 "Show/Hide console"을 선택합니다
      • 메뉴 경로: Figma 메뉴 > Plugins > Development > Open/Hide Console
  1. 단축키를 사용하여 개발자 콘솔을 열 수 있습니다:
      • Mac: Command + Option + I
      • Windows: Ctrl + Shift + I
  1. 개발자 콘솔이 열리면, 플러그인에서 발생하는 에러 로그, console.log 출력, 네트워크 요청 등을 확인할 수 있습니다.

플러그인과 피그마 간의 통신

이제 플러그인 모달과 피그마 디자인 파일이 서로 어떻게 통신하며, 이에 필요한 플러그인 api들에 대해서 설명드리도록 하겠습니다.

0. 왜 통신이 필요한가?

플러그인과 피그마 간의 통신은 플러그인의 기능을 완전하게 구현하고 사용자 경험을 향상시키기 위해 필수적입니다. 다음은 그 주요 이유들입니다.

1. 사용자 정보 저장 및 유지

플러그인 모달은 브라우저 환경과 달리 쿠키나 로컬 스토리지에 접근할 수 없는 iframe 환경이기 때문에, 사용자 정보를 저장할 수 없습니다. 이로 인해 사용자가 피그마 플러그인을 새로 열 때마다 로그인해야 하는 번거로움이 발생합니다. 이러한 문제를 해결하기 위해, 사용자 정보를 피그마 환경에 저장하여 지속성을 유지할 필요가 있습니다. 이를 위해서는 플러그인과 피그마 간의 통신이 필요합니다.

2. 디자인 애셋의 가져오기 (Import)

플러그인을 사용하는 주요 목적 중 하나는 기존에 만들어진 디자인 애셋을 현재 작업 중인 디자인 파일로 가져와 디자인 작업을 가속화하는 것입니다. 플러그인 모달에서 제공하는 디자인 애셋을 피그마 디자인 파일로 가져오기 위해서는 두 환경 간의 통신이 필수적입니다.

1. 플러그인 모달 실행

manifest.json 파일의 main 필드에서 설정된 JavaScript 파일이 실행되며, 이를 통해 figma.showUI() API로 플러그인 모달을 띄웁니다. __html__는 ui/index.html을 가리킵니다.
figma.showUI(__html__, { width: 800, height: 650, title: "My Figma Plugin!", }); // dist/plugin.js

2. 피그마와 플러그인 모달 통신

플러그인 모달을 띄우는 방법에 대해서 배웠으니, 이제 피그마 디자인 파일과 플러그인 모달 사이에 통신이 어떻게 이루어지는지 코드를 통해서 알아보도록 하겠습니다.

1) 플러그인 모달 → 피그마

아래 예시에서 플러그인 모달에서 텍스트를 디자인 파일에 보내고 디자인 파일에서 해당 메시지를 받아 콘솔 탭에 로깅하는 예시를 보이도록 하겠습니다.
 
먼저, 플러그인을 실행시킬 때 플러그인에서 피그마에 메시지 보내는 로직입니다.
useEffect(() => { parent.postMessage( { pluginMessage: { type: "sent-message", message: "sending a message...", }, }, "*" ); }, []); // src/ui/app.tsx
 
그리고 피그마에서는 메시지를 받고 console.log() 합니다
figma.ui.onmessage = async (msg: { type: string; message: string }) => { if (msg.type === "sent-message") { console.log(msg.message); } }; // src/plugin/plugin.ts
그러면 아래와 같이 콘솔 탭에서 메시지가 전달되었음을 확인할 수 있습니다.
notion image

2) 피그마 → 플러그인 모달

이제는 반대로 피그마에서 플러그인에게 메시지를 보내는 방법에 대해서 알아보도록 하겠습니다.
 
피그마에서 보낼 메시지를 작성합니다
figma.ui.postMessage({ type: "message-received", message: "message received!", }); // src/plugin/plugin.ts
 
이를 플러그인 모달에서 받아 console.log()해보겠습니다
window.onmessage = async (event) => { const message = event.data.pluginMessage; if (message.type === "message-received") { console.log(message.message); } }; // src/ui/app.tsx
 
그리고 아래와 같이 메시지가 잘 전달 되었음을 확인하실 수 있습니다.
notion image
 

피그마 플러그인, 글로벌 유저를 만날 수 있다!

피그마는 400만명의 글로벌 유저가 사용하는 서비스입니다. 잘 만든 유용한 플러그인은 메인 서비스의 글로벌 고객을 모을 수 있는 좋은 방법이 될 수 있습니다. 실제 플라멜 웹 서비스에 100개국 글로벌 유저가 유입되고 결제까지 이어지는 것에서 이를 체감하고 있습니다.
피그마 플러그인은 사용자에게 실질적인 가치를 제공하면서 동시에 브랜드 인지도를 효과적으로 높일 수 있는 방법이니, 피그마를 사용하면서 필요했던 기능이 있다면 개발을 적극 추천합니다. 단, 기존 프로덕트가 이미 있는 경우 서로 다른 프로덕트를 2개 운영하는 것이나 마찬가지가 될 수 있어 리소스에 대한 검토가 필요합니다.
이 글에서 다룬 내용은 플러그인의 기본적인 기능에 불과하지만, 플러그인의 핵심적인 부분을 잘 이해할 수 있도록 구성했습니다. 더 궁금하신 부분은 피그마 공식 문서를 참고하시거나 스모어톡팀의 문을 두드려주세요 🙂
 
*피그마 플러그인 개발을 담당한 스모어톡의 2024 여름방학 현장 실습생 Sang님이 글 작성에 함께 참여해 주셨습니다.
 
Share article
Write your description body here.

Flamel's blog