2024. 12. 3. 14:49ㆍ프로젝트
우선 프론트 코드를 보기전에 설계부터 알아보겠습니다. 우선 상태관리를 해주기 위해 리코일을 이용하여 state폴더안에
이런식으로 나눠서 관리를 해주기로 하였습니다.
https://codingbasics.tistory.com/314
리코일이란
1. Atom의 본질Recoil의 핵심은 Atom입니다. Atom은 Recoil 상태 관리 시스템에서 가장 기본적인 단위로, React 애플리케이션 내에서 전역 상태를 관리하는 컨테이너 역할을 합니다.Atom의 특징초기값:Atom
codingbasics.tistory.com
지금 회원가입을 하기 위해서는 userAtoms.jsx 파일을 보면
import { atom } from "recoil";
export const authState = atom({
key: "authState",
default: {
isAuthenticated: false,
isLoading: false,
showAuthModal: false,
userId: null,
username: "",
email: "",
full_name: "",
},
});
이런식으로 상태값들을 한곳에 저장해서 사용할 수 있습니다.
인증 코드 전송
React에서는 사용자가 입력한 전화번호를 서버로 전송하여 인증 코드를 요청합니다.
const sendVerificationCode = async () => {
const cleanedPhoneNumber = registerData.phone_number.replace(/-/g, ""); // 하이픈 제거
try {
const response = await fetch(
"https://maketerbackend.fly.dev/api/v1/send-verification-code",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ phone_number: cleanedPhoneNumber }),
}
);
const parseRes = await response.json();
if (parseRes.resultCode === "S-1") {
setGeneratedCode(parseRes.verificationCode); // 인증 코드 저장
setIsCodeSent(true); // 전송 상태 업데이트
toast.success("인증코드가 발송되었습니다.");
} else {
toast.error("인증코드 발송 실패.");
}
} catch (error) {
toast.error("서버 오류 발생: " + error.message);
}
};
주요 포인트
- 사용자가 입력한 전화번호(registerData.phone_number)를 POST 요청으로 서버에 전송합니다.
- 서버 응답에 따라 인증 코드 전송 성공 여부를 사용자에게 알립니다.
서버 백엔드의 여기부분에서 api를 통해 요청을 했다고 볼 수 있습니다.
const sendVerificationCode = async (req, res) => {
const { phone_number } = req.body;
// 6자리 인증코드 생성
const verificationCode = Math.floor(
100000 + Math.random() * 900000
).toString();
try {
const response = await messageService.send({
to: phone_number,
from: "010-2848-5397",
text: `인증코드: ${verificationCode}`,
});
if (response.error_list && response.error_list.length > 0) {
return res.status(500).json({
resultCode: "F-2",
msg: "SMS 전송 중 에러가 발생했습니다.",
});
}
return res.status(200).json({
resultCode: "S-1",
msg: "인증코드가 성공적으로 전송되었습니다.",
verificationCode, // 개발용으로 인증코드 반환
});
} catch (error) {
return res.status(500).json({
resultCode: "F-1",
msg: "서버 에러 발생",
});
}
};
app.post("/api/v1/send-verification-code", userCtrl.sendVerificationCode);
인증 코드 검증
React에서는 사용자가 입력한 인증 코드를 서버로 전송해 검증 요청을 보냅니다.
const verifyCode = async () => {
try {
const response = await fetch(
"https://maketerbackend.fly.dev/api/v1/verify-code",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
verificationCode: generatedCode, // 서버에서 받은 인증 코드
inputCode: verificationCode, // 사용자가 입력한 인증 코드
}),
}
);
const parseRes = await response.json();
if (parseRes.resultCode === "S-1") {
setIsVerified(true); // 인증 성공 상태 업데이트
toast.success("인증 성공!");
} else {
toast.error("인증코드가 일치하지 않습니다.");
}
} catch (error) {
toast.error("서버 오류 발생: " + error.message);
}
};
주요 포인트
- 서버에서 제공한 generatedCode와 사용자가 입력한 verificationCode를 함께 서버로 전송.
- 성공 시 인증 상태를 업데이트하고 사용자에게 성공 메시지를 표시.
백엔드서버의 여기부분을 통해서 요청을 받아왔습니다.
const verifyCode = (req, res) => {
const { verificationCode, inputCode } = req.body;
if (verificationCode !== inputCode) {
return res.status(400).json({
resultCode: "F-1",
msg: "인증코드가 일치하지 않습니다.",
});
}
return res.status(200).json({
resultCode: "S-1",
msg: "인증이 완료되었습니다.",
});
};
회원가입 프로세스
React는 사용자 정보를 서버에 전송하여 회원가입 요청을 보냅니다.
const handleSubmit = async (e) => {
e.preventDefault();
const cleanedPhoneNumber = registerData.phone_number.replace(/-/g, "");
const data = {
...registerData,
phone_number: cleanedPhoneNumber,
};
const response = await fetch(
"https://maketerbackend.fly.dev/api/v1/register",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
}
);
const parseRes = await response.json();
if (parseRes.resultCode === "S-1") {
toast.success("회원가입 성공!");
setIsLogin(true); // 회원가입 후 로그인 모드로 전환
} else {
toast.error(parseRes.msg);
}
};
주요 포인트
- 전화번호 인증 성공 후, 회원가입 데이터를 서버에 POST 요청.
- 서버 응답에 따라 회원가입 성공 또는 실패를 사용자에게 알림.
마찬가지의 백엔드의 여기부분을 통해서 요청을 받아왔습니다.
const register = async (req, res) => {
try {
const { username, password, email, full_name, phone_number } = req.body;
const hashedPassword = await bcrypt.hash(password, 10); // 비밀번호 해싱
const { rows } = await pool.query(
`INSERT INTO users (username, password, email, full_name, phone_number)
VALUES ($1, $2, $3, $4, $5)
RETURNING id, username, email, full_name, phone_number, created_at`,
[username, hashedPassword, email, full_name, phone_number]
);
res.status(201).json({
resultCode: "S-1",
msg: "사용자 등록 성공",
data: rows[0],
});
} catch (error) {
res.status(500).json({
resultCode: "F-1",
msg: "서버 에러 발생",
});
}
};
https://codingbasics.tistory.com/313
캡스톤 디자인 프로젝트 -맛집 정보 사이트 만들기- (4) 백엔드 로그인 기능
우선 로그인 기능을 이용해서 접근 제어를 할 수있는 방법은 세션 기능과 JWT토큰을 이용하는 방법들이 있습니다. 1. 세션 기반 인증이란?작동 방식사용자가 로그인하면 서버는 세션을 생
codingbasics.tistory.com
백엔드 부분은 여기를 참고하시면 됩니다.
'프로젝트' 카테고리의 다른 글
개인정보-컴플라이언스-웹애플리케이션(1) - 피그마를 통한 전체 흐름 및 디자인 (1) | 2025.01.02 |
---|---|
캡스톤 디자인 프로젝트 -맛집 정보 사이트 만들기- (5) 프론트 회원 기능 (4) | 2024.12.09 |
캡스톤 디자인 프로젝트 -맛집 정보 사이트 만들기- (4) 백엔드 회원 기능 (0) | 2024.12.03 |
캡스톤 디자인 프로젝트 -맛집 정보 사이트 만들기- (3) 데이터 베이스 및 Postgresql (2) | 2024.12.02 |
캡스톤 디자인 프로젝트 -맛집 정보 사이트 만들기- (2) (2) | 2024.12.02 |