컨텐츠 영역 바로가기

Clein's Portfolio

구 형태 3D 메쉬 오브젝트곱하기 기호 형태 3D 메쉬 오브젝트

응원 참 잘하는 집 프로젝트 아이콘응원 참 잘하는 집

이름응원 참 잘하는 집 [응.참.잘.]
설명21세기 디지털 부적 발행 및 공유 서비스
유형팀 프로젝트
인원 구성프론트엔드 5명
역할프론트엔드 개발, UI/UX 디자인 총괄
기간2024.12 ~ 유지보수 중
도메인https://eung-cham-jal.vercel.app/
GitHubhttps://github.com/ooh-eung-wan/eung-cham-jal
누적 사용자200명 대
사용 기술

Next.js React TypeScript Zustand TailWindCSS Shadcn/UI Swiper.js HTML2Canvas

기여
  • 부적 템플릿 선택 기능 개발
  • 부적 템플릿 에디터 기능 개발

    • 텍스트 및 폰트 편집 기능 개발
    • 생성된 부적 이미지 저장 기능 개발
  • URI 기반 부적 공유 기능 개발
  • 프로젝트 배포 전담
  • 공통 디자인 컴포넌트 작업
  • SEO 관련 메타데이터 작업
  • 웹 접근성 개선 및 반응형 작업
  • 서비스 기획 및 전반적인 UI/UX 디자인
비고테오의 스프린트 18기


목차

  1. 프로젝트 소개
  2. 사용 기술
  3. 트러블 슈팅
  4. 인사이트


프로젝트 소개


응원 참 잘하는 집은 제공되는 부적 템플릿을 통하여 사용자가 원하는 부적을 손쉽게 만들어낸 후 공유까지 해볼 수 있는 커스텀 부적 메이커 서비스입니다.


  • 언제, 어디서나 쉽게 발행할 수 있는 디지털 부적
  • 자유롭게 원하는 형태 및 문구를 고를 수 있는 부적

을 통해 주변 사람들에게 부담되지 않는 소소한 응원을 전달해 보고자 시작하게 되었습니다.


정보 구조도

작업 단위기능 구성상세 내용기여
인트로 페이지서비스 키 비주얼O
시작하기 버튼클릭 시 이름 작성 페이지 이동O
누적 부적 생성 횟수 출력Notion API 활용X
이름 작성 페이지이름 입력 인풋기본 값으로 랜덤 이름 생성X
다음으로 버튼클릭 시 부적 템플릿 선택 페이지 이동X
부적 템플릿 선택 페이지부적 템플릿 선택 슬라이드O
다음으로 버튼클릭 시 부적 템플릿 편집 페이지 이동O
부적 템플릿 편집 페이지편집 중인 부적 이미지 미리보기개별 텍스트 영역 클릭 시 편집 기능 활성화O
폰트 편집 기능텍스트 별 폰트 종류 변경변경 시 미리보기와 동기화O
텍스트 별 폰트 두께 변경O
텍스트 별 폰트 크기 변경O
텍스트 수정 인풋내용 입력 시 미리보기와 동기화O
저장하기 버튼부적 생성 결과 페이지 이동O
부적 생성 결과 페이지안내 문구 출력입력받은 이름 사용X
편집된 부적 이미지 미리보기 출력O
소장하기 버튼클릭 시 편집된 부적 이미지 저장X
부적 링크 공유하기 버튼클릭 시 클립보드에 부적 공유 링크 복사O
하나 더 만들기 버튼클릭 시 인트로 페이지 이동X
부적 공유 페이지안내 문구 출력입력받은 이름 사용X
공유된 부적 이미지 미리보기 출력O
나도 만들어 보기 버튼클릭 시 인트로 페이지 이동X
소장하기 버튼클릭 시 공유된 부적 이미지 저장X


시연 영상



역할

랜덤 이름 생성 기능과 부적 생성 횟수 누적 기능 중 노션 API를 활용한 부분을 제외한 거의 대부분의 핵심 로직에 기여했으며, 프로젝트 배포를 전담하였습니다.

