[포스코x코딩온 웹 풀스택 10기] 7주차 회고_ Sequelize & 데이터베이스

onee·2023년 12월 12일
0
post-thumbnail

📖 수업내용


# Sequelize 란?

: 자바스크립트 구문을 알아서 SQL로 변환해주며, DB 작업을 쉽게 할 수 있도록 도와주는 ORM 라이브러리이다.

# Sequelize 설치

npm install sequelize sequelize-cli mysql2

sequelize : 시퀄라이즈 패키지
sequelize-cli : 시퀄라이즈 명령어 실행

npx sequelize init

프로젝트를 처음 시작하는 경우에 유용 (자동으로 sequelize에 필요한 폴더 생성됨)


# Sequelize 폴더 구조

1) config 폴더 생성

기존 방식은 모델 폴더 안에 파일이 여러 개 있다면, 데이터베이스 연결 코드를 모든 파일에 적어줘야 한다. -> 만약 데이터 베이스 명을 바꾸게 된다면, 모든 파일의 내용을 수정해야 한다!

▶︎   config.json 파일



2) models/index.js 파일 생성


3) sequelize 모델 정의

-> mysql에서 정의한 테이블을 sequelize에서도 정의해주어야 한다. (mysql 테이블과 sequelize의 모델이 대응됨)

  • type : 데이터 타입을 정의 (예 : 문자, 숫자 등)
Sequelize 자료형MySQL 자료형
STRING(n)VARCHAR(n)
TEXTTEXT
TEXT('tiny')TINYTEXT
INTEGERINTEGER
DATEDATETIME
  • primaryKey : 기본키 설정
  • autoIncrement : 숫자 자동 증가
  • allowNull : NOT NULL 허용 여부
  • comment : column에 대한 설명을 작성
  • validate : 데이터 유효성 검사를 하는 속성

4) sequelize 쿼리문

: 프로미스(promise)를 반환한다. -> .then()을 붙에서 결과값을 사용할 수 있다.

SequelizeMySQL
findAll()select
findOne()select
create()insert
update()update
destroy()delete

▶︎ 작성 예시

// [Before]
// const Visitor = require("../model/Visitor");

// [After]
// models: models/index에서 export 한 db 객체
const models = require("../models/index");
const Visitor = models.Visitor;

// GET /
exports.main = (req, res) => {
  res.render("index");
};

// GET /visitor
exports.get_visitors = (req, res) => {
  // [Before]
  /*
  Visitor.getVisitors((result) => {
    // 모델의 rows를 result라는 변수명으로 받음
    res.render("visitor", { data: result });
  });
  */

  // [After]
  // SELECT * FROM visitor
  Visitor.findAll().then((result) => {
    console.log("findAll > ", result); // [ {}, {}, .. ]
    res.render("visitor", { data: result });
  });
};

// POST /visitor
exports.post_visitor = (req, res) => {
  const { name, comment } = req.body;
  // [Before]
  /*
  Visitor.postVisitor(req.body, (result) => {
    // result: rows.insertId => ex ) 3
    res.send({ id: result, name, comment });
  });
  */

  // [After]
  // INSERT INTO visitor (name, comment) VALUES ( ? , ? )
  Visitor.create({
    name: name,
    comment: comment,
  }).then((result) => {
    console.log("create > ", result);
    res.send(result); //  { id: 10, name: '1', comment: '1' }
  });
};

// GET /visitor => localhost:PORT/visitor?id=N
exports.get_visitor = (req, res) => {
  console.log(req.query); // { id: '1' }

  // [Before]
  /*
  Visitor.getVisitor(req.query.id, (result) => {
    // result : rows[0] -> { id: 1, name: '홍길동', comment: '내가 왔다.' }
    console.log("get_visitor Cvisitor.js > ", result);
    res.send(result);
  });
  */

  // [After]
  // SELECT * FROM visitor WHERE id = ?  //-> limit 1, 하나를 가져오는 것
  Visitor.findOne({
    where: { id: req.body.id },
  }).then((result) => {
    console.log("findOne > ", result);
    res.send(result);
  });
};

// PATCH /visitor
exports.patch_visitor = (req, res) => {
  console.log(req.body); // { id: 5, name: 'banana2', comment: 'hi' }

  // [Before]
  /*
  Visitor.patchVisitor(req.body, (result) => {
    console.log("patchVisitor Cvisitor.js > ", result);
    res.send("수정 성공!");
  });
  */

  // [After]
  // UPDATE visitor SET name = ?, comment = ? WHERE id = ?
  Visitor.update(
    {
      name: req.body.name,
      comment: req.body.comment,
    },
    {
      where: {
        id: req.body.id,
      },
    }
  ).then((result) => {
    console.log("update > ", result); // [ 1 ]
    res.send("수정 성공!");
  });
};

