sequelize 외래키 설정

2022. 8. 25. 00:58·개발/node.js
728x90
반응형

1. model/index.js

const Sequelize = require("sequelize");
// config.js에서 module.exports = config 내보내기를 하고
// require("../config/config") 가져오면 내보낸 객체가 가져와진다.
const { config } = require("../config/config");
const User = require("./users");
const Post = require("./post");
//시퀄라이즈 객체 생성 옵션을 적용한 객체 만들어 놓는다.
const sequelize = new Sequelize(
  config.dev.database,
  config.dev.username,
  config.dev.password,
  config.dev
);

//내보내기 위해서 빈객체 만든것
const db = {};
// 그 빈객체에 sequelize 키값으로 시퀄라이즈 객체 만든것을 넣어준다.
// User도 내보내서 사용할 예정리아
db.sequelize = sequelize;
db.User = User;
db.Post = Post;

//테이블 생성
User.init(sequelize);
Post.init(sequelize);

User.associate(db);
Post.associate(db);

// 보내고 싶은 값을 다 넣은 객체를 내보낸것
module.exports = db;

2. model/post.js

const Sequelize = require("sequelize");

class Post extends Sequelize.Model {
  static init(db) {
    return super.init(
      {
        msg: {
          type: Sequelize.STRING(100),
          allowNull: false,
        },
      },
      {
        sequelize: db,
        timestamps: true,
        modelName: "Post",
        tableName: "posts",
        paranoid: false,
        charset: "utf8",
        collate: "utf8_general_ci",
      }
    );
  }
  static associate(db) {
    // belongsTo 함수를 사용해서 User 테이블과 연결 이 테이블이 자식
    // belongsTo 첫번째 매개변수는 연결될 테이블 이름
    // 유저의 id가 타겟이고 연결해주는 키는 user_id이다
    db.Post.belongsTo(db.User, { foreignKey: "user_id", targetKey: "id" });
  }
}

module.exports = Post;

3. model/users.js

