플랜테리어 공간 시뮬레이션 웹·아이패드 앱
방 사진 업로드, 빛·공간 분석, 식물 에셋 드래그 배치, 이미지 렌더링, 저장까지 이어지는 플랜테리어 플로우를 Next.js와 TypeScript로 구현하는 프로젝트입니다.
프로젝트 개요
방 사진 업로드, 빛·공간 분석, 식물 에셋 드래그 배치, 이미지 렌더링, 저장까지 이어지는 플랜테리어 플로우를 Next.js와 TypeScript로 구현하는 프로젝트입니다. 아이패드 가로 화면은 Ionic과 Capacitor로 패키징하는 구조로 설계했습니다.
작업 범위
- 사진 업로드·공간 분석: 방 사진을 올리면 빛이 드는 방향과 배치 가능한 영역을 요약 카드로 보여주는 화면입니다
- 식물 배치 캔버스: 식물 에셋을 방 사진 위로 끌어다 놓고 크기와 위치를 조절하는 편집 화면입니다
- 렌더링·저장: 배치 결과를 이미지 엔진에 보내 합성 이미지를 만들고 내 프로젝트로 저장하는 화면입니다
- 아이패드 가로 화면 대응: 아이패드 가로 화면과 데스크톱 브라우저에서 같은 플로우가 동작하도록 맞춘 반응형 화면입니다
주요 업무
- 사진 업로드·공간 분석 화면: 업로드 파일 형식·용량 검증 후 외부 이미지 분석 API 결과를 구조화해 공간 분석 패널에 표시합니다
- 식물 배치 캔버스 화면: Konva 레이어 위에서 드래그·리사이즈·회전 변환을 처리하고 줌과 스크롤을 제스처별로 분리합니다
- 렌더링·저장 화면: 렌더 요청을 비동기 작업으로 등록하고 완료 시 결과 이미지를 보관함에 저장합니다
- 아이패드 가로 화면 대응 화면: Ionic 컴포넌트와 Capacitor 패키징 구조를 적용하고 뷰포트별 패널 배치를 전환합니다



프로젝트 핵심 과제
손가락 줌과 식물 드래그가 충돌하는 터치 환경에서 제스처 우선순위 규칙 설계
사진 해상도와 캔버스 좌표계가 달라 배치 위치가 렌더 결과와 어긋나지 않
좌표 변환 설계 필요
외부 이미지 분석·생성 API의 응답 지연에 대비한 작업 재시도와 상태 안내 설계
다른 사용자의 방 사진과 결과 이미지에 접근하지 못하
Storage 경로와 RLS 정책 검증 필요
핵심 기능 상세
사진 업로드·공간 분석
방 사진을 올리면 빛이 드는 방향과 배치 가능한 영역을 요약 카드로 보여주는 화면입니다. 업로드 파일 형식·용량 검증 후 외부 이미지 분석 API 결과를 구조화해 공간 분석 패널에 표시합니다.
- Supabase Storage 서명 URL 업로드와 MIME·용량 서버 검증 적용
- 외부 이미지 분석 API 응답을 Zod 스키마로 검증해 분석 카드에 매핑
- 업로드 진행률 표시와 스켈레톤 로딩으로 대기 상태 가시화
업로드 검증과 분석 결과 스키마 검증을 분리해 잘못된 파일과 비정상 응답이 화면까지 전달되지 않는 구조를 구현합니다.


식물 배치 캔버스
식물 에셋을 방 사진 위로 끌어다 놓고 크기와 위치를 조절하는 편집 화면입니다. Konva 레이어 위에서 드래그·리사이즈·회전 변환을 처리하고 줌과 스크롤을 제스처별로 분리합니다.
- Konva Transformer로 선택 요소의 크기·회전 핸들 구현
- 포인터 이벤트 기반 두 손가락 줌과 한 손가락 이동 제스처 분리
- Zustand와 실행 취소 스택으로 배치 상태 이력 관리
마우스와 터치 입력을 하나의 포인터 이벤트 계층으로 통합해 데스크톱과 아이패드에서 같은 조작감을 제공하도록 설계합니다.


렌더링·저장
배치 결과를 이미지 엔진에 보내 합성 이미지를 만들고 내 프로젝트로 저장하는 화면입니다. 렌더 요청을 비동기 작업으로 등록하고 완료 시 결과 이미지를 보관함에 저장합니다.
- 렌더 요청 상태 폴링과 Supabase Realtime 구독으로 진행 상태 갱신
- 결과 이미지를 사용자별 Storage 경로에 저장하고 RLS로 접근 제한
- 실패 시 재시도 버튼과 사유 안내 상태 설계
렌더 작업 상태를 대기·진행·완료·실패로 모델링해 로딩 애니메이션과 오류 안내가 상태와 일치하도록 구현합니다.


아이패드 가로 화면 대응
아이패드 가로 화면과 데스크톱 브라우저에서 같은 플로우가 동작하도록 맞춘 반응형 화면입니다. Ionic 컴포넌트와 Capacitor 패키징 구조를 적용하고 뷰포트별 패널 배치를 전환합니다.
- Capacitor 설정과 Ionic 컴포넌트로 웹앱 패키징 구조 구성
- 가로 모드 기준 패널 배치와 안전 영역 여백 처리
- 에뮬레이터와 브라우저 개발자 도구 기반 뷰포트 점검 체크리스트 작성
하나의 Next.js 코드베이스에서 웹과 아이패드 앱을 함께 대응하는 패키징 구조를 설계합니다.


프로젝트 진행 단계
사용자 플로우와 데이터 모델 설계 · 2026.10
업로드부터 저장까지 플로우 정의, 프로젝트·배치·렌더 결과 테이블과 RLS 정책 설계
업로드·공간 분석 연동 · 2026.10
Storage 서명 업로드, 파일 검증, 외부 이미지 분석 API 연동 구현
배치 캔버스·렌더 보관함 구현 · 2026.10
Konva 기반 드래그·리사이즈·줌과 비동기 렌더 상태 모델, 결과 보관함 구현
아이패드 패키징·다기기 점검 · 2026.10
Capacitor 빌드 구성, 가로 화면 레이아웃과 뷰포트별 점검 항목 정리
개발 결과
기술적 주안점
- 업로드 검증과 분석 결과 스키마 검증을 분리해 잘못된 파일과 비정상 응답이 화면까지 전달되지 않는 구조를 구현합니다
- 마우스와 터치 입력을 하나의 포인터 이벤트 계층으로 통합해 데스크톱과 아이패드에서 같은 조작감을 제공하도록 설계합니다
- 렌더 작업 상태를 대기·진행·완료·실패로 모델링해 로딩 애니메이션과 오류 안내가 상태와 일치하도록 구현합니다