

위 사진처럼 회원가입란에 회원 정보를 다 넣은 후 "회원가입"을 누르면 회원의 정보가 json 형식으로 백엔드 측에서 구현한 코드로 넘어가게 되고 mySQL에 회원 데이터가 저장되는 것을 확인할 수 있다.
<떴던 오류>

⬇︎백엔드 측에서 해결
<CORS policy 해결>
.cors(corsCustomizer -> corsCustomizer.configurationSource(new CorsConfigurationSource() { @Override public CorsConfiguration getCorsConfiguration(HttpServletRequest request) { CorsConfiguration config = new CorsConfiguration(); config.setAllowedOrigins(Collections.*singletonList*("<http://localhost:3000>")); config.setAllowedMethods(Collections.*singletonList*("*")); config.setAllowCredentials(true); config.setAllowedHeaders(Collections.*singletonList*("*")); config.setMaxAge(3600L); //1시간 return config; }}))
import React, { useState } from "react";
import { useNavigate } from "react-router-dom";
import "../css/JoinStyle.css";
import Logo from "../components/Logo";
function JoinPage() {
const navigate = useNavigate();
const [UserName, setUserName] = useState("");
const [Email, setEmail] = useState("");
const [Password, setPassword] = useState("");
const [ConfirmPassword, setConfirmPassword] = useState("");
const [PhoneNumber, setPhoneNumber] = useState("");
const [NameValid, setNameValid] = useState(false);
const [passwordValid, setPasswordValid] = useState(false);
const passwordRegEx =
/^(?=.*[0-9]{4,})(?=.*[!@#$%^&*])[A-Za-z0-9!@#$%^&*]{8,}$/;
const [passwordMatch, setPasswordMatch] = useState(false);
const [EmailValid, setEmailValid] = useState(false);
const emailRegEx =
/^[A-Za-z0-9]([-_.]?[A-Za-z0-9])*@[A-Za-z0-9]([-_.]?[A-Za-z0-9])*\.[A-Za-z]{2,3}$/i;
const [PhoneValid, setPhoneValid] = useState(false);
const phoneRegEx = /^\d{3}\d{3,4}\d{4}$/;
const HandleInputUserName = (e) => {
const name = e.target.value;
setUserName(name);
if (name.trim() === "" || name.length < 2) {
setNameValid(false);
} else {
setNameValid(true);
}
};
const HandleInputEmail = (e) => {
const email = e.target.value;
setEmail(email);
if (emailRegEx.test(email)) {
setEmailValid(true);
} else {
setEmailValid(false);
}
};
const HandleInputPassword = (e) => {
const Password = e.target.value;
setPassword(Password);
if (passwordRegEx.test(Password)) {
setPasswordValid(true);
} else {
setPasswordValid(false);
}
};
const HandleInputConfirmPassword = (e) => {
//비밀번호 확인
const confirmPassword = e.target.value;
setConfirmPassword(confirmPassword);
setPasswordMatch(confirmPassword === Password);
};
const HandleInputPhoneNumber = (e) => {
const phone = e.target.value;
setPhoneNumber(phone);
if (phoneRegEx.test(phone)) {
setPhoneValid(true);
} else {
setPhoneValid(false);
}
};
const onClickSubmit = (e) => {
e.preventDefault();
if (!UserName || !Email || !Password || !PhoneNumber) {
alert("모든 필드를 입력하세요.");
return;
}
fetch("http://localhost:8080/auth/sign-up", {
//원하는 주소 입력
method: "post",
headers: {
"content-type": "application/json",
},
body: JSON.stringify({
name: UserName,
email: Email,
password: Password,
phoneNumber: PhoneNumber,
}),
})
.then((res) => {
if (res.ok) {
alert("회원가입 성공!");
navigate("/");
} else {
throw new Error("네트워크 오류 발생");
}
})
.catch((error) => {
console.error("오류 발생:", error);
});
};
return (
<div
style={{
display: "flex",
flexDirection: "row",
width: "100%",
marginTop: "100px",
}}
>
<section
style={{
paddingLeft: "60px",
paddingRight: "60px",
width: "100%",
margin: "0 auto",
overflow: "visible",
}}
>
<div style={{ width: "100%", borderRadius: "4px" }}>
<div style={{ width: "100%", maxWidth: "1260px", margin: "0 auto" }}>
<div
style={{
display: "flex",
flexDirection: "column",
alignItems: "center",
}}
>
<form
style={{
display: "flex",
flexDirection: "column",
}}
onSubmit={onClickSubmit}
>
<h1 style={{ textAlign: "center" }}>회원가입</h1>
<label class="labelStyle">이름</label>
<input
type="text"
value={UserName}
onChange={HandleInputUserName}
placeholder={"이름을 입력하세요."}
class="textStyle"
/>
{UserName && (
<div
className={NameValid ? "valid-message" : "invalid-message"}
>
{NameValid
? "이름이 유효합니다."
: "이름이 유효하지 않습니다."}
</div>
)}
<label class="labelStyle">이메일</label>
<input
type="email"
onChange={HandleInputEmail}
placeholder={"이메일을 입력하세요. "}
class="emailStyle"
/>
{Email && (
<div
className={EmailValid ? "valid-message" : "invalid-message"}
>
{EmailValid
? "이메일 형식이 유효합니다."
: "이메일 형식이 유효하지 않습니다.이메일 형식이 유효하지 않습니다."}
</div>
)}
<label class="labelStyle">비밀번호</label>
<input
type="password"
value={Password}
onChange={HandleInputPassword}
placeholder={"비밀번호를 입력하세요. "}
class="passwordStyle"
/>
{Password && (
<div
className={
passwordValid ? "valid-message" : "invalid-message"
}
>
{passwordValid
? "비밀번호 형식이 유효합니다."
: "비밀번호는 8자 이상, 하나 이상의 특수문자, 최소 4개의 숫자를 포함해야 합니다."}
</div>
)}
<label class="labelStyle">비밀번호 확인</label>
<input
type="password"
value={ConfirmPassword}
onChange={HandleInputConfirmPassword}
placeholder={"비밀번호를 확인하세요. "}
class="passwordStyle"
/>
{ConfirmPassword && (
<div
className={
passwordMatch ? "valid-message" : "invalid-message"
}
>
{passwordMatch
? "비밀번호가 일치합니다."
: "비밀번호가 일치하지 않습니다."}
</div>
)}
<label class="labelStyle">전화번호</label>
<input
type="tel"
value={PhoneNumber}
onChange={HandleInputPhoneNumber}
placeholder={"전화번호를 입력하세요. "}
class="phoneNumberStyle"
/>
{PhoneNumber && (
<div
className={PhoneValid ? "valid-message" : "invalid-message"}
>
{PhoneValid
? "전화번호 형식이 유효합니다."
: "전화번호 형식이 유효하지 않습니다."}
</div>
)}
<br />
<button
type="submit"
onChange={onClickSubmit}
className="buttonStyle"
>
회원가입
</button>
</form>
</div>
</div>
</div>
</section>
</div>
);
}
export default JoinPage;
이름,이메일,비밀 번호 , 전화 번호 데이터의 유효성 검사를 하고나서
백엔드 측에 json 형식으로 데이터를 넘겨주면 db에 저장을 한다.
'Project > Linkmoa' 카테고리의 다른 글
[Linkmoa] 구현 설명 (0) | 2025.01.23 |
---|---|
링크모아 (0) | 2024.04.05 |
[프론트] 로그인 백엔드와 통신 (0) | 2024.03.17 |
[프론트] 회원가입 유효성 검사 & 백엔드 통신 (0) | 2024.03.15 |