뒤로 가기

📚 Documentation

Divetobada 개발자 가이드 | 버전 2.0 | 마지막 업데이트: 2025년 1월 15일

Welcome to Divetobada!

Divetobada는 크리에이터와 팬을 직접 연결하는 엔터테인먼트 플랫폼입니다.

1. 프로젝트 개요

비전

소속사 없이도 주도권을 가지고 활동하며 팬들과 매끄럽게 소통할 수 있는 공간을 제공합니다.

크리에이터 자율성
직접적인 팬-크리에이터 소통
확장 가능한 워크스페이스 시스템
SDK를 통한 커스터마이징

기술 스택

프론트엔드

Next.js15.1.2

App Router 기반 프레임워크

React18.3.1

UI 라이브러리

TypeScript

타입 안정성

Tailwind CSS

유틸리티 퍼스트 스타일링

React Query5.90.5

서버 상태 관리

Tiptap

리치 텍스트 에디터

React Flow11.11.4

화이트보드 라이브러리

백엔드

PostgreSQL

관계형 데이터베이스

Prisma5.16.1

ORM

Lucia Auth3.2.0

인증 시스템

Arctic

OAuth 라이브러리

Zod

스키마 검증

인프라

Vercel

배포 플랫폼

Vercel Blob

파일 스토리지

2. 시작하기

회원가입

이메일과 비밀번호로 간단하게 가입할 수 있습니다.

💡 Google 계정으로 간편 가입 가능

  1. 1우측 상단 '회원가입' 버튼 클릭
  2. 2이메일, 사용자명, 비밀번호 입력
  3. 3이메일 인증 (선택사항)
  4. 4프로필 설정 완료

프로필 꾸미기

나만의 개성있는 프로필을 만들어보세요.

  1. 1프로필 이미지 업로드
  2. 2자기소개 작성
  3. 3관심사 및 스킬 태그 추가
  4. 4소셜 링크 연결

첫 게시물 작성

여러분의 창작물과 이야기를 팬들과 공유해보세요.

  1. 1홈 피드에서 '글쓰기' 버튼 클릭
  2. 2텍스트, 이미지, 링크 추가
  3. 3해시태그로 주제 분류
  4. 4게시 버튼으로 공유

스튜디오 생성

크리에이터를 위한 전문 공간을 만들어보세요.

  1. 1좌측 사이드바에서 '스튜디오 생성' 클릭
  2. 2스튜디오 이름과 슬러그 입력
  3. 3설명과 타입 선택
  4. 4생성 완료 후 콘텐츠 발행 시작

3. 아키텍처 가이드

레이아웃 시스템

가변 사이드바를 가진 3-컬럼 레이아웃 구조입니다.

레이아웃 컴포넌트

LeftSidebarArea

가변 (80px 또는 400px)

  • ServerList (항상 표시, 80px)
  • 콘텐츠 블록 (조건부 표시, 320px)
  • - Docs: 독스 네비게이션
  • - Discord: 스튜디오 채널 목록
  • - None: 콘텐츠 없음
MainContent

가변 (사이드바 너비에 따라 자동 조절)

  • CSS 변수를 통한 동적 너비 계산
  • 반응형 디자인 지원
  • 모바일 최적화
RightSidebarArea

고정 (320px)

  • 홈: 크리에이터 추천, 브랜드 사이드바
  • 스튜디오: 스튜디오 정보
  • 접기/펼치기 기능 (양쪽 동시 제어)

CSS 변수

--left-sidebar-width

좌측 사이드바 너비

가능한 값: 80px, 400px | 기본값: 80px

--right-sidebar-width

우측 사이드바 너비

가능한 값: 320px | 기본값: 320px

사이드바 시스템

페이지별로 동적으로 변경되는 사이드바 시스템입니다.

none0px

사이드바 없음

사용 사례: 일부 특수 페이지

docs400px

독스 페이지 사이드바

