- 채팅방 데이터 테이블 스키마 수정
- chat_roomsroom_id(PK) user_id(FK) room_title room_subtitle room_description room_thumbnail_url room_hashtags isActive created_at
type uuid uuid(users table) text text text text text[] bool timestampz - chat_members (복합 고유 키)member_id(PK) room_id(PK) isAdmin isActive
type uuid(usres table) uuid(chat_rooms table) bool bool - 복합 고유 키 설정고민 과정: member_id와 room_id 의 조합이 고유해야 하므로, 중복 데이터를 방지하기 위한 방법이 필요했다. 이때 단일 Primary Key만으로는 조합의 고유성을 보장할 수 없기 때문에 복합 고유 키를 설정하는 것이 적합하다고 판단했다.
- 결과: 복합 고유 키를 설정함으로써 한 사용자가 여러 채팅방에 참여할 수 있으면서도 특정 사용자와 채팅방의 관계를 고유하게 관리할 수 있게 되었다.
- 문제 상황: 한 사용자가 여러 채팅방에 참여할 수 있도록 허용해야 했으나, 기존에는 chat_members 테이블에서 member_id 하나가 Primary Key였기 때문에 불가능했다.
- chat_messagesmessage_id(PK) room_id(FK) member_id(FK) content created_at image_url
type uuid uuid(chat_rooms table) uuid(users table) text timestampz text - usersuser_id(PK) nickname email profile_url created_at
type uuid text text text timestampz - chat_fevertime_roomsid(PK) room_id(FK) chat_per_hour created_at
type uuid uuid(chat_rooms table) text timestampz - 채팅방 멤버 수 제한 로직 enterAsMember()
- 채팅방 최대 멤버 수가 고정된 값(예: 10인)이라면, 애플리케이션 코드에서 기본 최대 멤버 수를 상수 값으로 설정하고 로직에 활용할 수 있다.
- 기본 최대 멤버 수를 상수로 설정하고 현재 멤버 수를 count 해서 추가 여부를 결정
const MAX_MEMBERS = 10; // 채팅방 최대 멤버 수 (상수로 정의) async function enterAsMember(userId, roomId) { try { // Step 1: 현재 멤버 수 확인 const { count: currentMembers, error: countError } = await supabase .from('chat_member') .select('member_id', { count: 'exact' }) .eq('room_id', roomId); if (countError) throw new Error('현재 멤버 수를 확인하는 중 오류가 발생했습니다.'); // Step 2: 멤버 수 비교 if (currentMembers >= MAX_MEMBERS) { throw new Error('채팅방 인원이 최대치에 도달했습니다.'); } // Step 3: 멤버 추가 const { error: insertError } = await supabase .from('chat_member') .insert({ member_id: userId, // userId를 member_id로 사용 room_id: roomId, // 어떤 채팅방인지 isAdmin: false, // 일반 멤버로 입장 isActive: true // 활성 상태 }); if (insertError) throw new Error('멤버를 추가하는 중 오류가 발생했습니다.'); return { success: true, message: '채팅방에 성공적으로 입장했습니다.' }; } catch (error) { return { success: false, message: error.message }; } }
- 채팅방 최대 멤버 수가 고정된 값(예: 10인)이라면, 애플리케이션 코드에서 기본 최대 멤버 수를 상수 값으로 설정하고 로직에 활용할 수 있다.
- 채팅방 멤버 수 제한 로직 enterAsMember()
- chat_roomsroom_id(PK) user_id(FK) room_title room_subtitle room_description room_thumbnail_url room_hashtags isActive created_at