HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
👏
[3차] 최종 프로젝트 공지 페이지
/
👍🏿
[최종 프로젝트] 선배 개발자와의 소통 일지
/
😋
팀11 FE 최종피드백
😋

팀11 FE 최종피드백

기입 일자
Aug 20, 2022 03:59 AM
기록 유형
최종 피드백 면담
날짜
Aug 20, 2022
멘토
성기동
분야
프론트엔드
  1. 메인페이지에 뒤로가기 버튼이 존재하는 부분
notion image
  • 앱 기반의 디자인을 하셨는데, 그렇다면 각 네비게이션 첫 페이지에서는 뒤로가기가 존재하지 않아야 할 것으로 보입니다. 뒤로가기는 네비게이션의 스택이 쌓이는 디테일 페이지에서부터 있어야 할 것으로 보입니다.
  • 또한 디테일페이지 등에서는 뒤로가기와 홈 두개가 같이 존재하는 형태로 만들고, 가운데 앱의 로고는 제외한다던지 하는 UI적 관점은 있을 수 있을 것 같습니다.
 
  1. 개인적으로는 기본메뉴와 옵션의 구분이 잘 안되는것 같아요.
  • 조금 더 명확하게 구분이 된다면 좋을 것 같아요. 옵션의 경우 태그와 같은 형태로 한다던지 등등..(바로 아래 사진 참조)
notion image
notion image
  1. 필터는 AND 조건인가요?
    1. ‘차가운'만 적용하였을 경우에는 나오는 리스트가 ‘새콤한' 까지 클릭하였을 경우 아무것도 조회가 되지 않네요. 아마도 AND 조건인것 같은데, OR이 조금 더 맞지 않을까요??
notion image
 

password.tsx 를 보다가…

 
  1. 두 가지 경우에 대한 함수인것 같은데, 분리하는것이 더 적합하지 않았을까요??
const handleEyeClick = useCallback((name: string) => { name === INPUT_PASSWORD ? setIsTypePassword((isTypePassword) => !isTypePassword) : setIsTypeConfirmPassword( (isTypeConfirmPassword) => !isTypeConfirmPassword ) }, [])
 
  1. validate를 별도의 파일로 분리하는것도 좋을 것 같습니다 :)
const validate = (e: React.ChangeEvent<HTMLInputElement>) => { const { value, name } = e.target e.target.value = value.slice(0, 10) if (name === INPUT_PASSWORD) { setErrors({ ...errors, [name]: '' }) if (!REGEX_PASSWORD.test(value)) { setErrors({ ...errors, [name]: MESSAGE_PASSWORD }) } if (passwordConfirm === e.target.value) { setErrors({ ...errors, [INPUT_PASSWORD_CONFIRM]: '' }) } setPassword(e.target.value) } if (name === INPUT_PASSWORD_CONFIRM) { setErrors({ ...errors, [name]: '' }) if (!REGEX_PASSWORD.test(value)) { setErrors({ ...errors, [name]: MESSAGE_PASSWORD }) } if (password !== e.target.value) { setErrors({ ...errors, [name]: ERROR_PASSWORD_CONFIRM }) } setPasswordConfirm(e.target.value) } }
 
  1. 아마도 로그인을 하지 않았을 경우 접근하지 못하는 페이지로 보이는데, submit에서 한번 더 체크(!user.id)를 해야하는 이유가 있나요?
 
const handleSubmit = (e: React.MouseEvent<HTMLButtonElement>) => { e.preventDefault() const isError = Object.keys(errors).some( (key) => errors[key as keyof typeof errors] !== '' ) if (!user.id) { router.replace('/login') return } if (password && !isError) { patchPassword({ userId: user.id, password }) router.back() } }

  1. 불필요한 a 태그가 있는것 같습니다.
<Link href={HOME_URL}> <a> <Logo> <Image src={SMALL_LOGO} width="100rem" height="60rem" alt={SMALL_LOGO} /> </Logo> </a> </Link>
 
  1. 컴포넌트에 더미.json과 컴포넌트가 공존하는것 같은데, 분리가 필요해 보이는 것 같습니다.
notion image
 
  1. 목적에 따라 나누어서 함수구현된 부분은 좋은 것 같습니다 🙂
const handleEditMenuClick = () => { setIsModalOpen(true) } const handleEditMenuClose = () => { setIsModalOpen(false) }
 
  1. 비슷한 코드의 반복이 있다면 hooks로 만들수 있지 않을까? 의 고민이 필요해 보입니다 :)
const handleTitleChange = (e: React.FormEvent<HTMLInputElement>) => { title = e.currentTarget.value handleOnChange() } const handleOriginalTitleChange = (e: React.FormEvent<HTMLInputElement>) => { originalTitle = e.currentTarget.value handleOnChange() }
 
처음사용하는 next, recoil 이라 프로젝트를 이끌어가는데 많은 어려움이 있으셨을것으로 생각합니다.
그럼에도 불구하고 성공적으로 나오도록 하여서 무척이나 뿌듯하네요.
리펙토링을 진행하신다고 들은것 같습니다.
기한내에 완수하신다고 부족했던 부분들에 대해서 차근차근 채워나가면 좋을 것 같습니다.
끝으로 이력서또한 잘 쓰시길 기원합니다 😊