조회, 추가, 수정, 삭제

박은지·2022년 2월 13일
0

Express

목록 보기
10/10

이제 app.js 파일에 Members 테이블의 데이터를 가져오고
GET, POST, PUT, DELETE 리퀘스트를 수정하는 작업을 해야 한다.

Members 테이블의 데이터 불러오기

// app.js

const express = require('express');
const app = express();

///////  Members 테이블 데이터 가져오기 ///////
const db = require('./models/index.js');
const { Member } = db;

app.use(express.json()); 

. . .

GET

1. 직원 정보 조회하기 [ 특정 팀 소속 | 전체 ]

📌 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);
  }
});

. . .

2. 특정 직원 정보 조회하기 [ id ]

📌 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!' });
  }
});

. . .

POST

새로운 직원 정보 추가하기

///////////////////////////// 새로운 직원 정보 추가 //////////////////////////////
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);
});

PUT

직원 정보 수정하기

[ 방법 1 ] update 메소드

📌 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!' });
  }
});

. . .

[ 방법 2 ] findOne 메소드

📌 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" }

. . .

DELETE

직원 정보 삭제하기

[ 방법 1 ] destroy 메소드

📌 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 ]

📌 ?

//////////////////////////////// 기존 직원 정보 삭제 (2) /////////////////////////////// 

0개의 댓글