Uuno 에디터 개발 강지수
디지털 명함 에디터 프로젝트를 시작하면서 기술적 결정을 마주했다. 사용자가 자유롭게 배치하고 스타일을 조정할 수 있는 에디터를 만들어야 했는데 이를 구현하기 위한 고민이 필요했다.
처음엔 React-dnd + React-rnd를 활용한 Dom요소를 활용한 방식을 생각했지만 더 깊은 상호작용과 확장성을 위해 캔버스 기반으로 가기로 결정했다. 그 다음은 캔버스 라이브러리인 Febric.js와 React Konva 중 어떤 것을 선택할지 고민에 빠졌다.
팀원들과 의논하면서 의사 결정 과정, 각 기술의 장단점 비교, 최종 선택에 이르기까지의 과정을 적어보려고 한다.
Febric.js는 오래된 강력한 캔버스 라이브러리이다.
Konva는 HTML5 캔버스를 위한 자바스크립트 라이브러리인 Konva.js를 React 환경에서 쉽게 사용할 수 있도록 만든 라이브러리이다.
에디터 제작에 필요한 핵심 가능을 보기 쉽게 비교해봤다.
기능 | Febric.js | Konva |
---|---|---|
텍스트 편집 | 내장 기능으로 더블 클릭시 직접 편집 | 별도 input 요소 구현 필요 |
undo/redo | Json기반 스냅샷으로 상대적 쉽게 구현 | 상태 관리 로직 직접 구현 |
요소 선택 및 변형 | 내장 기능 | Transfer 컴포넌트 추가 |
저장 및 불러오기 | .toJSON(), .loadFromJSON() 내장 | 직접 직렬화 로직 구현 필요 |
Next.js 호환성 | 상대적으로 문제 적음 | SSR 이슈로 dynamic import 필요 |
기술적 특성 외에도, 우리는 다음과 같은 실용적인 고려사항을 검토했다.
Konva의 npm 다운로드 수가 더 높은 것을 확인. 이는 React 개발자들에게 접근성이 더 높은 것으로 보임. React 친화적이라 Next.js에서 사용하기에 크게 문제가 없어보임.
팀원과의 논의 끝에 우리 팀은 Konva를 선택했다. 주요한 결정 요인은 다음과 같다.
물론 이러한 결정에는 trade-off가 있다. 진입장벽이 낮고 배우기 쉽지만 그만큼 고급 구현들은 직접 구현을 해야한다. 하지만 그 또한 배우는 과정에서 의미가 있다고 판단. 잘 만들어진 라이브러리를 가져다가 사용하는건 학습과 배움에는 덜하다는 생각이 들었다. 이러한 구현을 하는 과정 자체가 팀에게 높은 학습 기회가 될 것으로 예상된다.
Konva를 선택하면서 도전과제를 예상하고 대응 전략을 계획했다.
텍스트 편집 구현
크기 조절 및 회전
상태 저장 및 복원
undo/redo
SSR이슈
const Stage = dynamic(() => import('react-konva').then(mod => mod.Stage), { ssr: false })
이번 기술 선택 과정에서 얻은 느낌은 완벽한 도구는 존재하지 않는다는 것. 특정 상황이나 팀의 상황 기술스택 등 여러 요인에 의해 모두 다 장단점이 다르게 작용한다.
Konva를 선택한 것은 Febric.js가 부족해서 선택한 것이 아니라. 우리 팀의 프로젝트 환경, 개발 기간, 학습 시간을 봤을 때 더 적합했기 때문이다. 다른 팀이나 우리와 다른 환경을 가진 프로젝트라면 Febric.js가 더 적합할 수도 있다.
이번 고민을 하면서 기술 선택은 단순히 무엇이 좋고 나쁘고를 따지는 비교가 아닌 팀의 환경, 개발 환경을 총체적으로 고려하는 과정임을 느꼈다.