2024.07.24 - [NodeJs] - Node js 회원가입 기능 구현(1)
Node js 회원가입 기능 구현(1)
npm i express npm i mysql2 필요한 모듈들을 npm i로 install 해주었습니다.const express = require('express');const mysql = require('mysql2/promise');const app = express();app.use(express.json())app.use(express.urlencoded({extended:false}))con
dbsxo4083.tistory.com
폴더 구조 및 설명은 이전 포스팅을 참고하여 주시기 바랍니다.
model/user.js
//회원가입
exports.insertUser = async(data) => {
const conn = await dbConnection()
try {
const query = "INSERT INTO user (id, name, email, phoneNumber, password) VALUES(?,?,?,?,?)"
const values = [data.id, data.name, data.email, data.phoneNumber, data.password]
await conn.execute(query,values)
}catch(error){
console.error(error.message)
conn.end()
return false
} finally{
conn.end()
console.log('MySQL Disconnected')
return false
}
}
//아이디 중복확인
exports.checkUserIdExists = async (id) => {
const conn = await dbConnection();
try {
const query = "SELECT COUNT(*) AS count FROM user WHERE id = ?";
const [rows] = await conn.execute(query, [id]);
return rows[0].count > 0;
} catch (error) {
console.error('Error checking ID existence:', error.message);
throw error;
} finally {
await conn.end();
}
};
// 이메일 중복 확인
exports.checkEmailExists = async (email) => {
let conn;
try {
conn = await dbConnection();
const query = 'SELECT COUNT(*) AS count FROM user WHERE email = ?';
const [rows] = await conn.execute(query, [email]);
return rows[0].count > 0;
} catch (error) {
console.error('Error checking email existence:', error.message);
throw error;
} finally {
if (conn) {
await conn.end();
}
}
};
미리 설계해둔 user테이블에 회원가입시 데이터베이스에 들어갈 sql쿼리를 짜줍니다. 회원가입시 필요한 아이디 중복확인 과 이메일 중복확인 함수까지 같이 짜주었습니다.
해당 기능 구현에서는 try,catch문을 사용한 오류 처리 / async,await문을 사용한 비동기 처리가 핵심입니다. 두 내용에 대해 자세한 설명은 따로 다루도록 하겠습니다.
🔎코드 설명
const conn = await dbConnection() // 데이터베이스에 연결하는 함수 async await를 사용하여 비동기 처리를 진행
const query = "INSERT INTO user (id, name, email, phoneNumber, password) VALUES(?,?,?,?,?)" // sql구문으로 클라이언트에서 받아온 매개변수로 user 테이블에 새로운 값을 생성
const values = [data.id, data.name, data.email, data.phoneNumber, data.password]
await conn.execute(query,values) // values라는 배열에 값들을 담아주고 execute를 사용하여 쿼리 실행
conn.end() // 데이터베이스 연결을 해제하는 함수
return rows[0].count > 0; // 리턴값을 row의 배열의 0번째 인덱스의 count값으로 받는데 그 이유는
"SELECT COUNT(*) AS count FROM user WHERE id = ?"; 해당 쿼리문에서 값이 있으면 1을 리턴하고 값이 없으면 0을 리턴하기 때문입니다. 즉 리턴값이 1(true)라면 중복된 아이디가 있는 것이고 0(false)라면 중복된 아이디가 없는것입니다.
이메일중복확인, 아이디 중복확인이 모두 이와 같은 로직으로 작성하였습니다.
service/userService.js
const userModel = require('../model/user')
exports.registerUser = async (userData) => {
try{
// 이메일 형식 확인
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(userData.email)) {
return {error_message: 'Invalid email format'}
}
// 아이디 중복 확인
const idExists = await userModel.checkUserIdExists(userData.id);
if (idExists) {
return {error_message: 'User ID exists'}
}
// 이메일 중복 확인
const emailExists = await userModel.checkEmailExists(userData.email);
if (emailExists) {
return {error_message: 'Email already in use'}
}
//전화번호 형식 확인
const phoneNumberRegex = /^\d{10,15}$/;
if (!phoneNumberRegex.test(userData.phoneNumber)) {
return {error_message: 'Invalid phone number format'}
}
// if(!userData.password){
// return false
// // throw new Error('Password must be at least 6 characters long');
// }
await userModel.insertUser(userData);
return { success:true , data: userData };
} catch(error){
console.error('Error registering user:', error.message);
return { success: false, error: error.message };
}
}
userService는 비즈니스 로직을 처리하고 모델을 호출합니다
🔎코드 설명
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
const phoneNumberRegex = /^\d{10,15}$/; // 정규 표현식을 이용한 이메일,전화번호 형식 확인
const idExists = await userModel.checkUserIdExists(userData.id);
const emailExists = await userModel.checkEmailExists(userData.email);
//userModel에서 정의한 함수들을 각각 변수에 담아서 실행하고 그 결과 값에 따라 다른 로직이 실행되도록 처리
controller/userController.js
exports.register = async (req, res) => {
const userData = req.body;
try {
const result = await userService.registerUser(userData);
console.log(result)
if (result.success) {
res.status(200).json({
status: 200,
success: true,
data: result.data
})
}
//이메일 형식 오류
if (result.error_message === "Invalid email format"){
res.status(400).json({
status: 400,
success: false,
message: result.error_message
})
}
//아이디 중복
if (result.error_message === "User ID exists"){
res.status(400).json({
status: 400,
success: false,
message: result.error_message
})
}
//이메일 중복
if (result.error_message === "Email already in use"){
res.status(400).json({
status: 400,
success: false,
message: result.error_message
})
}
} catch (error) {
res.status(500).json({ error: 'Internal server error' });
}
};
userController는 요청 데이터를 받아서 서비스를 호출합니다
🔎코드 설명
const result = await userService.login(id,password) // userService에서 실행시킨 값들을 result 라는 변수에 담은 후 최종적으로 클라이언트에게 응답데이터를 전송함
result값에 담긴 message에 따라 클라이언트에게 각각 다른 응답 데이터를 전송함.
routes/userRoutes.js
const express = require('express')
const router = express.Router()
const userController = require('../controller/userController')
router.post('/auth',userController.register)
module.exports = router;
index.js
const express = require('express');
const mysql = require('mysql2/promise');
const userRoute = require('./routes/userRoutes')
// const cors = require('cors');
const app = express();
app.use(express.json())
app.use(express.urlencoded({extended:false}))
app.use('/user',userRoute)
const port = 3000;
app.get('/', (req, res) => {
res.send('Server Open!');
});
app.listen(port, () => {
console.log('server on');
});
'NodeJs' 카테고리의 다른 글
| [Node JS] JWT 토큰 인증 구현 (0) | 2024.07.25 |
|---|---|
| [Node JS] JWT토큰 구현하기 (0) | 2024.07.25 |
| [Node JS] 아이디 찾기 기능 구현 (0) | 2024.07.25 |
| [Node JS] 로그인 기능 구현 (0) | 2024.07.25 |
| [Node JS] 회원가입 기능 구현(1) (1) | 2024.07.24 |