← 포트폴리오 목록

3D 감수 아카이브 플랫폼

Three.js 기반 OBJ/STL 3D 모델링 뷰어와 2D 다각도 360도 스프라이트 뷰어, 뷰어 위 주석(Annotation) 시스템, 3계층 권한 관리를 통합한 완구·피규어 감수 데이터 아카이브 플랫폼 MVP를 React + Node.js + PostgreSQL 풀스택으로 설계·구현합니다.

서비스 타입Web
업종CRM 서비스
기술 스택
React.jsTypeScriptThree.jsTailwind CSSNode.jsExpressPostgreSQLPrismaAWS S3
주요 기능
  • Three.js 3D 모델링 뷰어
  • 주석 및 피드백 시스템
  • 360도 다각도 사진 뷰어
  • 협력사 권한 관리

프로젝트 개요

범위: 개발, 디자인, 기획

Three.js 기반 OBJ/STL 3D 모델링 뷰어와 2D 다각도 360도 스프라이트 뷰어, 뷰어 위 주석(Annotation) 시스템, 3계층 권한 관리를 통합한 완구·피규어 감수 데이터 아카이브 플랫폼 MVP를 React + Node.js + PostgreSQL 풀스택으로 설계·구현합니다. 공고 핵심 요구사항인 Three.js WebGL 렌더링, 워터마크 오버레이, 협력사 권한 제어를 직접 반영한 맞춤 구현한 프로젝트입니다.

작업 범위

  • Three.js 3D 모델링 뷰어: OBJ·STL 포맷 3D 파일을 브라우저에서 WebGL로 렌더링하고, 마우스 조작으로 360도 회전·확대·패닝을 지원하며 사용자 식별 워터마크 오버레이를 적용하는 메인 뷰어 화면입니다
  • 주석 및 피드백 시스템: 3D·360도 뷰어 위 특정 위치 클릭 시 텍스트 메모를 입력하고, 주석별 댓글 스레드와 감수 완료 표시를 관리하는 피드백 협업 화면입니다
  • 360도 다각도 사진 뷰어: 다각도 사진을 일괄 업로드하고 마우스 좌우 드래그로 사진 시퀀스를 전환하는 스프라이트 슬라이더 방식의 360도 뷰어와 워터마크 오버레이 화면입니다
  • 협력사 권한 관리: 외부 협력사의 회원가입 신청을 검토하고 관리자 승인·반려 처리, 내부직원·관리자·협력사 3계층 역할별 메뉴 접근 권한을 제어하는 권한 관리 화면입니다

주요 업무

  • Three.js 3D 모델링 뷰어 화면: Three.js OBJLoader·STLLoader로 3D 모델 파싱 및 씬 구성, OrbitControls로 마우스 기반 인터랙션, Canvas 오버레이 레이어에 사용자 ID·일시 워터마크를 실시간 렌더링합니다
  • 주석 및 피드백 시스템 화면: Three.js Raycaster로 3D 모델 표면 클릭 좌표를 UV 공간으로 변환하여 주석 핀 위치를 저장하고, PostgreSQL 트랜잭션으로 주석-댓글 계층 구조를 원자적으로 처리합니다
  • 360도 다각도 사진 뷰어 화면: 업로드된 다각도 사진을 정렬된 배열로 관리하고 마우스 deltaX 이동량으로 인덱스를 계산하여 CSS transform으로 부드러운 프레임 전환을 구현합니다
  • 협력사 권한 관리 화면: PostgreSQL users 테이블에 role ENUM(admin/internal/partner) + status ENUM(pending/approved/rejected) 컬럼 설계, Express 미들웨어로 역할별 라우트 가드를 구현합니다
3D 감수 아카이브 플랫폼
요구사항 정의

프로젝트 핵심 과제

프로젝트 진행 시 해결한 핵심 기술 과제입니다.

대용량 OBJ·STL 파일(50MB 이상) 로드 시 메인 스레드 블로킹을 방지

Web Worker 기반 비동기 파싱 전략을 설계해야 합니다

Three.js 렌더 루프에서 매 프레임 주석 핀 위치를 재계산할 때 핀 수가 많아지면 성능 저하

Frustum Culling 기반 핀 렌더 최적화 전략이 필요합니다

360도 스프라이트 뷰어에서 고해상도 다각도 사진 72장을 순차 프리패치할 때 메모리 사용량을 제한하는 슬라이딩 윈도우 캐시 전략을 구현해야 합니다

협력사 계정 정지 시 이미 발급된 JWT의 즉시 무효화

Redis 블랙리스트 또는 짧은 TTL 전략을 선택하는 설계 결정이 필요합니다

