작성자는 쉐퍼드23의 Product Manager & Software Engineer로 재직하며 카페24 플랫폼을 대상으로 하는 Contextual Bandit 기반의 개인화 상품 추천 플러그인 PickHound의 개발 부문을 담당한 바가 있습니다. (See: 경력 기술서 - PickHound)
작성자는 플러그인 개발의 일환으로, StencilJS를 이용해 카페24 쇼핑몰 위에 표시되는 상품 추천 팝업 배너를 개발하였고, 팝업 배너의 디자인을 수정할 수 있는 디자인 에디터를 React CSR 애플리케이션으로 구현한 쇼핑몰 관리자용 어드민 대시보드를 개발하였습니다.
![Banner Design Page](/assets/images/banner-design-page-bc87fb899b9b4bda70bf878be0b92d73.png)
이번 글에서는 이 중 배너 디자인 수정 페이지를 개발하며 겪었던 상태 관리에 대한 고민과 이를 해결하기 위해 시도했던 방법들에 대해 소개하고자 합니다.
Why StencilJS?
카페24 쇼핑몰에 삽입되어 기존 쇼핑몰 위에 표시되는 상품 추천 팝업 배너는 StencilJS로 개발되었습니다.
카페24에 입점한 쇼핑몰은 플랫폼 내부의 플러그인 스토어를 통해 여러 플러그인을 설치해 쇼핑몰에 적용할 수 있습니다. 이에 비즈니스 로직이 실행되려면 이에 앞서 스크립트가 다운로드 되어야 했고, 작성한 스크립트가 빠르게 실행되어 의도한 비즈니스 로직이 지연으로 인해 상품 추천을 하기도 전에 유저가 다른 페이지로 이동해버리는 등 원하는 결과를 얻지 못하는 상황을 방지하기 위해 작은 번들 사이즈가 필수적이였습니다.
이러한 상황에서 작성자는 StencilJS를 도입했습니다. React를 사용했을 때보다 번들 사이즈도 줄어들 것이고, 실행 시간도 Virtual DOM을 사용하는 React보다 브라우저의 Native Support가 있는 web-component를 기반으로 작동하는 StencilJS가 이 상황에서 이상적인 선택이라고 생각했습니다.
그리고 결과적으로 이러한 선택을 통해 기능이 동일한 타사 추천 플러그인에 비해 본 팀의 스크립트 번들 사이즈를 60% 줄이는 등의 성능적인 측면에서의 성과가 있었습니다.
작업의 경과
배너 디자인 페이지는 위 사진에서 보이는 “배너 디자인 설정” 카드에서 배너의 색깔, 스타일, 그림자 유무 등의 디자인을 설정하도록 개발하였는데, 어떤 옵션을 변경할 때마다 배너에 변경한 옵션이 적용되도록 개발하고자 하였습니다.
여기서 어려웠던 점은, 배너는 StencilJS, 대시보드는 React CSR 애플리케이션으로 개발하는 상황에서 배너의 디자인 정보를 Web Component에 안정적으로 반영하는 것이었습니다.
처음에는 이를 전부 Redux에 기반한 FLUX 패턴으로 해결하고자 하였습니다. @reduxjs/toolkit
의 createSlice
API를 이용해 DesignSlice
를 만들어 모든 디자인 정보를 관리하고, view
에서 배너의 디자인 정보를 변경할 때마다 dispatch