Skip to content

[BOM-1182] feat: 리뷰어 배정 설정 및 인원 관리 기능 추가#288

Merged
Ryan-Dia merged 2 commits into
devfrom
BOM-1182-리뷰어-설정-인원관리
Jul 5, 2026

Hidden character warning

The head ref may contain hidden characters: "BOM-1182-\ub9ac\ubdf0\uc5b4-\uc124\uc815-\uc778\uc6d0\uad00\ub9ac"
Merged

[BOM-1182] feat: 리뷰어 배정 설정 및 인원 관리 기능 추가#288
Ryan-Dia merged 2 commits into
devfrom
BOM-1182-리뷰어-설정-인원관리

Conversation

@Ryan-Dia

@Ryan-Dia Ryan-Dia commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

📌 What

  • 대시보드에서 리뷰 기한(기본 4일)과 배정 제외 라벨(No Review)을 수정할 수 있는 설정 모달 추가
  • 리뷰어 추가/삭제/이름 변경을 대시보드에서 직접 관리 가능

❓ Why

  • 기한·제외 라벨·인원 변경 때마다 Supabase 콘솔이나 코드 수정 없이 운영자가 대시보드에서 바로 처리할 수 있어야 함 (admin 레포 #41의 폴링 배정이 이 설정을 읽어감)

🔧 How

  • ReviewSetting 타입 + review_setting 단일 행 테이블 조회/수정 API (getSetting/updateSetting)
  • 인원 관리 API: addReviewer(rotation_order 자동 = 최대값+1) / deleteReviewer(배정 이력 FK 제약 시 휴가 처리 안내 메시지) / updateReviewerName
  • /reviewers 필터바에 "+ 리뷰어 추가", "⚙ 설정" 버튼 + 모달 2종 (ReviewerModals.tsx)
  • 테이블에 "관리" 컬럼 추가: 이름 인라인 편집(Enter 저장/Esc 취소), 삭제는 네이티브 confirm 대신 2클릭 확인 패턴
  • 설정 모달은 Suspense + ErrorBoundary로 감싸 review_setting 테이블 미생성 시 안내만 표시

👀 Review Point

  • 머지 전 Supabase 마이그레이션 필요: review_setting 테이블 생성 + reviewer 테이블 INSERT/DELETE/UPDATE 권한 확장 (스키마: admin 레포 docs/reviewer-assignment/schema.sql)
  • anon 키에 reviewer 쓰기 권한을 여는 트레이드오프 — 내부 도구 + 앱 레벨 인증 게이트 전제인데 괜찮은지
  • 배정 이력이 있는 리뷰어 삭제 시 에러 메시지(휴가 처리 유도)가 적절한지

@jaeyoung-kwon jaeyoung-kwon left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 PR Review

⚠️ 수정이 필요한 리뷰 코멘트가 있습니다.

리뷰어 배정 설정/인원 관리 CRUD를 대시보드에 추가하는 변경입니다. 전반적인 구조는 기존 패턴(useMutation + invalidate, ErrorBoundary/Suspense)을 잘 따르고 있습니다. 다만 addReviewer의 rotation_order 계산이 read-then-write 방식이라 동시 추가 시 순번이 충돌할 수 있는 경쟁 조건이 있어 major로 표시합니다.

🚨 0 Critical · ⚠️ 1 Major · 📝 1 Minor

수정 필요

  • admin/src/apis/reviewers/reviewers.api.ts:44 — addReviewer의 rotation_order 계산에 경쟁 조건 존재 (인라인 코멘트 참조).

참고

  • admin/src/components/reviewers/ReviewersTableBody.tsx:79 — 이름 편집 input의 callback ref가 매 렌더마다 재실행됨
    ref={(el) => el?.focus()}는 인라인 함수라 매 렌더(예: 타이핑으로 인한 editingName 상태 변경)마다 새로 생성되어, React가 이전 ref를 null로 호출한 뒤 새 ref로 다시 focus()를 호출합니다. 이미 포커스된 엘리먼트에 focus()를 다시 호출하는 것은 대부분 브라우저에서 눈에 띄는 부작용은 없지만, 의도는 '편집 모드 진입 시 1회 자동 포커스'이므로 useRef + useEffect(mount 시 1회)로 옮기는 것이 더 안전하고 명확합니다.
📋 검증 과정
  • Claude structured review 결과 중 확신도가 있는 항목만 정리했습니다.
  • Critical/Major는 inline comment로 게시하고, Minor는 참고 항목으로 summary에 포함합니다.
  • 자동 생성된 OpenAPI 타입 선언 파일과 lock 파일은 리뷰 대상에서 제외합니다.

🤖 Claude PR Review


Generated by Claude Code

Comment on lines +44 to +57
const { data: maxRows, error: maxError } = await supabase
.from('reviewer')
.select('rotation_order')
.order('rotation_order', { ascending: false })
.limit(1);

if (maxError) throw maxError;
const nextOrder = (maxRows?.[0]?.rotation_order ?? 0) + 1;

const { error } = await supabase.from('reviewer').insert({
display_name: params.displayName,
github_username: params.githubUsername,
rotation_order: nextOrder,
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [Major] addReviewer의 rotation_order 계산에 경쟁 조건 존재

addReviewer는 현재 최대 rotation_order를 조회한 뒤 +1한 값으로 insert합니다. 두 관리자가 거의 동시에 '리뷰어 추가'를 실행하면 두 요청 모두 같은 max 값을 읽어 동일한 rotation_order로 insert될 수 있습니다. 이 값은 배정 순환(round-robin) 로직이 사용하는 핵심 정렬 키이므로, 중복 순번이 생기면 배정 순서가 꼬이거나 특정 리뷰어가 과다/과소 배정될 수 있습니다. DB에 rotation_order unique 제약이 없다면 조용히 중복 데이터가 쌓입니다.

Claude 검증: 변경 diff의 admin/src/apis/reviewers/reviewers.api.ts:44-57 기준으로 확인했습니다. 실제 코드와 다르면 이 코멘트는 무시해 주세요. (confidence 0.6).

수정 제안:
이 finding이 여전히 유효한지 먼저 확인한 뒤, 관련 코드만 최소 범위로 수정하고 필요한 검증을 실행해 주세요.


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 부분 수정했습니다. 👍

@Ryan-Dia Ryan-Dia merged commit 87b003b into dev Jul 5, 2026
1 check passed
@Ryan-Dia Ryan-Dia deleted the BOM-1182-리뷰어-설정-인원관리 branch July 5, 2026 17:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants