1. 설계
mongoDB는 다른 관계형 DB처럼 스키마 설계가 필요없기 때문에 프론트엔드 개발자에게 딱이였다.
mongoDB는 매우 유연하게 스키마 수정이 가능하고 스키마 디자인시 고려하는 디자인 방식은 Embedding과 Referencing이 있지만 나는 단순히 key-value 형태이기 때문에 위의 디자인 방식조차도 복잡하게 느껴졌다.
그래서 단순하게 One-to-One, 즉 key-value로 모델링 했다.
{
"_id": "ObjectId('mdkalsfmk2')",
"name": "marais",
"email": "marais@gmail.com",
"password": "maraispw",
}
위와 같은 User document가 있을 때, name 이나 email 와 같이 하나만 존재하는 값이 1:1 관계인 것을 볼 수 있다.
2. Endpoint 설정
먼저 user API에 사용될 Method와 URI를 설정해야하는데, 이때 Restful한 API로 만들어야한다.
GET /users
: 모든 유저정보를 불러온다.POST /user
: 회원가입 API로, name, email, password를 받아 user 데이터를 추가한다.GET /user/{id}
: 로그인한 회원 정보를 가져오는 API이다.PATCH /user/{id}
: 유저 정보를 수정하는 API이다. (name, email, password)DELETE /user/{id}
: 유저를 삭제하는 API이다.GET /user/todos/{id}
: 유저가 쓴 todolist를 가져오는 api이다. -> 이부분은 todo api를 담당한 팀원과 상의가 필요할 것 같다.
3. /routes/userRoutes.js 생성 및 api 코드 작성
전체 코드
import express from 'express';
import UserModel from '../model/UserModal.js';
const router = express.Router();
router.get('/', async (req, res) => {
try {
await UserModel.find()
.then((userData) => {
res.status(201).json({ users: userData });
})
.catch((err) => {
console.log(err);
res.status(500).json({
msg: '유저 정보를 불러오는데 실패하였습니다.',
});
});
} catch (err) {
res.status(500).json({ msg: '유저 정보를 불러오는데 실패하였습니다.' });
}
});
router.get('/:id', async (req, res) => {
try {
const id = req.params.id;
if (id) {
await UserModel.findById(id)
.then((userInfo) => {
console.log(userInfo);
res.status(201).json({ user: userInfo });
})
.catch((err) => {
console.log(err);
res.status(500).json({
msg: '해당 유저 정보를 불러오는데 실패하였습니다.',
});
});
}
} catch (err) {
res.status(500).json({
msg: '해당 유저 정보를 불러오는데 실패하였습니다.',
});
}
});
router.post('/', async (req, res) => {
try {
const newUser = new UserModel(req.body);
await newUser
.save()
.then((savedUser) => {
res.status(201).json({ msg: '회원가입이 완료되었습니다.' });
})
.catch((err) => {
if (
err.code === 11000 &&
err.keyPattern &&
err.keyPattern.email
) {
res.status(500).json({
msg: '이미 사용중인 이메일입니다.',
});
}
res.status(500).json({ msg: '회원가입에 실패하였습니다.' });
});
} catch (err) {
res.status(500).json({ msg: '새 유저를 저장하는데 실패하였습니다.' });
}
});
router.put('/:id', async (req, res) => {
try {
const id = req.params.id;
if (id) {
const updatedUser = req.body;
await UserModel.findOneAndUpdate({ _id: id }, updatedUser, {
new: true,
})
.then((updatedUser) => {
console.log(updatedUser);
res.status(201).json({
msg: '유저 정보가 업데이트 되었습니다.',
user: updatedUser,
});
})
.catch((err) => {
console.log(err);
res.status(500).json({
msg: '유저 정보를 업데이트하는데 실패하였습니다.',
});
});
}
} catch (err) {
console.log(err);
res.status(500).json({
msg: '유저 정보를 업데이트하는데 실패하였습니다.',
});
}
});
router.delete('/:id', async (req, res) => {
try {
const id = req.params.id;
if (id) {
await UserModel.findByIdAndDelete(id)
.then((deletedUser) => {
console.log(deletedUser);
res.status(201).json({
msg: '유저 정보가 삭제되었습니다.',
});
})
.catch((err) => {
console.log(err);
res.status(500).json({
msg: '유저 정보를 삭제하는데 실패하였습니다.',
});
});
}
} catch (err) {
console.log(err);
res.status(500).json({
msg: '유저 정보를 삭제하는데 실패하였습니다.',
});
}
});
export default router;
4. Postman을 이용해서 테스트
계속 회원가입에 실패 했다고 뜨길래 챗지피티에게 물어보니 Express에서 JSON 요청 본문을 올바르게 파싱하고 있는지 확인해야했다.
/index.js
import express from 'express';
import mongoose from 'mongoose';
import dotenv from 'dotenv';
import userRoutes from './routes/userRoutes.js';
const app = express();
dotenv.config();
const PORT = process.env.PORT || 7000;
const MONGOURL = process.env.MONGO_URI;
app.use(express.json()); // 이 코드가 들어가야 json으로 보낸 request를 읽을 수 있다.
mongoose
.connect(MONGOURL)
.then(() => {
console.log('DB is connected Successfully.');
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
})
.catch((err) => console.log(err));
// user
app.use('/user', userRoutes);
postman으로 추가 한 뒤, MongoDB를 가보니 아주 잘 들어가 있는 것을 확인할 수 있었다. 😃 (풀스텍갈수있나,,?)
또한, 기존의 있는 email로 회원가입 시 아래와 같은 에러가 발생한다.
error 코드가 11000이라는 것을 알 수 있다. 그래서 이런 식으로 에러처리 코드를 추가했다. 프론트엔드를 하면서 느낀 점은 이렇게 친절한 에러 메세지를 보내주면 어느부분이 문제인지 금방 알 수 있어서 삽질을 안해도 된다.
if (err.code === 11000 && err.keyPattern && err.keyPattern.email) {
res.status(500).json({msg: '이미 사용 중인 이메일입니다.'})}
백엔드 코드를 공부해보면서 유튜브 하나를 보았는데 거기서 마지막에 이런 이야기를 해주셨다.
"실행하게 하는 코드는 몇 줄 안된다. 하지만 그 에러처리를 하는 코드는 더 길게 신경써서 작성해야한다. "
예전에 한번 해봤던 기술들이고 익숙한 js문법들이라 생각보다 크게 어렵지는 않았던 것 같다. 재밌게 작업을 마쳤다.
'co-task 프로젝트' 카테고리의 다른 글
[#6] Server 셋팅하기 | Express.js, MongoDB, and Mongoose (1) | 2024.05.15 |
---|---|
[#5] Atomic Design Pattern 적용하기 (1) | 2024.04.30 |
[#4] 프론트엔드 개발자가 만드는 Figma 디자인 | 깔끔한 todoList UI (0) | 2024.04.30 |
[#3] Co-Task 프로젝트 셋팅 | Package Manager(yarn berry), Development Environment(Eslint, Prettier, husky) (1) | 2024.04.22 |