이제 app.js 파일에 Members 테이블의 데이터를 가져오고
GET, POST, PUT, DELETE 리퀘스트를 수정하는 작업을 해야 한다.
// app.js
const express = require('express');
const app = express();
/////// Members 테이블 데이터 가져오기 ///////
const db = require('./models/index.js');
const { Member } = db;
app.use(express.json());
. . .
📌 findAll( )
- 여러 개의 row를 조회할 때 사용하는 메소드
- Members 테이블의 모든 row를 조회해서 가져온다.
- 조건을 설정할 때에는 { where: { . . . } }
. . .
////////////////////// 직원 정보 조회 [ 특정 팀 소속 | 전체 ] ///////////////////////
// [주의]
// 모델이 가진 대부분의 메소드들은 Promise객체를 리턴하는 비동기 실행함수이기 때문에 async await을 붙여야 한다!
app.get('/api/members', async (req, res) => {
const { team } = req.query;
if(team) {
//// 특정 팀에 속한 직원 정보를 조회하는 코드 ///
// const teamMembers = await Member.findAll({ where: {team: team} });
const teamMembers = await Member.findAll({ where: { team } });
res.send(teamMembers);
} else {
//// 전체 직원 정보를 조회하는 코드 ///
// await : 전체 직원정보를 다 가져올 때까지 기다림
const members = await Member.findAll();
res.send(members);
}
});
. . .
📌 findOne( )
- 하나의 row만을 조회하는 메소드
- 조건 객체에 해당하는 여러 row가 존재한다고 해도 그중에서 가장 첫 번째 row 하나만을 가져온다.
- 조건을 설정할 때에는 { where: { . . . } }
. . .
///////////////////////////////// 특정 직원 정보 조회 /////////////////////////////////
app.get('/api/members/:id', async (req, res) => {
const { id } = req.params;
// const member = await Member.findOne({ where: { id: id }});
const member = await Member.findOne({ where: { id }});
if (member) {
res.send(member);
} else {
res.status(404).send({ message : 'There is no such member!' });
}
});
. . .
///////////////////////////// 새로운 직원 정보 추가 //////////////////////////////
app.post('/api/members', async (req, res) => {
// 새로운 직원 정보
const newMember = req.body;
// build() : 하나의 멤버 모델 객체를 생성하고 리턴 --> 나중에 테이블에서 하나의 row가 될 존재
const member = Member.build(newMember);
// 테이블에 새로운 멤버 모델 객체에 대한 row 추가
// save역시 Promise 객체를 리턴하는 비동기 실행 함수이기 때문에 await과 async를 추가해야 함
await member.save();
res.send(newMember);
});
📌 update( )
- 수정할 직원의 새로운 정보, 수정할 row를 특정하기 위한 조건 객체
- Promise 객체를 리턴하는 비동기 실행 함수
- update 메소드가 리턴하는 Promise 객체에는 그 작업 성공 결과로 배열 하나가 들어있다.
- 이 배열의 첫 번째 요소에는 수정된 row가 리턴된다.
- ( 이 경우는 해당 id를 가진 특정 row를 수정하니까 한개를 의미하는 1이 있어야 함 /
테이블에 존재하지 않는 id값 이라면 갱신된 row는 없을 것이니 0이 있을 것이다. )
. . .
/////////////////////////// // 기존 직원 정보 수정 (1) //////////////////////////////
app.put('/api/members/:id', async (req, res) => {
const { id } = req.params;
const newInfo = req.body;
// const result = await Member.update(newInfo, { where: {id: id} });
const result = await Member.update(newInfo, { where: { id } });
if (result[0]) {
// 배열의 첫 번째 요소가 0이 아닐 경우
res.send({ message: `${result[0]} row(s) affected` });
} else {
// 배열의 첫 번째 요소가 0일 경우
res.status(404).send({ message : 'There is no such member with the id!' });
}
});
. . .
📌 findOne( )
- 해당 id값을 가진 있는 row를 가져옴
📌 save( )
- member 모델 객체와 연동되어있던 테이블의 row가 수정된다.
/////////////////////////// // 기존 직원 정보 수정 (2) //////////////////////////////
app.put('/api/members/:id', async (req, res) => {
const { id } = req.params;
const newInfo = req.body;
// findOne()
// 이 member 모델 객체는 해당 row와 연동되어 있음
const member = await Member.findOne({ where: { id } });
// member객체의 property의 값을 request의 body에 있던 새로운 객체의 property 값으로 수정
Object.keys(newInfo).forEach((prop) => {
member[prop] = newInfo[prop];
});
// Member 모델 객체의 save() 메소드
await member.save();
res.send(member);
});
💡 test.http 알아두면 좋은 점!
PUT 리퀘스트에서 수정할 객체 안에 모든 정보를 적지 않고, 수정할 내용만 적어도 정상적으로 작동한다.
// test.http
. . .
###
PUT http://localhost:3000/api/members/1
Content-Type: application/json
{ "position": "Server Developer" }
. . .
📌 destroy( )
//////////////////////////////// 기존 직원 정보 삭제 (1) ///////////////////////////////
app.delete('/api/members/:id', async (req, res) => {
const { id } = req.params;
// destroy( ) :
// - Promise 객체를 리턴하는 비동기 실행 함수
const deletedCount = await Member.destroy({ where: { id }});
if(deletedCount) {
// 삭제될 row가 있을 경우
res.send({ message: `${deletedCount} row(s) deleted` });
} else {
// 삭제될 row가 없을 경우
res.status(404).send({ message : 'There is no member with the id!' });
}
});
📌 ?
//////////////////////////////// 기존 직원 정보 삭제 (2) ///////////////////////////////