사용자에게 다음 7가지의 정보를 입력 받아야 함
서버 통신
서버 통신
서버 통신
서버 통신
각 정보별로 지켜야 하는 형식이 존재(ex 전화번호 10-11자리)
회원가입 과정에서 서버와의 통신은 총 네 번 이루어짐
페이지 별로 다음
버튼이 존재했으므로, 사용자가 해당 버튼을 클릭했을 때를 기점으로 모든 동작이 일어나게끔 함!
여러 개의 페이지, 즉 여러 개의 컴포넌트에서 입력 받은 정보를 한 데 모아 전송해야 했다.
useHistory와 useLocation hook을 사용하여 페이지에서 페이지로 정보를 전송하는 방법도 존재했다. 그러나 6개나 되는 페이지들을 이동할 때마다 state를 넘겨주는 방식이 비효율적이라고 판단했기 때문에, 중앙저장소라고 할 수 있는 redux를 사용했다.
Ducks 패턴을 사용해 📁 src > 📁 modules > register.js
라는 한 파일에 회원가입과 관련 된 액션, 액션 생성 함수, 리듀서를 작성했다.
사용자가 다음
버튼을 클릭했을 시점에 입력되어 있는 정보를, 액션 객체에 담아 dispatch 하였다.
기본적으로 액션 객체에 담겨온 값을 store에 저장하되, 서버 요청이 필요한 정보의 경우(전화번호, 인증번호 등) 응답 결과에 따라 다른 처리를 해주었다.
최종적으로 서버에 회원가입 요청을 보낼 때에 store에 저장되어 있던 데이터는 다음과 같다.(예시)
정보 별로 지켜야 하는 형식이 존재했다. 형식 충족 여부를 서버 단에서 판별할 수도 있지만, 그 경우 서버요청이 필요 이상으로 자주 발생하기 때문에 클라이언트 단에서 판별하기로 결정했다.
input: 사용자가 입력한 값
output: 값이 형식을 충족하면 true, 충족하지 않으면 false
위와 같은 input, output을 가지는 함수들을 📁 src > 📁 utils > regexes.js
에 작성했다. 그리고 이를 컴포넌트 내에 import하여 사용했다.
형식 충족 여부는 정규식을 이용해 판단하였다.
useEffect를 사용해 state에 저장된 사용자의 입력값(e.target.value)이 변할 때마다 형식 충족 여부를 체크했다. 형식이 충족되었을 때에만 다음
버튼을 활성화하여 그 다음 페이지로 넘어갈 수 있게 했다.
예시 코드
// 📁src > 📁pages > 📁Register > Password.js
import { isPassword } from '..(생략)'
const [password, setPassword] = useState(""); // 사용자의 입력값을 저장하는 state
const [type, setType] = useState(false); // 형식 충족 여부를 저장하는 state
useEffect(() => {
setType(isPassword(password));
}, [password]);
// 📁src > 📁utils > regexes.js
export const isPassword = (pw) => {
const passwordRegex =
/^.*(?=^.{8,15}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&+=]).*$/;
return passwordRegex.test(pw);
};