기획
FE
전체 페이지 와이어프레임 작성
페이지 분담 (나: 회원가입, 로그인, 채팅)
노션 협업 템플릿이 있어서 따로 정할 규칙은 없었다. 암묵적으로 통용된 규칙이 있어서 덜 중요한 것에 힘 빼지 않고, 중요한 것을 바로 얘기 나눌 수 있었다.
useReducer
를 떠올렸다가 이보다 간단한 폼 라이브러리 useForm
사용 결정<small>
폼 작성할 때 제일 먼저 고려했던 건 useReducer이다. 하지만 state 기반 훅 사용 시(useState, useReducer) 재렌더링 되기 때문에 useEffect로 성능 개선까지 해줘야 한다는 점이 마음에 걸렸다. 폼은 input 값이 다양할 뿐이지 기능 자체는 복잡하지 않으니, 다른 방식을 찾고 싶었다.
그러다 발견한 react-hook-form 라이브러리.
이전엔 라이브러리를 많이 사용하면 혼자 할 수 있는 게 완전히 사라지지 않는 거 아닐까 싶었는데, 해당 라이브러리가 어떤 면에서 도움을 주는지 파악한 후에 사용한다면 오히려 발전에 도움되는 게 아닌가 싶다.
<small role="alert">
유효성 검사 에러 메시지를 어떤 태그로 보여줄지가 고민이었다. <span>
으로 쓰자니 inline이라 디자인이 불편하고, <div>
로 가자니 이미 많은 <div>
에 하나 더하고 싶지 않았다.
그렇게 레퍼런스를 찾다가 발견한 태그, <small>
하단에 한 줄로 작성할 문구에 적합한 태그였다. (ex. copyright) 유효성 검사도 딱 한 줄씩 input 개수만큼 있는 거라서 적합하다는 생각이다.
지난번엔 백/프론트를 나누지 않아선지 프론트끼리 미리 정할 내용이 무엇인지 잘 몰랐다. 해가면서 의논하는 면도 있지만 처음부터 정하면 번거로움이 덜할 주제가 있는 듯하다.
📦src
┣ 📂setting
┣ ┗ 📜 서버 연결 (프록시 파일)
┣ 📂components
┃ ┗ 📜 공통 컴포넌트 (ex. MediaQuery, Form)
┃ ┣ 📂pages
┃ ┣ ┗ 📜페이지 컴포넌트
┣ 📂styles
┃ ┗ css
┣ 📜App.js
┣ 📜index.css
┗ 📜index.js
발생 : 라이브러리 깔고 잘 불러와서 useForm 사용하려는 중
오류 메시지 :
React Hook "useForm" is called in function "signUp"
that is neither a React function component
nor a custom React Hook function.
원인 : react hook도 컴포넌트라서 대문자로 시작해야 함
해결 : signUp
→ SignUp
변경
발생 : useForm으로 유효성 검사 적용 중
오류 메시지 : path.split is not a function
디버깅 과정 :
가장 많이 검색된 원인은 버전 문제다. useForm은 6버전과 7버전 이상의 코드 형식이 다르다.
✔️ 6버전 : ref = { register( { … } ) }
✔️ 7버전 : {...register("name", {...})}
하지만 7버전으로 설치 후 형식에 맞춰 제대로 작성했는데도 문제가 생겼.
원인 : 오타와 누락
(minLength를 mixLength로 + "name"
부분 누락된 input 있었음)
✔️ 플로우
헤더에서 로그인 클릭 후 로그인 버튼 & 회원가입 페이지 이동
✔️ 와이어프레임 수정
UI 완성 전까진 BE에서 유일하게 확인할 수 있는 화면임을 뒤늦게 인지하여 달라진 플로우에 맞게 와이어프레임 수정
✔️ input 디자인 border-bottom
으로 수정
기존의 박스 형식은 input 개수가 5개 이상일 경우 답답해 보여 선으로 변경
✔️ 유효성 에러메시지 여부에 상관없이 height 고정
✔️ 유효성 에러메시지 스타일링
✔️ 유효성 통과 못하면 button disabled
✔️ 로그인 할 땐 유효성 에러메시지 X
✔️ 플로우
세션 기능 생기면 헤더에 유저 아이콘을 넣어 로그인 여부에 따라 로그인 페이지/마이페이지 이동 (현재는 url로 접속 중)
마이페이지에서 회원정보 수정 클릭 시 페이지 이동
✔️ 마이페이지 기본 레이아웃 작성 & 컨테이너 scss 조금
BE도 전체 플로우 파악을 할 수 있게끔 와이어프레임도 수정했다.
✔️ Add : 마이페이지, 회원정보 수정
✔️ Edit : 회원가입, 로그인, 상세(댓글 형식)
font: inherit;
💡 첨언 : a 태그 관련 css는 없어서 이건 추가해두는 게 좋다.
a {
text-decoration: none;
color: inherit;
}
node나 node-sass 둘 중 하나를 맞추면 되지만, 공식 문서를 보면 node-sass는 더이상의 사용이 비권장된다.
Warning: LibSass and Node Sass are deprecated. While they will continue to receive maintenance releases indefinitely, there are no plans to add additional features or compatibility with any new CSS or Sass features. Projects that still use it should move onto Dart Sass.
npm remove node-sass@8.0
🐞 유저 입장에선 에러라고 오해할 수 있을 것 같다.
해결
로그인의 input이 빈값이라는 걸 어떻게 알 수 있을까? useForm에서 제공하는 watch
를 사용한다. 실시간으로 input 값을 감지한다. onChange와 비슷하다고 이해하면 될 듯하다.
<button
type="submit"
className="signButton"
disabled={!watch('id') || !watch('pw')}
>
로그인
</button>
🐞 불필요한 리렌더링이 발생한다.
상황
회원가입/로그인 라우터에 맞춰 보이는 요소를 달리했다. 이때 아이디와 비밀번호 유효성 검사는 회원가입일 때에만 보여줄 거다. 그래서 signUp type인지 아닌지 flag 용도로 state를 만들어줬다.
해결
한번만 렌더링이 일어나는, 즉 마운트에만 실행하는 빈배열로 바꿨다.
useEffect(() => {
if (type === 'signup') {
console.log(type);
setIsSignUp(true);
}
}, []);
git stash
로 임시 저장을 해야 전환이 가능하다. 첫 프로젝트 당시 다른 팀원이 겪은 일을 같이 해결했던 건데 이렇게도 도움이 되어 신기했다.