
















- 필수 모듈 및 라이브러리 불러오기
"use client";
import Breadcrumb from "@/components/Common/Breadcrumb";
import Link from "next/link";
import React, { useState } from "react";
import axios from "axios";
- 상태 관리 (Form Data 저장)
const [formData, setFormData] = useState({
name: "",
email: "",
password: "",
retypePassword: "",
});
- 입력 값 변경 핸들러
const handleChange = (e) => {
const { name, value } = e.target;
setFormData({
...formData,
[name]: value,
});
};
handleChange 없이 폼을 작성하면 다음과 같은 상황이 발생할 수 있습니다
사용자: 이름에 "John"을 입력했지만, 서버로 전송된 데이터는 빈 문자열("")일 수 있습니다.
이유: formData 상태가 업데이트되지 않았기 때문입니다.
- 폼 제출 핸들러 (회원가입 요청)
const handleSubmit = async (e) => {
e.preventDefault();
if (formData.password !== formData.retypePassword) {
alert("Passwords do not match!");
return;
}
try {
const response = await axios.post("http://localhost:8080/user/signup", {
email: formData.email,
userName: formData.name,
password: formData.password,
});
console.log("Signup successful:", response.data);
alert("Account created successfully!");
setFormData({
name: "",
email: "",
password: "",
retypePassword: "",
});
} catch (error) {
console.error("Signup failed:", error.response?.data || error.message);
alert("Signup failed. Please try again.");
}
};
Breadcrumb (페이지 상단 경로 표시)
<Breadcrumb title={"Signup"} pages={["Signup"]} />
회원가입 폼 UI
<section className="overflow-hidden py-20 bg-gray-2">
<div className="max-w-[1170px] w-full mx-auto px-4 sm:px-8 xl:px-0">
<div className="max-w-[570px] w-full mx-auto rounded-xl bg-white shadow-1 p-4 sm:p-7.5 xl:p-11">
소셜 로그인 버튼
<button className="flex justify-center items-center gap-3.5 rounded-lg border border-gray-3 bg-gray-1 p-3 ease-out duration-200 hover:bg-gray-2">
<svg ... /> Sign Up with Google
</button>
<button className="flex justify-center items-center gap-3.5 rounded-lg border border-gray-3 bg-gray-1 p-3 ease-out duration-200 hover:bg-gray-2">
<svg ... /> Sign Up with Github
</button>
입력 필드 (이름, 이메일, 비밀번호, 비밀번호 재입력)
<input
type="text"
name="name"
placeholder="Enter your full name"
value={formData.name}
onChange={handleChange}
className="rounded-lg border border-gray-3 bg-gray-1 placeholder:text-dark-5 w-full py-3 px-5 outline-none duration-200 focus:border-transparent focus:shadow-input focus:ring-2 focus:ring-blue/20"
/>
회원가입 버튼
<button
type="submit"
className="w-full flex justify-center font-medium text-white bg-dark py-3 px-6 rounded-lg ease-out duration-200 hover:bg-blue mt-7.5"
>
Create Account
</button>
로그인 페이지로 이동 링크
<p className="text-center mt-6">
Already have an account?
<Link href="/signin" className="text-dark ease-out duration-200 hover:text-blue pl-2">
Sign in Now
</Link>
</p>



