회원관리기능 - Part 1 회원가입
ㆍProject Diary/React + Firebase (Snack ShoppingMall)
React + Firebase 사용하여 회원가입 기능 구현 방법 기록
과정
- 상태 관리 및 입력값 처리
- 중복 체크 및 회원가입 처리
- 주소 검색 기능 추가
1. 상태 관리 및 입력값 처리
회원가입 폼에서 입력한 값을 관리하고 처리하는 방법을 설정합니다. useState와 useRef를 사용해서 상태를 관리하고, handleChange 함수를 통해 입력값을 업데이트합니다.
const JoinSection = () => {
const dispatch = useDispatch();
const members = useSelector((state) => state.members.members);
const navigate = useNavigate();
const userIdRef = useRef("");
const userPwRef = useRef("");
const userPwOkRef = useRef("");
const mZipcodeRef = useRef("");
const mAddressRef = useRef("");
const mAddressSubRef = useRef("");
const [userInfo, setUserInfo] = useState({
userId: "",
userPw: "",
userPwOk: "",
userIrum: "",
handphone: "",
zipCode: "",
addr1: "",
addr2: "",
});
const handleChange = (e) => {
const { value, name } = e.target;
setUserInfo((userInfo) => ({ ...userInfo, [name]: value }));
};
2. 중복 체크 및 회원가입 처리
이제 회원가입 시 이메일 중복 체크와 회원가입 처리 로직을 추가합니다.
const register = async (e) => {
e.preventDefault();
if (!userInfo.userId) {
alert("이메일을 입력하세요.");
userIdRef.current.focus();
return;
}
if (!userInfo.userPw) {
alert("비밀번호를 입력하세요.");
userPwRef.current.focus();
return;
}
if (!userInfo.userPwOk) {
alert("비밀번호를 입력하세요.");
userPwOkRef.current.focus();
return;
}
if (userInfo.userPw !== userInfo.userPwOk) {
alert("비밀번호가 일치하지 않습니다.");
userPwRef.current.focus();
return;
}
if (!idCheck(userInfo.userId)) {
return false;
}
const addMember = {
mid: Date.now(),
userId: userInfo.userId,
userPw: userInfo.userPw,
userIrum: userInfo.userIrum,
handphone: userInfo.handphone,
zipCode: userInfo.zipCode,
addr1: userInfo.addr1,
addr2: userInfo.addr2,
};
try {
await kuwazawa_memberDB.push(addMember);
alert("회원가입이 성공했습니다.");
navigate("/login");
} catch (error) {
console.log("오류 : ", error);
}
};
const idCheck = (value) => {
let duplicate = members.find((item) => item.userId === value);
if (duplicate) {
alert("중복된 아이디입니다.");
userIdRef.current.focus();
return false;
} else {
return true;
}
};
3. 주소 검색 기능추가
주소 검색 기능을 통해 사용자가 쉽게 주소를 입력할 수 있도록 추가해요. Daum Postcode API를 사용합니다.
useEffect(() => {
window.openDaumPostcode = () => {
new window.daum.Postcode({
oncomplete: (data) => {
let fullAddr = ""; // 최종 주소 변수
let extraAddr = ""; // 조합형 주소 변수
if (data.userSelectedType === "R") {
// 사용자가 도로명 주소를 선택했을 경우
fullAddr = data.roadAddress;
} else {
// 사용자가 지번 주소를 선택했을 경우(J)
fullAddr = data.jibunAddress;
}
if (data.userSelectedType === "R") {
if (data.bname !== "") {
extraAddr += data.bname;
}
if (data.buildingName !== "") {
extraAddr +=
extraAddr !== "" ? ", " + data.buildingName : data.buildingName;
}
fullAddr += extraAddr !== "" ? " (" + extraAddr + ")" : "";
}
// 주소 정보를 입력 요소에 설정
setUserInfo((prevState) => ({
...prevState,
zipCode: data.zonecode,
addr1: fullAddr,
}));
mAddressSubRef.current.focus();
},
}).open();
};
}, []);