Canvas 워터마크와 Three.js WebGLRenderer가 같은 컨테이너에서 GPU 리소스를 공유할 때 렌더링 충돌을 방지하는 레이어 분리 전략 설계가 필요합니다

구현 내용

핵심 기능 상세

핵심 기능 1

Three.js 3D 모델링 뷰어

OBJ·STL 포맷 3D 파일을 브라우저에서 WebGL로 렌더링하고, 마우스 조작으로 360도 회전·확대·패닝을 지원하며 사용자 식별 워터마크 오버레이를 적용하는 메인 뷰어 화면입니다.

  • Three.js OBJLoader·STLLoader로 3D 모델 파일 파싱 후 WebGLRenderer 씬 구성, PerspectiveCamera + DirectionalLight 배치로 실물감 있는 렌더링 구현
  • OrbitControls로 마우스 좌클릭 회전·휠 확대축소·우클릭 패닝 조작 지원, 모바일 터치 이벤트 대응 설계
  • Canvas 2D 오버레이에 사용자 ID·조직명·접속 일시를 30° 기울기 반복 패턴으로 렌더링, Three.js 씬과 Z-레이어 분리하여 워터마크 회피 불가 구조 구현

Three.js WebGLRenderer와 HTML Canvas 오버레이를 동일 컨테이너에 포지셔닝하여 3D 씬 위에 사용자 식별 워터마크를 실시간으로 합성하는 구조를 구현합니다. CSS pointer-events: none으로 뷰어 인터랙션 방해 없이 워터마크를 적용합니다.

Three.js 3D 모델링 뷰어
Three.js 3D 모델링 뷰어 실제 화면
핵심 기능 2

주석 및 피드백 시스템

3D·360도 뷰어 위 특정 위치 클릭 시 텍스트 메모를 입력하고, 주석별 댓글 스레드와 감수 완료 표시를 관리하는 피드백 협업 화면입니다.

  • Three.js Raycaster로 마우스 클릭 시 3D 모델 교차점 좌표(x·y·z) 계산 및 화면 좌표 변환, 주석 핀 Sprite 씬 배치 구현
  • PostgreSQL annotations 테이블에 3D 좌표(float4 x·y·z)·텍스트·작성자·타임스탬프·감수상태(ENUM) 저장, Prisma 트랜잭션으로 주석-댓글 원자적 처리
  • 주석 핀 클릭 시 우측 사이드 패널에 댓글 스레드 표시, 감수 완료 체크·대댓글·멘션(@사용자) 기능 설계

Three.js Raycaster 교차점 좌표를 정규화하여 DB에 저장하고, 뷰어 재로드 시 동일 3D 좌표에 핀을 복원하는 주석 위치 영속 구조를 설계합니다. 카메라 뷰 변경과 무관하게 핀이 모델 표면에 고정되도록 Three.js 렌더 루프에서 핀 위치를 매 프레임 재계산합니다.

주석 및 피드백 시스템
주석 및 피드백 시스템 실제 화면
핵심 기능 3

360도 다각도 사진 뷰어

다각도 사진을 일괄 업로드하고 마우스 좌우 드래그로 사진 시퀀스를 전환하는 스프라이트 슬라이더 방식의 360도 뷰어와 워터마크 오버레이 화면입니다.

  • 다각도 사진 배열을 인덱스로 관리, 마우스 dragX 이동량을 frameStep으로 나눠 인덱스 계산, requestAnimationFrame으로 60fps 부드러운 전환 구현
  • AWS S3 pre-signed URL(TTL 60분)로 원본 이미지 스트리밍 접근, 브라우저 캐시 헤더 설정으로 재드래그 시 로딩 없이 즉시 전환
  • Canvas 워터마크 오버레이를 이미지 레이어 위에 절대 포지셔닝, 드래그 중에도 사용자 ID 워터마크 유지 구조 구현

마우스 down-move-up 이벤트의 누적 deltaX 값으로 현재 프레임 인덱스를 실시간 계산하고, S3 pre-signed URL로 이미지를 순차 프리패치하여 드래그 중 로딩 끊김 없이 부드러운 360도 전환을 구현합니다.

360도 다각도 사진 뷰어
360도 다각도 사진 뷰어 실제 화면
핵심 기능 4

협력사 권한 관리

외부 협력사의 회원가입 신청을 검토하고 관리자 승인·반려 처리, 내부직원·관리자·협력사 3계층 역할별 메뉴 접근 권한을 제어하는 권한 관리 화면입니다.

  • PostgreSQL users.role ENUM(admin·internal·partner) + status ENUM(pending·approved·rejected) 스키마 설계, Prisma로 역할별 관계 쿼리 구현
  • Express 미들웨어 requireRole(['admin', 'internal'])로 역할 기반 라우트 가드 구현, JWT accessToken에 role 클레임 포함하여 프론트 메뉴 조건부 렌더링
  • 관리자 승인 화면에서 pending 협력사 목록 조회, 단건/일괄 승인·반려·정지 처리 API 설계, 상태 변경 시 이메일 알림 발송 구조 구현

