[Node.js, MongoDB] 회원가입 기능 구현하기

router, schema

Posted by dongjune on December 14, 2020

지난 포스팅에서 nodejs 앱에 mongoDB를 연결해봤습니다.

이번에는 mongoDB에 회원 정보를 저장하여 회원가입 기능을 구현해보겠습니다.

Schema와 Model 생성

일단 mongoDB에 user 정보를 저장하기 위해서는 Schema 를 생성해야 합니다.

Schema는 간단히 말해 data에 대한 틀입니다. 예를 들어 user 정보에 이름, 이메일, 비밀번호를 저장할지 아니면 이메일과 비밀번호만 저장할지를 정하는 것입니다.

Schema를 만들고 그 Schema의 형태를 갖는 data들을 저장하는 model을 만들어줘야 합니다.

model은 data를 구분해주는 역할을 합니다. 예를 들어 저는 user 정보user가 쓴 글에 대한 정보를 한 곳에 모아놓고 싶지 않습니다. 그래서 user 정보를 저장하는 users model과 post 정보를 저장하는 posts model로 나눌 수 있습니다.

저는 루트 디렉토리에 models 폴더를 만들고 그 안에 User.js 를 만들어주겠습니다.

그리고 다음의 코드를 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const mongoose = require("mongoose"); // mongoose 불러오기

// Schema 생성
const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
});

// model을 export 해주기
module.exports = User = mongoose.model("user", UserSchema);

mongoose.Schema 로 Schema 를 생성해주고

마지막 줄에서 mongoose.model로 model을 생성하여 export 해줬습니다.

router 생성하기

이제 register route를 만들어보겠습니다.

server.js 에 모든 route 들을 넣으면 코드가 굉장히 지저분해지기 때문에 디렉토리를 나눠주겠습니다.

저는 루트 디렉토리에 routes 폴더를 생성하고 그 안에 api 폴더를 만들어줬습니다. api 폴더 안에 register.js를 생성합니다. 스크린샷 2020-12-14 오후 5 03 35

register.js 를 작성하기 전에 먼저 req의 body 정보를 읽을 수 있도록 설정을 해줘야 합니다. server.js 에 다음의 코드를 추가해주면 끝입니다.

server.js

1
2
// allow us to get the data in request.body
app.use(express.json({ extended: false })); 

그리고 다음의 코드를 작성합니다. 주석에 code에 대한 설명이 있습니다.

register.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const express = require("express"); 
const User = require("../../models/User"); // User model 불러오기
const router = express.Router();           // express의 Router 사용
const bcrypt = require("bcryptjs");        // 암호화 모듈

// @route  POST api/register
// @desc   Register user
// @access Public
router.post(
  "/",
  async (req, res) => {
    // req의 body 정보를 사용하려면 server.js에서 따로 설정을 해줘야함
    const { name, email, password } = req.body;

    try {
      // email을 비교하여 user가 이미 존재하는지 확인
      let user = await User.findOne({ email });
			if (user) {
        return res
          .status(400)
          .json({ errors: [{ msg: "User already exists" }] });
      }
			
      // user에 name, email, password 값 할당
      user = new User({
        name,
        email,
        password,
      });

      // password를 암호화 하기
      const salt = await bcrypt.genSalt(10);
      user.password = await bcrypt.hash(password, salt);

      await user.save(); // db에 user 저장

      res.send("Success");
    } catch (error) {
      console.error(error.message);
      res.status(500).send("Server Error");
    }
  }
);

module.exports = router; // export

bcrpyt를 사용하여, 암호화한 비밀번호를 db에 저장해줬습니다.

이제 server.js에서 방금 작성한 router를 연결해줍니다. 다음의 코드를 server.js에 추가합니다.

1
2
// Define Routes
app.use("/api/register", require("./routes/api/register"));

저는 5000번 포트에 server를 연결했기 때문에 “/api/register” 만 작성해주면 http://localhost:5000/api/register 로 요청하게 됩니다. require 안에는 router의 디렉토리 주소를 넣어주면 됩니다.

Postman으로 요청 해보기

postman 은 api를 쉽게 테스트 할 수 있게 해주는 툴입니다. postman 에서 저희가 설정한 api 주소인 http://localhost:5000/api/register 를 입력합니다.

Headers 에서 Content type을 json으로 변경해주시고 스크린샷 2020-12-14 오후 5 40 50

name, email, password를 json 형식으로 작성하여 post 해주면 스크린샷 2020-12-14 오후 5 41 00

다음과 같이 응답으로 Success 가 오는 것을 확인할 수 있습니다. 스크린샷 2020-12-14 오후 5 41 08

이제 mongoDB에 가서 저희가 요청한 user 정보가 잘 저장됐는지 확인해보겠습니다. 스크린샷 2020-12-14 오후 5 42 43 위와 같이 성공적으로 저장된 것을 볼 수 있습니다.