NodeJs

[Node JS] 회원가입 기능 구현(2)

dbsxo4083 2024. 7. 25. 15:23

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