본문 바로가기

JavaScript/Express.js

[Express.js] User CRUD 구현 (sequelize)

1. 구현할 기능 정의

기능 Method Url
회원가입 POST /user/register
로그인 POST /user/login
회원 정보 조회 (전체) GET /user
회원 정보 조회 (단일) GET /user/:id
회원 정보 수정 PUT /user/:id
삭제 DELETE /user/:id

 

 

2. Router 세팅

      - user에 관한 기능들은 기본적으로 URL을 /user 로 분기처리

  •      userRoute 구현
// routes/user.js

const express = require("express");
const User = require("../models/user");

const router = express.Router();

// ** 회원가입
// POST /user/register
router.post("/register", async (req, res) => {});

// ** 로그인
// POST /user/login
router.post("/register", async (req, res) => {});

// ** 전체 회원 정보 조회
// GET /user
router.get("/", async (req, res) => {});

// ** 단일 회원 정보 조회
// GET /user/:id
router.get("/:id", async (req, res) => {});

// ** 회원 수정
// PUT /user/:id
router.put("/:id", async (req, res) => {});

// ** 회원 삭제
// DELETE /user/:id
router.delete("/:id", async (req, res) => {});

module.exports = router;

 

  • app.js
     - express.urlencoded
         : url (query string)을 통해 데이터를 받을 수 있도록 하는 미들웨어

     - express.json
         : http 요청의 body를 json형태로 받을 수 있도록 하는 미들웨어

     - userRouter 연결
// app.js

const express = require("express");
const { sequelize } = require("./models");

const userRouter = require("./routes/user");

const app = express();

app.set("port", 3000);

// 요청시 데이터를 받기위한 미들웨어
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

// user 라우터 연결
app.use("/user", userRouter);

sequelize
  .sync({ force: false })
  .then(() => {
    console.log("DB 연결 성공");
  })
  .catch((err) => {
    console.log(err);
  });

app.listen(app.get("port"), () => {
  console.log(`Server On Port ${app.get("port")}`);
});

 

3. User Service 구현

  • 회원가입
     - POST /user/resiger 으로 요청이 온 경우
         → Http Body에 담겨온 정보들을 통해 User 객체를 생성하여 DB에 저장한다.
// routes/user.js

// ** 회원가입
// POST /user/register
router.post("/register", async (req, res) => {
  try {
    // ** Http Body에 담겨온 정보는 req.body에 담겨있다.
    const user = await User.create({
      name: req.body.name,
      username: req.body.username,
      password: req.body.password,
    });
    
    // ** Http Response
    // statusCode를 200으로 설정	/ json함수를 통해 Response Body에 데이터를 담아 응답
    res.status(200).json({ code: 200, message: "회원가입에 성공했습니다." });
    
  } catch (error) {
    console.log(error);
    
    // ** Http Response
    // statusCode를 500으로 설정	/ json함수를 통해 Response Body에 데이터를 담아 응답
    res
      .status(500)
      .json({ code: 500, message: "Internal Server Error", error });
      
  }
});

 

  • 로그인
     - POST /user/login 으로 요청이 온 경우
         → DB에서 id(username)기준으로 조회 후 password를 비교한다.
// routes/user.js

// ** 로그인
// POST /user/login
router.post("/login", async (req, res) => {
  try {
    // ** 입력된 id(username)로 회원정보 검색
    const findUserByUsername = await User.findOne({
      where: { username: req.body.username },
    });

    // ** 회원정보가 존재하지 않는 경우
    if (!findUserByUsername) {
      res
        .status(404)
        .json({ code: 404, message: "회원정보을 찾을 수 없습니다." });
      return;
    }

    // ** 비밀번호가 잘못된 경우
    if (findUserByUsername.password != req.body.password) {
      res.status(404).json({ code: 400, message: "비밀번호가 다릅니다." });
      return;
    }

    // ** 로그인 성공
    res.status(200).json({ code: 200, message: "로그인에 성공했습니다." });
  } catch (error) {
    console.log(error);
    res
      .status(500)
      .json({ code: 500, message: "Internal Server Error", error });
  }
});

 

  • 회원 정보 조회 (전체)
// ** 전체 회원 정보 조회
// GET /user
router.get("/", async (req, res) => {
  try {
    // ** 전체 유저 조회
    const user = await User.findAll();

    // ** 조회 데이터 response
    res
      .status(200)
      .json({ code: 200, message: "전체 유저 정보를 조회합니다.", data: user });
  } catch (error) {
    console.log(error);
    res
      .status(500)
      .json({ code: 500, message: "Internal Server Error", error });
  }
});

 

  • 회원 정보 조회 (단일)
     - URL에서 id값을 가져와 단일 조회후 응답
// ** 단일 회원 정보 조회
// GET /user/:id
router.get("/:id", async (req, res) => {
  try {
    // ** URL에서 id 가져오기
    const id = req.params.id;

    // ** id로 해당 user 조회
    const findUser = await User.findOne({ where: { id } });

    // ** user가 존재하지 않는 경우 예외처리
    if (!findUser) {
      res
        .status(404)
        .json({ code: 404, message: "회원 정보를 찾을 수 없습니다." });
      return;
    }

    // ** user 정보 응답
    res
      .status(200)
      .json({ code: 200, message: "회원 정보를 조회합니다.", data: findUser });
  } catch (error) {
    console.log(error);
    res
      .status(500)
      .json({ code: 500, message: "Internal Server Error", error });
  }
});

 

  • 회원 정보 수정
// ** 회원 수정
// PUT /user/:id
router.put("/:id", async (req, res) => {
  try {
  
    // ** 회원 정보 조회
    const id = req.params.id;

    const findUser = await User.findOne({ where: { id } });

    if (!findUser) {
      res
        .status(404)
        .json({ code: 404, message: "회원 정보를 찾을 수 없습니다." });
      return;
    }

    // ** 회원이 존재하는 경우 수정 진행
    await User.update(
      // 수정하고자 하는 부분
      {
        name: req.body.name,
        username: req.body.username,
        password: req.body.password,
      },
      // where 절
      { where: { id } }
    );

    res.status(200).json({ code: 200, message: "회원 정보를 수정합니다." });
  } catch (error) {
    console.log(error);
    res
      .status(500)
      .json({ code: 500, message: "Internal Server Error", error });
  }
});

 

  • 회원 정보 삭제
// ** 회원 삭제
// DELETE /user/:id
router.delete("/:id", async (req, res) => {
  try {
    // ** 회원 정보 확인
    const id = req.params.id;

    const findUser = await User.findOne({ where: { id } });

    if (!findUser) {
      res
        .status(404)
        .json({ code: 404, message: "회원 정보를 찾을 수 없습니다." });
      return;
    }

    // ** 회원 정보가 존재하는 경우 삭제 진행
    await User.destroy({ where: { id } });

    res.status(200).json({ code: 200, message: "회원 정보를 삭제합니다." });
  } catch (error) {
    console.log(error);
    res
      .status(500)
      .json({ code: 500, message: "Internal Server Error", error });
  }
});

4. API 테스트

     - Postman을 사용하여 테스트
     - 해당 글에서는 성공 부분만 테스트 하지만 예외 처리한 부분들도 테스트 해보시길 바랍니다.

  • 회원가입

 

  • 로그인

 

  • 전체 회원 조회

 

  • 단일 회원 조회

 

  • 회원 정보 수정

 

  • 회원 정보 삭제

 

 

github: https://github.com/DongyangOne/one-node-study/tree/master/basic_user_service