You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
textsToCheck 배열에 pollData.description이 포함되어 있는데, 만약 description이 빈 문자열 또는 null/undefined일 경우 필터링은 되지만, 이미지 이름(파일명) 검사도 필요하다고 주석에 적혀 있으나 실제로 이미지 이름은 검사 대상에 포함되어 있지 않습니다.
개선 제안: 이미지 이름도 검사 대상에 포함시키려면 pollData.pollChoices의 이미지 URL에서 파일명만 추출해 검사 대상에 추가하는 로직이 필요합니다.
useMutation의 mutationFn 내부에서 다수의 requestModeration 호출 시 에러가 발생해도 무시하고 진행하는데, 네트워크 문제 등으로 모든 요청이 실패할 경우 빈 결과를 반환해 부적절한 내용이 걸러지지 않을 위험이 있습니다.
개선 제안: 실패한 요청에 대한 로깅이나 사용자 알림, 또는 재시도 로직을 추가하는 것이 안전합니다.
handleClickPollEditButton에서 isValid 체크 후 바로 checkModeration 호출하는데, checkModeration이 비동기임에도 불구하고 updatePoll 호출 시점이 onConfirm 콜백에 의존해 있어 UI 상태 관리가 다소 불명확할 수 있습니다.
개선 제안: isPending 상태를 적절히 활용해 버튼 비활성화 처리 및 중복 클릭 방지 로직을 명확히 하는 것이 좋습니다.
useModerationCheck 훅에서 mutate만 받아오고 있는데, isPending 상태를 받아서 제출 버튼 비활성화 처리나 로딩 UI 표시가 없어서 UX 개선 여지가 있습니다.
개선 제안: isPending 상태를 받아서 제출 중임을 사용자에게 명확히 보여주고, 중복 제출을 방지하는 로직 추가를 권장합니다.
package.json + yarn.lock
chooz-ai-moderation 패키지를 추가했는데, 실제 코드에서는 해당 패키지를 직접 사용하지 않고 있습니다. 불필요한 의존성 추가일 가능성이 있습니다.
개선 제안: 사용하지 않는 의존성은 제거하거나, 해당 패키지를 사용하는 코드가 누락된 것은 아닌지 확인 필요합니다.
nit
src/api/moderation.ts: 에러 메시지에 마침표가 두 개(..) 붙어 있음. "추가해주세요.." → "추가해주세요."로 수정 권장
src/hooks/useModerationCheck.tsx: useMutation 반환값을 바로 반환하는데, 타입 명시가 없어 가독성 및 유지보수성 향상을 위해 제네릭 타입 명시 권장
src/components/poll/edit/PollEditButton/hooks.ts: isPending 변수명을 isUpdatePending과 isModerationPending 합친 상태로 재정의하는데, 변수명이 중복되어 혼동될 수 있으므로 명확한 이름 사용 권장 (isAnyPending 등)
이유: detectedWords가 배열이 아닐 경우 배열로 변환하는 로직이 있으나, API 스펙이 변경되거나 서버에서 빈 문자열, null, undefined 등 다양한 형태가 올 수 있음. 현재는 문자열 한 개만 배열로 감싸는 정도로 처리되어 있는데, 만약 서버가 객체나 다른 타입을 보내면 의도치 않은 동작 가능성 있음.
개선 제안: detectedWords 타입을 좀 더 엄격하게 체크하고, 예상치 못한 타입에 대해 안전하게 빈 배열로 초기화하는 방어 코드를 추가하는 것이 좋음.
이유: textsToCheck 배열에 pollData.description이 포함되어 있는데, 만약 description이 빈 문자열이나 null일 경우 필터링은 되지만, 이미지 파일명 검사 로직이 빠져 있음. 이미지 이름도 검사해야 한다는 주석과 달리 실제로는 이미지 이름이 검사 대상에서 빠져 있음.
개선 제안: pollData.pollChoices 내 이미지 이름(예: imageUrl에서 파일명 추출)을 텍스트 검사 대상에 포함시키는 로직 추가 필요.
requestModeration 함수 내에서 detectedWords가 배열이 아닐 경우 문자열을 배열로 변환하는 로직이 있는데, API 스펙이 명확하다면 이 변환 로직을 API 응답 쪽에서 보장하는 편이 더 안전합니다. 클라이언트에서 변환을 계속 유지하면 유지보수성이 떨어질 수 있습니다.
withCredentials: false 옵션은 기본값이 false이므로 명시할 필요는 없고, 만약 인증 쿠키를 사용하지 않는 API라면 주석으로 의도를 명확히 하는 것이 좋습니다.
useMutation 훅을 반환하는 커스텀 훅인데, 내부에서 openDialog를 호출하는 방식은 UI와 로직이 강하게 결합되어 있습니다. 만약 다른 UI 컴포넌트에서 재사용하거나 테스트하기 어려울 수 있으므로, 모더레이션 결과를 반환하고 호출하는 쪽에서 다이얼로그를 띄우는 구조가 더 유연합니다.
textsToCheck 배열에 pollData.description이 있는데, 만약 description이 빈 문자열이나 null일 경우 .filter(Boolean)으로 걸러지긴 하지만, pollChoices의 title도 빈 문자열일 가능성이 있으니 이 부분도 확실히 검증하는 것이 좋습니다.
onSuccess 콜백에서 variables.onConfirm() 호출 시점이 다이얼로그 닫기 후인데, 혹시 onConfirm 내부에서 상태 변경이 일어나면 다이얼로그가 제대로 닫히지 않을 위험이 있습니다. closeDialog() 호출을 onConfirm 호출 이후로 옮기거나, onConfirm이 Promise를 반환하면 await 처리하는 방법도 고려해볼 수 있습니다.
src/components/poll/edit/PollEditButton/hooks.ts + 전체
handleClickPollEditButton 함수 내에서 checkModeration 호출 시 pollData를 넘기고, onConfirm 콜백에서 updatePoll을 호출하는 구조는 좋으나, isValid 체크가 checkModeration 호출 전에만 되어 있습니다. 만약 checkModeration 호출 중에 isValid가 변할 가능성이 있다면 추가 검증이 필요합니다.
isPending 변수를 isModerationPending || isUpdatePending으로 합친 것은 직관적이나, UI에서 어떤 작업이 진행 중인지 구분이 필요하면 별도로 관리하는 것이 좋습니다.
src/components/poll/regist/PollRegistButton/PollRegistButton.tsx + 전체
handleClickSubmitButton 내에서 checkModeration 호출 후 onConfirm 콜백에서 registVote를 호출하는 구조는 일관성 있고 좋습니다. 다만 checkModeration 훅에서 isPending 상태를 받아서 버튼 비활성화 등에 활용하면 UX가 더 좋아질 수 있습니다.
import 순서가 변경되면서 중복 import가 정리된 점은 좋으나, 상대경로와 절대경로가 섞여 있어 일관된 import 스타일을 유지하는 것이 유지보수에 유리합니다.
package.json / yarn.lock
chooz-ai-moderation 패키지를 새로 추가했는데, 이 패키지가 실제로 코드 내에서 import 되지 않고 있습니다. 만약 내부적으로 requestModeration에서 사용된다면 명확히 주석이나 문서화가 필요합니다.
openai 패키지가 두 버전(^4.0.0과 ^6.9.1)이 중복으로 존재하는데, 충돌이나 번들 크기 증가 우려가 있습니다. 하나의 버전으로 통일하는 것이 좋습니다.
nit (사소한 점)
src/api/moderation.ts: 에러 메시지에 마침표가 두 개(...추가해주세요..) 붙어있음. 하나만 남기는 것이 깔끔합니다.
src/hooks/useModerationCheck.tsx: inlineMessage 생성 시 result.detectedWords.map(...).join(', ') 부분에서 단어가 많으면 UI가 깨질 수 있으니 최대 표시 개수 제한이나 줄임 처리 고려.
src/components/poll/edit/PollEditButton/hooks.ts: useParams<{ pollId: string }>() 타입 명시가 있는데, React Router v6에서는 제네릭 타입이 deprecated 되었으니 최신 문서 확인 필요.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
Modification
투표 제작 / 수정 페이지에서 폼 제출 시에 비속어 감지 시 다이어로그 띄워주는 형태.
윤성님 컨펌 받고 수정 예정입니다.
Result
close #482