콘텐츠: 독스 네비게이션 메뉴

discord80px 또는 400px

스튜디오 디스코드 스타일 사이드바

콘텐츠: 서버 리스트 + 스튜디오 채널 목록

💡 콘텐츠 블록 유무에 따라 너비 변경

라우팅 구조

Next.js App Router 기반의 파일 시스템 라우팅입니다.

/

홈 피드 (전체/팔로잉)

컴포넌트: MainContent, ForYouFeed, FollowingFeed
/studios/[studioId]

스튜디오 메인 페이지

컴포넌트: StudioProfileCard, StudioDetailContent
탭: workspace, posts, calendar, notes
/studios/[studioId]/workspace

워크스페이스 대시보드

컴포넌트: WorkspaceDashboard
/studios/[studioId]/workspace/[fileId]

화이트보드 파일 페이지

컴포넌트: StudioWorkspace, WorkspaceFileHeader, WorkspaceNodeAddBlock
/studios/[studioId]/settings

스튜디오 설정

탭: general, members
/docs-old

독스 페이지

사이드바: docs

4. 인증 시스템

인증 시스템

Lucia Auth 기반의 인증 시스템입니다.

인증 방법

이메일/비밀번호

전통적인 이메일과 비밀번호를 사용한 인증

/api/auth/login
  • Argon2 해싱
  • 세션 쿠키 관리
  • 자동 로그인 유지
Google OAuth

Google 계정을 통한 간편 로그인

/api/auth/callback/google
  • PKCE 보안
  • 자동 계정 생성
  • TestFlight 지원

Lucia를 통한 세션 관리

  • 서버 사이드 세션 검증
  • 쿠키 기반 인증
  • 자동 만료 관리

SSO 통합

Login with Divetobada를 통한 외부 서비스 인증

하나의 Divetobada 계정으로 모든 Team Bada 서비스 접근
이메일 기반 자동 계정 매칭 및 생성
안전한 JWT 기반 인증 (5분 유효)
Google Login처럼 간편한 통합
1. 외부 서비스 백엔드에 SSO 엔드포인트 추가
// Express 예시
app.post("/sso/divetobada", async (req, res) => {
  const { token } = req.body;
  const decoded = jwt.verify(token, SHARED_SSO_SECRET);
  
  // 이메일로 계정 찾기 또는 생성
  let user = await User.findOne({ email: decoded.email });
  if (!user) {
    user = await createUser(decoded);
  }
  
  return res.json({ access_token: generateToken(user) });
});
2. 프론트엔드에 SSO 처리 페이지 추가
// /sso 페이지
const token = searchParams.get('token');
axios.post('/sso/divetobada', { token })
  .then(({ data }) => {
    saveSession(data);
    redirect('/dashboard');
  });
3. 로그인 페이지에 위젯 추가
<iframe 
  src="https://divetobada.com/api/widget/login-button?redirect=YOUR_SSO_URL&service=YOUR_SERVICE_NAME"
  width="100%" 
  height="60"
  frameborder="0"
  scrolling="no"
  style="border: none;"
