카테고리 없음

채팅방 테이블 수정 / 멤버 수 제한

myinfo7091 2025. 1. 10. 09:01
  • 채팅방 데이터 테이블 스키마 수정
    • 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 };
            }
          }