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
'JavaScript > Express.js' 카테고리의 다른 글
[Express.js] 테이블간 관계 정의 (User - Board) (0) | 2024.01.31 |
---|---|
[Express.js] Database 연결하기 (Mysql, Sequelize) (0) | 2024.01.30 |
[Express.js] Router 세팅 (0) | 2024.01.30 |
[Express.js] 프로젝트 세팅 (2) (0) | 2024.01.29 |
[Express.js] 프로젝트 세팅 (1) (0) | 2024.01.28 |