JWT 페이로드에 role 클레임을 포함하여 프론트엔드에서 메뉴·버튼 조건부 렌더링을 수행하고, Express 미들웨어로 API 엔드포인트별 역할 접근을 이중 검증하는 3계층 권한 구조를 설계합니다.

협력사 권한 관리
협력사 권한 관리 실제 화면
구현 과정

프로젝트 진행 단계

STEP 1

도메인 분석 및 DB 스키마 설계 · 2026.05

감수 데이터 도메인 분석, 3D 주석 좌표·협력사 권한·파일 메타 포함 PostgreSQL 테이블 12개 정의 및 인덱스 전략 수립

STEP 2

Three.js 뷰어 및 워터마크 레이어 구현 · 2026.05 / 360도 뷰어 및 파일 업로드 파이프라인 구축 · 2026.05

Three.js OBJLoader·STLLoader·OrbitControls 통합, Canvas 오버레이 워터마크 시스템, AWS S3 pre-signed URL 발급 API 구현 스프라이트 슬라이더 360도 뷰어 구현, Multer + S3 멀티파트 업로드 파이프라인, 다각도 사진 순서 관리 API 개발

STEP 3

주석 시스템 및 권한 관리 구현 · 2026.05

Three.js Raycaster 주석 핀 시스템 구현, 댓글 스레드 API, JWT 역할 기반 권한 미들웨어, 협력사 승인 플로우 개발

STEP 4

통합 검증 및 뷰어 성능 최적화 · 2026.05

3D 뷰어·360도 뷰어·주석·권한 통합 테스트, 대용량 OBJ 파일 렌더링 최적화, 브라우저 호환성 검증

개발 결과

Three.js WebGL 뷰어 + 워터마크 이중 레이어 구현Three.js WebGLRenderer 씬과 Canvas 2D 오버레이를 동일 컨테이너에 배치하여 3D 인터랙션을 방해하지 않고 사용자 식별 워터마크를 실시간 합성하는 구조 구현
Raycaster 기반 3D 주석 핀 영속 시스템 설계Three.js Raycaster 교차점 좌표를 정규화하여 DB에 저장하고, 매 렌더 프레임 핀 위치를 재계산하여 카메라 뷰 변경과 무관하게 모델 표면 고정 복원 구조 구현
3계층 역할 기반 접근 제어 설계 / 협력사 승인 플로우 및 계정 정지 처리 설계JWT role 클레임 + Express 미들웨어 이중 검증으로 관리자·내부직원·협력사 3계층 권한을 API 엔드포인트와 프론트 메뉴 양쪽에서 제어하는 구조 구현 pending·approved·rejected·suspended 상태 ENUM 기반 협력사 계정 라이프사이클 설계, 정지 시 JWT 즉시 무효화 구조로 실시간 접근 차단 구현
스프라이트 슬라이더 360도 뷰어 구현마우스 dragX 누적 이동량으로 프레임 인덱스를 실시간 계산하고 S3 pre-signed URL 순차 프리패치로 드래그 중 끊김 없는 다각도 사진 전환 구조 구현

기술적 주안점

  • Three.js WebGLRenderer와 HTML Canvas 오버레이를 동일 컨테이너에 포지셔닝하여 3D 씬 위에 사용자 식별 워터마크를 실시간으로 합성하는 구조를 구현합니다. CSS pointer-events: none으로 뷰어 인터랙션 방해 없이 워터마크를 적용합니다
  • Three.js Raycaster 교차점 좌표를 정규화하여 DB에 저장하고, 뷰어 재로드 시 동일 3D 좌표에 핀을 복원하는 주석 위치 영속 구조를 설계합니다. 카메라 뷰 변경과 무관하게 핀이 모델 표면에 고정되도록 Three.js 렌더 루프에서 핀 위치를 매 프레임 재계산합니다
  • 마우스 down-move-up 이벤트의 누적 deltaX 값으로 현재 프레임 인덱스를 실시간 계산하고, S3 pre-signed URL로 이미지를 순차 프리패치하여 드래그 중 로딩 끊김 없이 부드러운 360도 전환을 구현합니다

유사한 프로젝트를 기획하고 계신가요?

필요한 기능과 일정을 알려주시면 개발 범위를 함께 정리하겠습니다.

프로젝트 문의