[BOM-1182] feat: 리뷰어 배정 설정 및 인원 관리 기능 추가#288
Hidden character warning
Conversation
jaeyoung-kwon
left a comment
There was a problem hiding this comment.
🤖 PR Review
⚠️ 수정이 필요한 리뷰 코멘트가 있습니다.
리뷰어 배정 설정/인원 관리 CRUD를 대시보드에 추가하는 변경입니다. 전반적인 구조는 기존 패턴(useMutation + invalidate, ErrorBoundary/Suspense)을 잘 따르고 있습니다. 다만 addReviewer의 rotation_order 계산이 read-then-write 방식이라 동시 추가 시 순번이 충돌할 수 있는 경쟁 조건이 있어 major로 표시합니다.
🚨 0 Critical ·
수정 필요
- 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
| 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, | ||
| }); |
There was a problem hiding this comment.
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
📌 What
No Review)을 수정할 수 있는 설정 모달 추가❓ Why
🔧 How
ReviewSetting타입 +review_setting단일 행 테이블 조회/수정 API (getSetting/updateSetting)addReviewer(rotation_order 자동 = 최대값+1) /deleteReviewer(배정 이력 FK 제약 시 휴가 처리 안내 메시지) /updateReviewerName/reviewers필터바에 "+ 리뷰어 추가", "⚙ 설정" 버튼 + 모달 2종 (ReviewerModals.tsx)review_setting테이블 미생성 시 안내만 표시👀 Review Point
review_setting테이블 생성 + reviewer 테이블 INSERT/DELETE/UPDATE 권한 확장 (스키마: admin 레포docs/reviewer-assignment/schema.sql)