const Sequelize = require("sequelize");
// User 클래스에서 시퀄라이즈 안에 모듈 객체의 기능을 상속시켜주기위해서
// User 클래스에 Sequelize.Model 기능을 준다.
class User extends Sequelize.Model {
  // static init 메서드에서 테이블을 생성해 주는건데
  // 사용하면 테이블을 생성 및 연결까지(매핑) 구성
  static init(sequelize) {
    // 상속받은 함수를 쓰려면 super 사용
    // init 함수의 첫번째 매개변수가 테이블의 구성
    // 컬럼이 어떤게 있는지 그 타입과 속성이 뭔지
    // 여기에 정리해서 테이블 생성 해줌 매핑해줌
    // https://pjt3591oo.github.io/sequelizejs_translate/build/html/CoreConcepts/DateTypes.html
    // 여기에  테이블 자료형 타입들이 정리되있다.
    return super.init(
      {
        //name 컬럼 하나
        name: {
          // 시퀄라이즈 안에 있는 데이터 타입을 사용해야한다. 꼭
          // 그래서 가져온 시퀄라이즈 모듈 안에 있는 STRING 객체를 사용
          // 여기서 한거는 컬럼의 데이터 타입을 정한것
          type: Sequelize.STRING(20),
          // 이값이 무조건 있어야 하는지 false면 이 컬럼값이 없으면 안된다고 표시하는것
          allowNull: false,
          // 기본키로 설정을 할것인지, 기본키 하나는 무조건 있어야 한다. 중복되지 않는키
          // primaryKey: true,
          // 고유키 : 겹치지 않게
          // 여기서는 컬럼에 name 값이 겹치지 않도록 사용
          // 주민번호나, 전화번호 등 겹치지 않는 값들 혹여나 안겹치게
          // 중복되지 않는키, 우리가 쓰고싶을때 쓰면됨
          unique: true,
        },
        age: {
          //나이의 값은 숫자로 받을거니까
          type: Sequelize.INTEGER,
          allowNull: false,
        },
        msg: {
          // 문자로 받을거니까
          type: Sequelize.TEXT,
          // 굳이 안써도 된다.
          allowNull: true,
        },
        // 생성시간이 필요하다 할때 사용하면된다. 이 구문이나 테이블자체에
        // timestamps : true 설정
        // created_at: {
        //   // 시간 타입으로 받고
        //   type: Sequelize.DATE,
        //   allowNull: false,
        //   // 디폴트값 설정
        //   defaultValue: Sequelize.NOW,
        // },
      },
      {
        // sequelize 이건 위에서 매개변수 쓴걸 연결 시켜주는 옵션
        sequelize,
        // created_at을 직접 만드는것보다 장점 : 업데이트된 시간도 표시해줌
        // created_at 과 updated_at도 생겨서 우리가 수정했을때 시간도 같이 기록해줌
        timestamps: true,
        // underscored 시퀄라이즈는 기본적으로 카멜표기법이다.
        // 스네이크 표기법으로 바꿔주는 옵션
        underscored: true, // createdAt, created_at 으로 바꿔줌
        // 얘는 모델의 이름을 설정할수 있다.
        modelName: "User", // 관계형으로 구성할때 사용한다.
        tableName: "Users", //데이터베이스의 테이블의 이름을 설정한다.
        // paranoid true로 설정하면 deleted At이 값에 살제한 시간이 추가된다.
        paranoid: false,
        // charset, collate : 각각 밑에 처럼 설정해주면 한글이 입력가능하게 되고
        // 이모티콘 쓸거면 utf8
        // 가나다 ㄱ ㅏ ㄴ ㅏ ㄷ ㅏ
        charset: "utf8",
        collate: "utf8_general_ci",
      }
    );
  }
  // (foreign key) 외래키
  static associate(db) {
    // 1:N 관계 (hasMany, belongsTo)
    // 시퀄라이즈에서 1:N 관계를 hasMany 함수로 정의를 한다.
    // hasMany함수를 이용해서 테이블의 관계를 정의해준다.
    // 첫번째 매개변수 연결할 테이블
    // sorceKey User테이블안에 무슨 키를 foreignKey와 연결할지
    // hasMany() 첫번째로 넘겨준 테이블이 foreignKey 연결되고 foreignKey 이름은 user_id이다.
    db.User.hasMany(db.Post, { foreignKey: "user_id", sorceKey: "id" });
    //여러개 쓸거면 아래에다 계속 쓰면됨
    // db.User.hasMany(db.Post, { foreignKey: "user_id", sorceKey: "id" });
  }
}

module.exports = User;

4. app.js

//시퀄라이즈 구성 해보자 연결 및 테이블 생성 여기가 처음 매핑
// sync 함수는 데이터 베이스 동기화 하는 사용 필요한 테이블을 생성해준다.
// 필요한 테이블들이 다 생기고 매핑된다. 절대 어긋날 일이 없다.
// 테이블의 내용이 다르면 오류를 뱉어낸다.
// CREATE TABLE 문이 여기서 실행된다는것
// force 강제로 초기화 시킬것인지 (테이블 내용을 다 비워줄것인지)
sequelize
  .sync({ force: false })
  .then(() => {
    //연결 성공
    console.log("DB연결 성공");
  })
  //연결 실패
  .catch((err) => {
    console.log(err);
  });
728x90
반응형

'개발 > node.js' 카테고리의 다른 글

sequelize Op연산자  (1) 2022.08.25
[Node.js] mysql FOREIGN KEY  (0) 2022.08.18
[Node.js] 로그인 만들기  (1) 2022.08.18
[Node.js] crypto, bcrypto  (0) 2022.08.17
[Node.js] access token, refresh token 을 활용하여 로그인 유지시키기  (0) 2022.08.16
'개발/node.js' 카테고리의 다른 글
  • sequelize Op연산자
  • [Node.js] mysql FOREIGN KEY
  • [Node.js] 로그인 만들기
  • [Node.js] crypto, bcrypto
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    도커
    컨테이너
    go언어
    하이퍼레저
    go
    CSS
    mysql
    html
    node.js
    ERC721
    30일 챌린지
    nodejs
    React
    erc20
    명령어
    node
    30일챌린지
    js
    프로그래머스
    블록체인
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
sequelize 외래키 설정
상단으로

티스토리툴바