// DELETE /visitor
exports.delete_visitor = (req, res) => {
  console.log(req.body);
  console.log(req.body.id);

  // [Before]
  /*
  Visitor.deleteVisitor(req.body.id, (result) => {
    console.log("deleteVisitor Cvisitor.js > ", result);
    res.send("삭제 성공!");
  });
  */

  // [After]
  // DELETE FROM visitor WHERE id = ?
  Visitor.destroy({
    where: { id: req.body.id },
  }).then((result) => {
    console.log("destroy > ", result); // 1
    res.send("삭제 성공!");
  });
};



# 데이터베이스 (Relationship)

# Relationship 이란?

: 테이블은 서로 관계를 맺을 수 있으며, 이를 통해 복잡한 데이터 구조를 단순화화하고 용이하게 관리할 수 있다.
(예: 1:1, 1:N, N:N)

외래키 : 다른 테이블의 키를 참조하는 것이다.

1) 1:1 관계

: 1:1 관계는 하나의 레코드(튜플)가 다른 하나의 레코드와 관련되어 있는 관계를 의미한다. (-> 서로 한 가지 정보만을 공유한다.)

hasOne()

: 한 모델이 다른 모델을 가리키는 관계를 설정하는데 사용한다.

Player.hasOne(Profile, {
  foreignKey: "player_id",
  sourceKey: "player_id", // 생략 가능
  // 연쇄 삭제, 수정
  onDelete: "CASCADE",
  onUpdate: "CASCADE",
});

belongsTo()

: 다른 모델이 한 모델을 가리키는 관계를 설정하는데 사용한다.
: 외래키가 붙은 모델은 belongsTo()로 기준을 잡아주면 된다.

Profile.belongsTo(Player, {
  foreignKey: "player_id",
  targetKey: "player_id", // 생략 가능 (테이블(profile)에 같은 이름(player_id)으로 만드는 거면 생략이 가능하나, 다른 이름으로 만들고 싶은 경우 테이블(profile)에 미리 정의를 해두어야 함) -> 기본키 사용시 생략가능
}); // -> Profile table에 player_id 칼럼이 하나 더 생김
// belongsTo에서의 foreignKey는 자신에게 속해있는 컬럼이고, targetKey는 foreignKey가 참조하는 상대 모델의 컬럼이다.

두 테이블이 소통하는 키는 foreignKey"player_id"이며,
Player의 sourceKey는 곧 Profile의 targetKey가 된다.


2) 1:N 관계

: 1:N 관계는 한 쪽 레코드가 다른 쪽 레코드 여러 개와 관련되어 있는 관계이다. (예 : 부서와 직원, 고객과 주문, 학교와 학생 등)

hasMany()

: 한 개의 모델이 다른 모델과 관계를 가질 때 사용한다.

Team.hasMany(Player, { foreignKey: "team_id", sourceKey: "team_id" });

belongsTo()

: 다른 모델이 한 모델을 가리키는 관계를 설정하는데 사용한다.

Player.belongsTo(Team, {
  foreignKey: "team_id",
  targetKey: "team_id",
}); // -> Player table에 team_id 칼럼이 하나 더 생김

3) N:N 관계

: N:N 관계는 한 쪽 레코드가 다른 쪽 레코드 여러 개와 관련되고, 그 반대쪽 레코드도 다른 쪽 레코드 여러 개와 관련되어 있는 관계를 의미한다. (-> 중간 테이블을 사용하여 구현하며, through 속성에 그 이름을 적으면 된다.)

- belongsToMany()

Player.belongsToMany(Team, { through: midTable })

참고

참고: 포스코x코딩온 강의 자료(1016_Sequelize.pdf, 10_16-1데이터베이스응용.pdf)


👩🏻‍💻 학습


# foreign key(외래키)

: 두 테이블을 서로 연결하는 데 사용되는 키이다.

외래키가 포함된 테이블을 하위(자식) 테이블이라고 하고, 외래키 값을 제공하는 테이블을 참조 또는 상위(부모) 테이블이라고 한다.

  • 외래키 값은 NULL이거나 참조 테이블의 기본키 값과 동일해야 한다.

  • 참조 테이블의 기본키, 고유키를 외래키로 지정할 수 있다.

  • 참조 테이블의 기본키, 고유키가 여러 개의 컬럼으로 이루어져 있다면 참조 테이블이 가진 기본키, 고유키 컬럼을 원하는 개수만큼 묶어서 외래키로 지정할 수 있다.

  • 외래키로 지정할 두 테이블의 필드는 같은 데이터 타입이어야 한다.

참고   참고2



profile
Hello World 💻

0개의 댓글