happybell80 9eaa83a76e 아키텍처 문서 대규모 업데이트: JWT/UUID 변환 체계 정립
- JWT 검증 플로우: Gateway 내부 처리로 변경
- Username → UUID 변환 메커니즘 문서화
- UUID5 체계: Slack 사용자용 결정적 UUID 생성
- Gateway 프록시 패턴 상세 문서화
- 데이터베이스: gmail_tokens, robeing 스키마 추가
- 서비스 포트 매핑 및 역할 명확화
- auth_db → main_db 마이그레이션 반영
2025-08-22 20:12:35 +09:00

9.7 KiB

PostgreSQL 테이블 구조

작성일: 2025-08-20

데이터베이스: main_db


1. 사용자 관련 테이블

users

  • 용도: 시스템 전체 사용자 정보
  • Primary Key: id (UUID)
컬럼명 타입 NULL 기본값 설명
id UUID NO 사용자 고유 식별자
email VARCHAR(255) NO 이메일 주소 (UNIQUE)
name VARCHAR(255) YES 사용자 실명
username VARCHAR(50) YES 로그인 ID (UNIQUE)
picture VARCHAR(500) YES 프로필 이미지 URL
oauth_provider VARCHAR(50) YES OAuth 제공자 (google 등)
oauth_id VARCHAR(255) YES OAuth 고유 ID
is_active BOOLEAN YES true 활성 상태
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각
last_login_at TIMESTAMP YES 마지막 로그인

2. Workspace 관련 테이블

workspaces

  • 용도: 워크스페이스 정보
  • Primary Key: id (UUID)
컬럼명 타입 NULL 기본값 설명
id UUID NO 워크스페이스 ID
name VARCHAR(255) NO 워크스페이스 이름
company_id UUID YES 회사 ID (FK → companies)
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각

workspace_members

  • 용도: 워크스페이스 멤버 관계
  • Primary Key: id (UUID)
컬럼명 타입 NULL 기본값 설명
id UUID NO 멤버십 ID
workspace_id UUID NO 워크스페이스 ID (FK → workspaces)
user_id UUID NO 사용자 ID (FK → users)
role ENUM YES member 역할 (admin/member)
robeing_id VARCHAR(50) YES 할당된 로빙 ID
robeing_url VARCHAR(255) YES 로빙 서비스 URL
is_active BOOLEAN YES true 활성 상태
joined_at TIMESTAMP YES CURRENT_TIMESTAMP 가입 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각

companies

  • 용도: 회사 정보
  • Primary Key: id (UUID)
컬럼명 타입 NULL 기본값 설명
id UUID NO 회사 ID
name VARCHAR(255) NO 회사명
domain VARCHAR(255) YES 도메인
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각

3. Slack 통합 테이블

slack_workspaces

  • 용도: Slack 워크스페이스 정보
  • Primary Key: id (UUID)
컬럼명 타입 NULL 기본값 설명
id UUID NO 워크스페이스 ID
team_id VARCHAR(50) NO Slack Team ID (UNIQUE)
team_name VARCHAR(255) YES 팀 이름
bot_token TEXT YES Bot User OAuth Token
bot_user_id VARCHAR(50) YES Bot User ID
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각

slack_user_mapping

  • 용도: Slack 사용자와 시스템 사용자 매핑
  • Primary Key: id (UUID)
컬럼명 타입 NULL 기본값 설명
id UUID NO 매핑 ID
slack_user_id VARCHAR(50) NO Slack User ID (U로 시작)
slack_workspace_id UUID YES Slack 워크스페이스 ID (FK → slack_workspaces)
user_id UUID NO 시스템 사용자 ID (FK → users)
workspace_member_id UUID YES 워크스페이스 멤버 ID (FK → workspace_members)
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각

4. Gmail 관련 테이블

gmail_tokens

  • 용도: Gmail OAuth 토큰 저장
  • Primary Key: id (SERIAL)
컬럼명 타입 NULL 기본값 설명
id SERIAL NO 토큰 ID
user_id UUID NO 사용자 ID (FK → users)
robeing_id VARCHAR(50) YES 로빙 ID
token_data JSONB NO access_token, refresh_token
oauth_config JSONB YES client_id, client_secret, token_uri
scopes JSONB YES Gmail API 권한 목록
metadata JSONB YES email, imported_at 등
expiry TIMESTAMP YES 토큰 만료 시각
is_equipped BOOLEAN YES false 장착 상태
equipped_to VARCHAR(50) YES 장착된 로빙 ID
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각