></iframe>
⚠️ 중요 사항
  • ⚠️ SHARED_SSO_SECRET는 Divetobada와 동일한 값을 사용해야 합니다
  • ⚠️ YOUR_SSO_URL은 토큰을 받을 엔드포인트 (예: http://yoursite.com/sso)
  • ⚠️ YOUR_SERVICE_NAME은 서비스 식별자 (예: vessel, soundcamp 등)
  • 💡 프로덕션에서는 https://divetobada.com 사용

5. 소셜 기능

소셜 기능

게시물, 댓글, 팔로우 등 소셜 미디어 핵심 기능입니다.

게시물

텍스트, 이미지, 링크를 포함한 리치 콘텐츠 게시물

  • 리치 텍스트 에디터 (Tiptap)
  • 이미지/비디오 업로드 (최대 10개)
  • 링크 미리보기 자동 생성
  • 해시태그 지원
  • 멘션 (@username)
  • 게시물 수정/삭제
API 엔드포인트
createPOST /api/posts
getGET /api/posts/[postId]
updatePATCH /api/posts/[postId]
deleteDELETE /api/posts/[postId]

댓글

게시물에 대한 댓글 시스템

  • 댓글 작성/수정/삭제
  • 댓글 알림
  • 무한 댓글 스레드
API 엔드포인트
createPOST /api/posts/[postId]/comments
getGET /api/posts/[postId]/comments

상호작용

좋아요, 북마크, 리포스트 기능

  • 좋아요 (Like)
  • 북마크 (Bookmark)
  • 리포스트 (Repost)
  • 실시간 카운트 업데이트
API 엔드포인트
likePOST /api/posts/[postId]/likes
bookmarkPOST /api/posts/[postId]/bookmark

피드 시스템

게시물 피드 및 추천 시스템

전체 (For You)

추천 알고리즘 기반 게시물

GET /api/posts/for-you
팔로잉
인증 필요

팔로우한 사용자의 게시물

GET /api/posts/following
공개

비로그인 사용자를 위한 공개 게시물

GET /api/posts/public

6. 스튜디오 시스템

스튜디오란?

스튜디오는 크리에이터가 콘텐츠를 발행하고 팬들과 소통하는 공간입니다.

  • 블로그 스타일 콘텐츠 발행
  • 구독자 관리
  • 멤버 관리 (팀 스튜디오)
  • 워크스페이스 (화이트보드)
  • 캘린더/일정 관리
  • 노트 관리

스튜디오 생성

  1. 1좌측 사이드바에서 '스튜디오 생성' 클릭
  2. 2스튜디오 이름과 슬러그(URL) 입력
  3. 3설명과 타입 선택 (개인/팀)
  4. 4아바타 및 배너 이미지 업로드
  5. 5소셜 링크 연결
  6. 6생성 완료
POST /api/studios

스튜디오 관리

  • 스튜디오 정보 수정
  • 멤버 초대 및 관리
  • 권한 설정 (OWNER, ADMIN, MODERATOR, MEMBER)
  • 구독자 관리
  • 공개/비공개 설정
API 엔드포인트
updatePATCH /api/studios/[studioId]
membersGET /api/studios/[studioId]/members
invitePOST /api/studios/[studioId]/members

스튜디오 채널

스튜디오 내 다양한 콘텐츠 타입

워크스페이스

노드 기반 화이트보드

/studios/[studioId]/workspace
게시물

스튜디오 게시물 목록

/studios/[studioId]?tab=posts
캘린더

일정 및 이벤트 관리

/studios/[studioId]?tab=calendar
노트

노트 관리

/studios/[studioId]?tab=notes

7. 워크스페이스 노드 시스템

워크스페이스 노드 시스템

React Flow 기반의 노드 기반 화이트보드 시스템입니다.

실제 노드 컴포넌트의 동작을 확인하고 싶으시다면 노드 예제 페이지를 방문하세요.

개요

노드는 워크스페이스에서 정보를 표현하고 연결하는 기본 단위입니다.

  • 드래그 앤 드롭으로 자유롭게 배치
  • 노드 간 연결선으로 관계 표현
  • 노드 타입별 특화된 UI 및 기능
  • 실시간 편집 및 저장
  • 파일 시스템 지원

노드 타입

FileText
기획
PLANNING

프로젝트 기획 및 아이디어를 기록하는 노드

💡 사용 사례: 프로젝트 기획, 아이디어 정리

  • 제목과 내용 편집
  • 이모지 추가 가능
  • 다른 노드와 연결 가능
  • 보라색 테두리로 강조 표시
FileText
메모
NOTE

일반적인 메모 및 텍스트 노드

💡 사용 사례: 일반 메모, 문서 작성

  • 리치 텍스트 에디터 지원
  • HTML 콘텐츠 렌더링
  • 이모지 추가 가능
  • 무제한 텍스트 입력
Calendar
캘린더
SCHEDULE

일정 및 이벤트 정보를 표시하는 노드

💡 사용 사례: 일정 관리, 이벤트 계획

  • 시작일/종료일 설정
  • 이벤트 타입 표시 (일정/행사/마감기한)
  • 설명 추가 가능
  • 캘린더 뷰와 연동
Share2
드라이브
RESOURCE

파일 및 자료를 공유하는 노드

💡 사용 사례: 자료 공유, 파일 관리

  • 다중 파일 업로드
  • 파일 목록 표시
  • 파일 다운로드 기능
  • 최대 3개 파일 미리보기
FileImage
게시물
POST

스튜디오 게시물을 워크스페이스에 임베드하는 노드

💡 사용 사례: 게시물 참조, 콘텐츠 연결

  • 게시물 ID로 연결
  • 작성자 정보 표시
  • 게시물 내용 미리보기
  • 이미지 썸네일 표시
  • 원본 게시물 링크
Image
사진
PHOTO

이미지를 직접 표시하는 노드

💡 사용 사례: 이미지 표시, 포트폴리오

  • 이미지 업로드
  • 이미지 크기에 맞춰 자동 크기 조절
  • 비율 유지
  • 리사이즈 핸들 제공

노드 작업

추가
POST /api/studios/[studioId]/nodes

사이드바의 노드 추가 버튼을 클릭하여 새 노드를 생성합니다.

  1. 1좌측 사이드바에서 노드 타입 선택
  2. 2화이트보드에 노드가 생성됨
  3. 3노드 클릭하여 내용 편집
편집
PATCH /api/studios/[studioId]/nodes/[nodeId]

노드를 클릭하거나 편집 버튼을 눌러 내용을 수정합니다.

  1. 1노드에 마우스 오버 시 편집 버튼 표시
  2. 2편집 버튼 클릭
  3. 3사이드바에서 내용 수정
  4. 4저장 버튼으로 변경사항 저장
연결
POST /api/studios/[studioId]/edges

노드의 연결점을 드래그하여 다른 노드와 연결합니다.

  1. 1노드 우측 연결점에서 드래그 시작
  2. 2다른 노드의 좌측 연결점에 드롭
  3. 3연결선 생성됨
  4. 4연결선에 라벨 추가 가능
삭제
DELETE /api/studios/[studioId]/nodes/[nodeId]

노드를 삭제합니다. 연결된 연결선도 함께 제거됩니다.

  1. 1노드에 마우스 오버 시 삭제 버튼 표시
  2. 2삭제 버튼 클릭
  3. 3확인 대화상자에서 확인
  4. 4노드 및 관련 연결선 삭제됨

파일 시스템

워크스페이스 파일을 통해 노드를 그룹화할 수 있습니다.

  • 파일별로 노드 분리
  • 파일 생성/수정/삭제
  • 파일 헤더 (제목, 설명)
  • 파일 간 노드 이동
API 엔드포인트
listGET /api/studios/[studioId]/files
createPOST /api/studios/[studioId]/files
updatePATCH /api/studios/[studioId]/files/[fileId]
deleteDELETE /api/studios/[studioId]/files/[fileId]

8. API 레퍼런스

API 레퍼런스

Divetobada API 엔드포인트 문서입니다.

Base URL: https://divetobada.com/api

대부분의 API는 인증이 필요합니다. 쿠키 기반 세션 인증을 사용합니다.

posts

GET/posts/for-you인증 필요

전체 피드 조회

파라미터: cursor (optional)
응답: PostsPage
GET/posts/following인증 필요

팔로잉 피드 조회

파라미터: cursor (optional)
응답: PostsPage
GET/posts/[postId]

게시물 상세 조회

응답: Post
POST/posts인증 필요

게시물 생성

Body: title (optional), content, attachments (optional)
응답: Post

studios

GET/studios인증 필요

내 스튜디오 목록 조회

응답: Studio[]
POST/studios인증 필요

스튜디오 생성

Body: name, slug, description (optional)
응답: Studio
GET/studios/[studioId]

스튜디오 상세 조회

응답: Studio
GET/studios/[studioId]/nodes인증 필요

노드 목록 조회

파라미터: fileId (optional), type (optional)
응답: ProjectNode[]
POST/studios/[studioId]/nodes인증 필요

노드 생성

Body: type, title, x, y, fileId (optional)
응답: ProjectNode

users

GET/users/me인증 필요

현재 사용자 정보 조회

응답: User
GET/users/[userId]/followers

팔로워 목록 조회

응답: User[]

9. SDK 가이드

SDK를 통한 커스텀 노드 개발

Divetobada SDK를 사용하여 자신만의 커스텀 노드를 만들고 워크스페이스에 통합할 수 있습니다.

⚠️ 현재 상태: 개발 예정 (Phase 4+)

SDK 개요

SDK를 통해 커스텀 노드를 개발하면, 워크스페이스에서 자체 제작한 노드를 사용할 수 있습니다.

  • 자신의 비즈니스 로직에 맞는 노드 개발
  • 외부 서비스와의 통합
  • 고급 자동화 기능 구현
  • 커뮤니티와 노드 공유

시작하기

1. SDK 설치
npm install @divetobada/sdk
2. 노드 컴포넌트 작성
import { NodeComponent, NodeProps } from '@divetobada/sdk';

export default function MyCustomNode({ data, id }: NodeProps) {
  return (
    <div className="custom-node">
      <h3>{data.title}</h3>
      <p>{data.content}</p>
    </div>
  );
}
3. 노드 등록
import { registerNode } from '@divetobada/sdk';
import MyCustomNode from './MyCustomNode';

registerNode({
  type: 'MY_CUSTOM_TYPE',
  label: '내 커스텀 노드',
  icon: 'CustomIcon',
  component: MyCustomNode,
  defaultWidth: 300,
  defaultHeight: 200
});
4. 워크스페이스에 통합
// 스튜디오 설정에서 커스텀 노드 활성화
// 또는 API를 통해 노드 플러그인 등록

노드 인터페이스

커스텀 노드는 다음 인터페이스를 구현해야 합니다.

Props
dataCustomNodeData필수

노드의 데이터 객체

idstring필수

노드의 고유 ID

selectedboolean

노드가 선택되었는지 여부

Methods
onEdit

노드 편집 시 호출되는 콜백

파라미터: nodeId: string

onDelete

노드 삭제 시 호출되는 콜백

파라미터: nodeId: string

예제

간단한 텍스트 노드

기본적인 텍스트 표시 노드 예제

import { NodeComponent } from '@divetobada/sdk';

const SimpleTextNode: NodeComponent = ({ data }) => {
  return (
    <div className="p-4 border-2 border-black rounded-lg">
      <h3 className="font-bold">{data.title}</h3>
      <p className="text-sm text-gray-600">{data.content}</p>
    </div>
  );
};

export default SimpleTextNode;
API 연동 노드

외부 API와 연동하는 노드 예제

import { NodeComponent } from '@divetobada/sdk';
import { useQuery } from '@tanstack/react-query';

const APINode: NodeComponent = ({ data, id }) => {
  const { data: apiData } = useQuery({
    queryKey: ['api-node', id],
    queryFn: async () => {
      const res = await fetch(data.apiUrl);
      return res.json();
    }
  });

  return (
    <div className="p-4 border-2 border-black rounded-lg">
      <h3 className="font-bold">{data.title}</h3>
      {apiData ? (
        <pre>{JSON.stringify(apiData, null, 2)}</pre>
      ) : (
        <p>로딩 중...</p>
      )}
    </div>
  );
};

export default APINode;

모범 사례

  • 노드의 크기는 콘텐츠에 맞게 자동 조절되도록 설계하세요
  • 연결점(Handle)은 노드의 좌우에 배치하세요
  • 편집 및 삭제 기능은 호버 시에만 표시하세요
  • 노드 데이터는 JSON 형식으로 저장됩니다
  • 성능을 위해 불필요한 리렌더링을 방지하세요

향후 기능

  • 🚀노드 마켓플레이스 (커뮤니티 노드 공유)
  • 🚀노드 실행 기능 (자동화 워크플로우)
  • 🚀노드 간 데이터 전달
  • 🚀노드 그룹화 및 템플릿 기능

10. 베타 기능

⚠️ 주의: 베타 기능은 변경되거나 제거될 수 있습니다. 프로덕션 환경에서의 사용은 권장하지 않습니다.

11. 자주 묻는 질문 (FAQ)

Q.스튜디오와 일반 포스트의 차이는 무엇인가요?

A.일반 포스트는 SNS 스타일의 짧은 글이고, 스튜디오는 블로그 형식의 긴 콘텐츠를 위한 공간입니다. 스튜디오에서는 제목이 있고, Notion 스타일의 에디터를 사용할 수 있습니다.

Q.여러 개의 스튜디오를 만들 수 있나요?

A.네, 하나의 계정으로 여러 스튜디오를 만들 수 있습니다. 각 스튜디오는 독립적인 브랜딩과 콘텐츠를 가질 수 있습니다.

Q.게시물을 수정하거나 삭제할 수 있나요?

A.네, 본인이 작성한 게시물은 언제든 수정하거나 삭제할 수 있습니다. 게시물 우측 상단의 메뉴(⋮)를 클릭하세요.

Q.이미지 업로드 용량 제한이 있나요?

A.개별 이미지는 최대 4MB까지 업로드 가능하며, 한 게시물당 최대 10개의 이미지를 첨부할 수 있습니다.

Q.워크스페이스 노드는 어떻게 사용하나요?

A.스튜디오의 워크스페이스 탭에서 노드를 추가하고 연결하여 프로젝트를 시각적으로 관리할 수 있습니다. 각 노드는 타입에 따라 다른 기능을 제공합니다.

Q.커스텀 노드를 만들 수 있나요?

A.현재는 개발 예정입니다. 향후 SDK를 통해 커스텀 노드를 개발하고 공유할 수 있을 예정입니다.

12. 커뮤니티 가이드라인

⚠️ 중요: 모든 사용자가 안전하고 즐거운 경험을 할 수 있도록 아래 가이드라인을 준수해 주세요. 위반 시 계정이 제한될 수 있습니다.

존중과 배려

  • 모든 사용자를 존중하고 배려하세요
  • 건설적인 비판은 환영하지만, 인신공격은 금지됩니다
  • 다양한 의견과 문화를 존중하세요

콘텐츠 정책

  • 저작권을 침해하는 콘텐츠 금지
  • 폭력적, 선정적, 혐오 발언 금지
  • 스팸 및 광고성 게시물 금지
  • 허위 정보 유포 금지

계정 보안

  • 계정 정보를 타인과 공유하지 마세요
  • 강력한 비밀번호를 사용하세요
  • 의심스러운 활동을 발견하면 즉시 신고하세요

13. Team Bada 서비스

Divetobada를 중심으로 한 다양한 서비스들을 하나의 계정으로 이용하세요

14. 공식 채널

Divetobada 공식 채널

최신 소식과 튜토리얼을 확인하세요

Youtube

더 궁금한 점이 있으신가요?

이메일로 문의해 주시면 빠르게 답변 드리겠습니다.

📧 문의하기

Divetobada Documentation | 버전 2.0

마지막 업데이트: 2025년 1월 15일