MBTI 개인과제 회원가입 부분을 구현하던 중 자꾸만 서버 에러가 났다.
4로 시작하는 에러는 뭐다? === 내 잘못이다.. 해서 엄청나게 고민해서 주말을 통째로 날려먹었다.
회원가입 기능 구현
import AuthForm from "../components/AuthForm";
import { register } from "../api/auth";
import { Link, useNavigate } from "react-router-dom";
const Signup = () => {
const navigate = useNavigate();
const handleSignup = async (formData) => {
//console.log("전송된 formData 확인용!!!!! ====>", formData);
try {
const response = await register({
userId: formData.userId,
password: formData.password,
nickname: formData.nickname,
});
// console.log("회원가입 응답:", response);
if (response.success) {
register(response.token);
navigate("/login");
} else {
throw new Error("토큰이 응답에 포함되지 않았습니다.");
}
} catch (error) {
if (error.response) {
console.log("서버 응답 확인:", error.response.data); // 서버가 반환한 메시지를 출력
} else {
console.log("요청 오류:", error.message);
}
}
};
return (
<div>
<div>
<h1>회원가입</h1>
<AuthForm mode="signup" onSubmit={handleSignup} />
<div>
<p>
이미 계정이 있으신가요? <Link to="/login">로그인</Link>
</p>
</div>
</div>
</div>
);
};
export default Signup;
: 아이디, 비밀번호, 닉네임을 입력하고 가입하기를 누르면 회원가입이 되면서 로그인 페이지로 리다이렉트 된다.
처음에 로직을 작성하고 전송된 formData
를 확인하기 위해서 console.log
를 찍어보았다.
그랬더니 userId
로 값을 받아와서 Key
값을 바꿔줘야하나? 하고 나도 바꿔줬더니 api
에서 내가 입력한 데이터를 읽지 못하고 오류메시지를 보냈다.
분명 formData
에 내가 입력한 아이디, 비밀번호, 닉네임이 있으면 당연히 들어갈 줄 알았는데!!
알고보니 이렇게 api
를 제공받아서 사용할 경우 정해진 key
명으로 작성해줘야했다.
const handleSignup = async (formData) => {
console.log("전송된 formData 확인용!!!!! ====>", formData);
try {
const response = await register({
userId: formData.userId, //🚨Key Error : userId
password: formData.password,
nickname: formData.nickname,
});
console.log("회원가입 응답:", response);
if (response.success) {
register(response.token);
navigate("/login");
} else {
throw new Error("토큰이 응답에 포함되지 않았습니다.");
}
} catch (error) {
if (error.response) {
console.log("서버 응답 확인:", error.response.data);//🚨에러 메시지 출력
} else {
console.log("요청 오류:", error.message);
}
}
};
const handleSignup = async (formData) => {
console.log("전송된 formData 확인용!!!!! ====>", formData);
try {
const response = await register({
id: formData.userId, //✅ api에서 제공하는 Key명으로 수정하기
password: formData.password,
nickname: formData.nickname,
});
console.log("회원가입 응답:", response);
if (response.success) {
register(response.token);
navigate("/login");
} else {
throw new Error("토큰이 응답에 포함되지 않았습니다.");
}
} catch (error) {
if (error.response) {
console.log("서버 응답 확인:", error.response.data);//🚨에러 메시지 출력
} else {
console.log("요청 오류:", error.message);
}
}
};
key 값을 옳게 바꿔주었는데도 여전히 빨간 오류창이 떴는데 이것도 해결하려고 찾기까지 오래걸렸다.
data
에 여전히 오류 메시지가 뜨고 회원가입할 때 사용한 register
함수에서 401 에러가 발생하고 있었다.
export const register = async (userData) => {
const response = await axios.post(`${API_URL}/register`, userData);
console.log(response.data);
return response.data;
};
콘솔로 response.data
에 어떤 값을 받아오는지도 확인했는데 일단 큰 문제는 발견되지 않았었고
회원가입이 우선 되는데 똑같이 401 에러
가 발생한다는게 의아했다.
회원가입이 되었는데요? 안 됐습니다… 이런 꼴..ㅎ
if (response.success) {
register(response.token); //🚨에러 발생하는 원인!!!
navigate("/login");
} else {
throw new Error("토큰이 응답에 포함되지 않았습니다.");
}
알고보니 이 if 조건문에서 register
를 한번 더 실행시킨게 문제였다.
이미 위에 코드에서 register
함수를 사용해서 사용자의 데이터를 받아와놓고, 성공하면 다시 함수를 실행시켜버렸다.
그러면 이미 회원가입이 되었는데 또 회원가입을 하게 하니까 데이터도 문제가 되고 api
데이터도 문제가 되었던 것!
const handleSignup = async (formData) => {
console.log("전송된 formData 확인용!!!!! ====>", formData);
try {
const response = await register({ //✅ auth.js에서 만든 register함수 실행
id: formData.userId,
password: formData.password,
nickname: formData.nickname,
});
console.log("회원가입 응답:", response);
if (response.success) {
// register(response.token); //✅ 재호출 한 register함수 제거
navigate("/login");
} else {
throw new Error("토큰이 응답에 포함되지 않았습니다.");
}
} catch (error) {
if (error.response) {
console.log("서버 응답 확인:", error.response.data);
} else {
console.log("요청 오류:", error.message);
}
}
};
이렇게 코드를 수정해놓고 확인하면~~~
요로코롬 회원가입이 잘 되는 걸 볼 수 있다!!👏👏
import AuthForm from "../components/AuthForm";
import { register } from "../api/auth";
import { Link, useNavigate } from "react-router-dom";
const Signup = () => {
const navigate = useNavigate();
const handleSignup = async (formData) => {
console.log("전송된 formData 확인용!!!!! ====>", formData);
try {
const response = await register({
id: formData.userId,
password: formData.password,
nickname: formData.nickname,
});
console.log("회원가입 응답:", response);
if (response.success) {
navigate("/login");
} else {
throw new Error("토큰이 응답에 포함되지 않았습니다.");
}
} catch (error) {
if (error.response) {
console.log("서버 응답 확인:", error.response.data);
} else {
console.log("요청 오류:", error.message);
}
}
};
return (
<div>
<div>
<h1>회원가입</h1>
<AuthForm mode="signup" onSubmit={handleSignup} />
<div>
<p>
이미 계정이 있으신가요? <Link to="/login">로그인</Link>
</p>
</div>
</div>
</div>
);
};
export default Signup;
이번 과제를 하면서 회원가입, 로그인 부분을 구현하는데 시간도 많이 들었고 이해 안 되는 에러를 잔뜩 만났다.
또 작성하겠지만 로그인 구현할 때 정말 많은 에러창을 단계별로 만났는데ㅋㅋㅋㅋ 데이터를 받아올 때 이 받아온 값이 어디에서 오는거고 어떤 값을 받아오는지 꼭 콘솔창을 전부 펼쳐서 확인해야겠다는 생각이 들었다..!!!