gmail_audit_logs

  • 용도: Gmail 아이템 작업 감사 로그
  • Primary Key: id (SERIAL)
컬럼명 타입 NULL 기본값 설명
id SERIAL NO 로그 ID
user_id UUID YES 사용자 ID (FK → users)
robeing_id VARCHAR(50) YES 로빙 ID
action VARCHAR(50) YES 작업 유형 (equip/unequip/reauth)
success BOOLEAN YES 성공 여부
details JSONB YES 상세 정보
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각

5. 로빙 관련 테이블

robeing_stats

  • 용도: 로빙 통계 및 레벨 정보
  • Primary Key: id (SERIAL)
컬럼명 타입 NULL 기본값 설명
id SERIAL NO 통계 ID
user_id UUID YES 사용자 ID (FK → users)
robeing_id VARCHAR(50) YES 로빙 ID
level INTEGER YES 1 현재 레벨
experience INTEGER YES 0 경험치
email_sent_count INTEGER YES 0 이메일 발송 횟수
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각

robeing_settings

  • 용도: 로빙 설정 정보
  • Primary Key: id (SERIAL)
컬럼명 타입 NULL 기본값 설명
id SERIAL NO 설정 ID
robeing_id VARCHAR(50) NO 로빙 ID (UNIQUE)
settings JSONB YES 설정 JSON
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각

6. robeing 전용 스키마 테이블

robeing.contacts

  • 용도: 로빙이 관리하는 연락처 정보
  • Primary Key: id (UUID)
  • 스키마: robeing
컴럼명 타입 NULL 기본값 설명
id UUID NO gen_random_uuid() 연락처 ID
robeing_id VARCHAR(50) NO 로빙 ID
name VARCHAR(100) NO 이름
email VARCHAR(255) YES 이메일 주소
phone VARCHAR(50) YES 전화번호
company VARCHAR(200) YES 회사명
relationship VARCHAR(100) YES 관계 (동료, 고객 등)
notes TEXT YES 메모
extra JSONB YES {} 추가 정보
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각
updated_at TIMESTAMP YES CURRENT_TIMESTAMP 수정 시각

robeing.conversations

  • 용도: 로빙 대화 기록
  • Primary Key: id (UUID)
  • 스키마: robeing
컴럼명 타입 NULL 기본값 설명
id UUID NO gen_random_uuid() 대화 ID
robeing_id VARCHAR(50) NO 로빙 ID
user_message TEXT YES 사용자 메시지
robeing_response TEXT YES 로빙 응답
context JSONB YES {} 대화 컨텍스트
metadata JSONB YES {} 메타데이터
timestamp TIMESTAMP YES CURRENT_TIMESTAMP 대화 시각

7. 대화 로그 테이블

conversation_logs

  • 용도: 대화 기록 저장
  • Primary Key: id (SERIAL)
컬럼명 타입 NULL 기본값 설명
id SERIAL NO 로그 ID
user_id UUID YES 사용자 ID (FK → users)
robeing_id VARCHAR(50) YES 로빙 ID
channel VARCHAR(100) YES 채널 (slack/web/api)
message_type VARCHAR(50) YES 메시지 유형
user_message TEXT YES 사용자 메시지
bot_response TEXT YES 봇 응답
metadata JSONB YES 추가 메타데이터
created_at TIMESTAMP YES CURRENT_TIMESTAMP 생성 시각

인덱스 정보

주요 인덱스

  • users: email (UNIQUE), username (UNIQUE)
  • gmail_tokens: user_id, robeing_id, oauth_config (GIN), token_data (GIN)
  • slack_user_mapping: slack_user_id, user_id
  • workspace_members: workspace_id, user_id
  • conversation_logs: user_id, robeing_id, created_at
  • robeing.contacts: robeing_id, name, email
  • robeing.conversations: robeing_id, timestamp

외래키 제약

테이블 컬럼 참조 테이블 참조 컬럼
workspace_members user_id users id
workspace_members workspace_id workspaces id
slack_user_mapping user_id users id
slack_user_mapping slack_workspace_id slack_workspaces id
gmail_tokens user_id users id
robeing_stats user_id users id
conversation_logs user_id users id

주의사항

데이터 타입 일관성

  • user_id: 모든 테이블에서 UUID 타입 사용
  • robeing_id: VARCHAR(50) 통일
  • timestamp: TIMESTAMP WITHOUT TIME ZONE 사용

개선 필요 사항

  1. 일부 테이블의 소유자가 postgres로 되어있어 권한 조정 필요
  2. auth_db → main_db로 마이그레이션 완료

문서 끝