(GitHub Insights Contributors 기준 커밋 1위, 코드 추가 2위, 코드 삭제 1위입니다.)


프로젝트 기획 단계에서 구두로만 결정된 MVP 작업 단위를 와이어 프레임으로 시각화하여 제공함으로써 팀원 분들의 서비스 이해도를 높여 실 개발 단계 이전의 의견 조율을 원활하게 이끌었습니다.


(아래 이미지 참조)



전반적인 UI/UX 디자인을 총괄하였으며, 서비스 내에서 사용되는 부적 템플릿 또한 전부 직접 디자인 하였습니다. UI 디자인은 짧은 시간 동안 혼자 시안 제작과 기능 개발을 모두 수행하기는 힘들었기 때문에 서비스의 메인 키 비주얼을 제외한 나머지는 전반적인 UI 디자인 컨셉을 정한 후 공용 디자인 컴포넌트를 먼저 작업하여 사용하는 방식으로 진행하였습니다.


(아래 이미지 참조)





사용 기술


기술적 고민

저희는 프론트엔드 개발자만 5명으로 구성된 팀이었습니다.


DB 필요 기능

  1. 편집한 부적 이미지를 타인에게 공유하는 기능
  2. 지금까지 생성된 부적 갯수 누적 기능

아쉬웠던 점



트러블 슈팅


URI 기반 이미지 공유 기능 관련 414 상태 코드 이슈



HTML2Canvas 라이브러리 관련 스타일 충돌 이슈

이미 HTML2Canvas 라이브러리를 통해 부적 이미지 출력 기능을 개발한 상태에서, 나중에 구현한 부적 템플릿 결과물을 실제로 출력해보니 부적 이미지가 아래와 같은 형태로 스타일이 올바르게 적용되지 않는 문제가 있었습니다.


기대한 결과물출력된 결과물

관련 이슈를 찾아보니 HTML2Canvas 라이브러리에서 HTML 요소의 위치 값 계산에 사용하는 스타일 중 하나가 TailWindCSS의 기본 Preflight 스타일과 충돌되는 이슈가 있어 아래 CSS를 적용하여 해결하였습니다. 또한 템플릿에 사용했던 스타일 중 라이브러리가 지원하지 않는 스타일도 여럿 발견되어서 정식 출시 전에 조속히 수정할 수 있었습니다.


CSS

@layer base {
  img {
    @apply inline-block;
  }
}


Zustand Selector 관련 이슈

Zustand를 사용하여 부적 편집 기능을 개발하던 도중 아래와 같은 형태의 코드에서 Selector 함수에 명시한 상태가 올바르게 반환되지 않는 문제가 있었습니다.


TS

import { create } from 'zustand'
 
const useTemplateStore = create<TemplateStore>((set) => ({})) // 상세한 스토어 코드는 생략하였습니다.
 
export const useTemplate = (): TemplateState =>
  useTemplateStore((store) => ({
    currentId: store.currentId,
    ratio: store.ratio,
    backgroundURL: store.backgroundURL,
    contentsLength: store.contentsLength,
  }))

원인은 Selector 함수 내부에서 기존의 상태가 아닌 새로운 객체를 생성하여 반환할 경우 새로운 상태를 Dispatch 받았을 때 변경된 값을 올바르게 비교하여 적시에 렌더링 시키지 못해 발생하는 문제였습니다. 결국 사용자 이슈였죠. 이후부터 전역 상태를 객체의 형태로 반환하고 싶을 때는 아래와 같은 형태로 작성하게 되었습니다.


TS

export const useTemplate = (): TemplateState => ({
  currentId: useTemplateStore((store) => store.currentId),
  ratio: useTemplateStore((store) => store.ratio),
  backgroundURL: useTemplateStore((store) => store.backgroundURL),
  contentsLength: useTemplateStore((store) => store.contentsLength),
})


인사이트

해당 프로젝트는 테오의 스프린트 18기 진행 중 구성되었으며, 1주일 간의 짧은 기간(기획 5일, 개발 2일)동안 MVP를 만든 후 배포까지 완수하는 목적으로 진행되었습니다.