지난 포스팅에서 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를 생성합니다.
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으로 변경해주시고
name, email, password를 json 형식으로 작성하여 post 해주면
다음과 같이 응답으로 Success 가 오는 것을 확인할 수 있습니다.
이제 mongoDB에 가서 저희가 요청한 user 정보가 잘 저장됐는지 확인해보겠습니다. 위와 같이 성공적으로 저장된 것을 볼 수 있습니다.