# OAuth 다중 프로바이더 지원을 위한 JSONB 구조 개선안 ## 작성일: 2025-09-24 ## 작성자: happybell80 --- ## 현재 문제점 ### 1. 단일 OAuth 구조의 한계 - `oauth_id` VARCHAR: 하나의 프로바이더만 지원 - `oauth_provider` VARCHAR: 단일 값만 저장 가능 - 사용자가 여러 플랫폼(Slack + Google + 네이버웍스) 동시 사용 불가 ### 2. 실제 발생한 문제 사례 - 김종태: Google(100176844464607664427) + Slack(U0925SXQFDK) 분리된 계정 - JWT에는 Slack ID 포함되지만 DB에서 변환 실패 - 테스트 시 실제 사용자 ID 찾기 어려움 ## 해결책: JSONB 다중 프로바이더 구조 ### 제안 스키마 ```sql ALTER TABLE "user" DROP COLUMN oauth_id, DROP COLUMN oauth_provider, ADD COLUMN oauth_providers JSONB DEFAULT '{}'; ``` ### 데이터 구조 예시 ```json { "slack": "U0925SXQFDK", "google": "100176844464607664427", "works": "네이버웍스_사용자ID" } ``` ## 장점 ### 1. 확장성 - 새 OAuth 프로바이더 추가 용이 - 기존 데이터 마이그레이션 가능 - 향후 Microsoft, Apple 등 추가 지원 ### 2. 사용자 편의성 - 하나의 계정으로 다중 플랫폼 접근 - 플랫폼별 기능 제한 없음 - 통합된 사용자 경험 ### 3. 시스템 안정성 - UUID 중심 아키텍처 유지 - 프로바이더 장애 시 다른 방법으로 접근 가능 ## 구현 고려사항 ### 1. 마이그레이션 스크립트 ```sql UPDATE "user" SET oauth_providers = json_build_object(oauth_provider, oauth_id)::jsonb WHERE oauth_id IS NOT NULL; ``` ### 2. 코드 수정 영역 - `slack_user_to_uuid()`: JSONB 쿼리로 변경 - JWT 생성: 다중 프로바이더 정보 포함 - 인증 로직: 프로바이더별 처리 ### 3. 인덱스 최적화 ```sql CREATE INDEX idx_user_oauth_slack ON "user" USING GIN ((oauth_providers->'slack')); ``` ## 마이그레이션 전략 1. 기존 데이터 백업 2. JSONB 컬럼 추가 3. 데이터 변환 스크립트 실행 4. 애플리케이션 코드 수정 5. 테스트 및 검증 6. 기존 컬럼 제거 이 구조로 변경하면 사용자 경험 향상과 시스템 확장성을 동시에 확보할 수 있습니다.