- JWT 검증 플로우: Gateway 내부 처리로 변경 - Username → UUID 변환 메커니즘 문서화 - UUID5 체계: Slack 사용자용 결정적 UUID 생성 - Gateway 프록시 패턴 상세 문서화 - 데이터베이스: gmail_tokens, robeing 스키마 추가 - 서비스 포트 매핑 및 역할 명확화 - auth_db → main_db 마이그레이션 반영
9.7 KiB
9.7 KiB
PostgreSQL 테이블 구조
작성일: 2025-08-20
데이터베이스: main_db
1. 사용자 관련 테이블
users
- 용도: 시스템 전체 사용자 정보
- Primary Key: id (UUID)
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 사용자 고유 식별자 | |
| 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 | 이름 | |
| 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 사용
개선 필요 사항
- 일부 테이블의 소유자가 postgres로 되어있어 권한 조정 필요
- auth_db → main_db로 마이그레이션 완료
문서 끝