<aside> 💻
GitHub Copilot 또는 ChatGPT를 통해 코드리뷰 진행:
// 예시: 리팩토링이 필요한 코드// Before
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
try {
const response = await api.post('/auth/login', { id, password });
if (response.data.success) {
// 직접적인 DOM 조작
window.location.href = '/dashboard';
}
} catch (error) {
alert('Error occurred');
}
};
// After (리팩토링)
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
try {
await loginMutation.mutateAsync({ id, password });
navigate('/dashboard');
} catch (error) {
captureError(error);
toast.error('로그인에 실패했습니다.');
}
};
// Before
const TodoList = () => {
const [todos] = useState([...manyTodos]);
return todos.map(todo => <TodoItem key={todo.id} {...todo} />);
};
// After
const TodoList = memo(() => {
const [todos] = useState([...manyTodos]);
return useMemo(() =>
todos.map(todo => <TodoItem key={todo.id} {...todo} />),
[todos]
);
});
// src/hooks/useAuth.ts
export const useAuth = () => {
const loginMutation = useLoginMutation();
const { setUser } = useAuthStore();
const navigate = useNavigate();
const login = async (credentials: LoginCredentials) => {
try {
const response = await loginMutation.mutateAsync(credentials);
setUser(response.user);
navigate('/dashboard');
return response;
} catch (error) {
captureError(error);
throw error;
}
};
return { login, isLoading: loginMutation.isLoading };
};
// src/utils/errorHandling.ts
export const createErrorHandler = (context: string) => ({
onError: (error: unknown) => {
captureError(error, { context });
toast.error(getErrorMessage(error));
}
});
// 사용 예시
const mutation = useMutation({
mutationFn: loginAPI,
...createErrorHandler('auth/login')
});
// src/hooks/useTodo.ts
export const useTodo = (todoId: number) => {
const queryClient = useQueryClient();
const todoQuery = useQuery({
queryKey: ['todo', todoId],
queryFn: () => fetchTodo(todoId),
staleTime: 1000 * 60 * 5// 5분
});
const updateMutation = useMutation({
mutationFn: updateTodo,
onSuccess: (updatedTodo) => {
queryClient.setQueryData(['todo', todoId], updatedTodo);
}
});
return {
todo: todoQuery.data,
isLoading: todoQuery.isLoading,
updateTodo: updateMutation.mutate
};
};
## 배포 전 체크리스트
### 1. 코드 품질
- [ ] 불필요한 console.log 제거
- [ ] 주석 정리
- [ ] 미사용 import 정리
- [ ] TypeScript 타입 체크
### 2. 성능
- [ ] React DevTools로 불필요한 리렌더링 체크
- [ ] 큰 번들 사이즈의 dependencies 체크
- [ ] 이미지 최적화
### 3. 테스트
- [ ] 모든 테스트 케이스 통과 확인
- [ ] 주요 기능 수동 테스트
- [ ] 크로스 브라우저 테스트
### 4. 보안
- [ ] 환경변수 설정 확인
- [ ] API 엔드포인트 보안 확인
- [ ] 민감한 정보 노출 체크