Orm

»

ORM

MVC

Model-View-Controller의 약자로써

개발 할 때 3가지 형태로 역할을 나누어 개발하는 방법론

model 은 어플리케이션이 무엇을 할것인지를 정의합니다. 처리되는 알고리즘, DB와 상호작용 데이터 등등이 있습니다

controller는 모델이 어떻게 처리할지를 알려주는 역할을 합니다 화면의 로직처리 부분 같은것이 있습니다

view 는 model을 화면으로 보여주는 역할을 합니다 웹페이지나 어플의 화면 같은 것이 있습니다

ORM

ORM은 바로 Model을 기술하는 도구입니다. 이를 통해 데이터베이스 세계와 프로그래밍 언어 사이의 개념의 간극을 줄여줍니다.

ORM을 통해 객체간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결해줍니다

객체를 통해 간접적으로 데이터베이스 데이터를 다룹니다

ORM이란 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다. 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.

Sequelize

시퀄라이즈는 nodejs에서 mysql을 쉽게 다룰 수 있도록 도와주는 라이브러리로,

ORM(Object-relational Mapping)으로 분류된다. sql 작성법을 모르더라도 데이터베이스 관리가 가능하다.

  • config : sequelize를 사용하기 위해 환경을 설정하는 부분이다.
  • models/index.js : Model을 정의하고 관계를 설정하는 부분이다.

시퀄라이즈 index.js 뜯어보기

models/index.js

// 환경변수, 실제 배포할 때는 'production'으로 바꿔야한다.
const env = process.env.NODE_ENV || "development";
// config
const config = require(__dirname + "/../config/config.json")[env];
// db 객체 생성
const db = {};
  • 참고로 config파일에는 ‘development’, ‘test’, ‘production’ 키 값을 가진 각각의 설정들이 담겨있다!
let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(
    config.database,
    config.username,
    config.password,
    config
  );
}
  • 시퀄라이즈 객체에 config 파일에 있는 설정들을 넣어준다.
db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;
  • db 객체에 시퀄라이즈 패키지와 객체를 넣고 모듈로 사용한다.

시퀄라이즈로 database 만들기

시퀄라이즈만 있으면 sql문 작성 없이도! workbench 없이도!데이터베이스를 만들 수 있다는 사실.📃 config.js

{
  "development": {
    "username": "root",
    "password": null,
    "database": "nodejs", // 생성하고자하는 database명 적어주기
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  ...

우리는 현재 환경변수가 development이니 여기를 고쳐준다.그리고 명령 프롬프트에 밑의 명령어를 적어주면 ‘nodejs’라는 데이터베이스가 생성된다.

$ sequelize db:create

🚩 시퀄라이즈로 table 짜기

앞으로 models 폴더 내에서 js 파일로 테이블을 만들 것이다.📃 사용자 테이블과 댓글 테이블 만들기 위해 user.js와 comment.js 생성

const Sequelize = require('sequelize');

module.exports = ((sequelize,DataTypes)=>{
    return sequelize.define('user',{
        email:{
            type: Sequelize.STRING(40),
            allowNull: true,
            unique: true,
        },
        nick:{
            type: Sequelize.STRING(15),
            allowNull: false,
        },
        password:{
            type: Sequelize.STRING(100),
            allowNull: true, // 카카오 로그인은 비번 필요없으니,,
        },
        prvider :{ // 뭐로 로그인 했는지 : 카카오, 로컬,,
            type: Sequelize.STRING(10),
            allowNull: false,
            defaultValue: 'local',
        },
        snsId:{
            type: Sequelize.STRING(30),
            allowNull: true,
        },

    },{
        timestamps:true,
        paranoid : true, // 삭제일 (복구용)
    })
})
  • sequelize.define(객체이름, 테이블정의, 테이블_설정)
  • 참고로 테이블 설정에는 tableName으로 테이블 이름 설정도 가능하다.

그리고 index.js에서 만든 js 파일들을 불러온다.

db.User=require('./user')(sequelize,Sequelize);
db.Comment = require('./comment')(sequelize,Sequelize);

불러온 다음에 바로 시퀄라이즈 인스턴스와 패키지를 넣어줬는데 이는

module.exports=(sequelize, DataTypes) =>{

여기의 매개변수와 이어진다.


🚩 table 내용 채우기

지금까지 user, comment 두 개의 테이블을 만들었다.이제 이 테이블 안에 속성(column) 값을 채워 넣어야 한다.짚고 넘어갈 몇가지 개념만 정리해보겠다.

📃 user.js

	name:{
            type:DataTypes.STRING(20),
            allowNull:false,
            unique: true,
        },
        creates_at:{
            type:DataTypes.DATE,
            allowNull:false,
            defaultValue:sequelize.literal('now()'),

        }
    },{
        timestamps:false,
        underscored:true,
    });
  • type : 데이터의 타입을 적어준다.
  • allowNull : Null 값을 허용하는지, 안하는지 여부.
  • unique : 고유의 값을 갖게 하는지.
  • defaultValue : 기본값 설정이다. 여기선 생성 날짜를 입력하지 않으면 현재 시간을 저장하도록 한다.
  • timestamp : createdAt과 updatedAt 컬럼을 자동 생성하고 입력한다.
  • underscored : ‘_(언더바)’를 허용할건지 말건지.

🚩 시퀄라이즈 관계 설정하기

comment 테이블에서 comment 컬럼의 내부는 적어주지 않았다.그 이유는 user가 바로 comment를 작성한 자가 되기 때문에 여기서 관계가 생기는 것이다!

사용자는 여러개의 댓글을 달 수 있고, 댓글 하나는 한 사용자에게만 속해있다.그러므로 user와 comment는 1:N의 관계이다.이는 시퀄라이즈에서도 표현이 가능하다.

db.User.hasMany(db.Comment, {foreignKey:'commeneter', sourceKey:'id'})
db.Comment.belongsTo(db.User,{foreignKey:'commeneter',targetKey:'id'})
  • 1 : 1 관계 : (hasOne, belongsTo)
  • 1 : N 관계 : (haseMany, belongsTo)
  • N : M 관계 : (belongsToMany)

🚩 시퀄라이즈로 table 생성하기

자! 그럼 이제 테이블이 만들어졌나?👀아니다.테이블의 구조를 짰을 뿐, 테이블은 아직 생성되지 않았다.테이블을 생성하기 위해선 app.js를 건들여줘야한다.서버가 우주선🚀이라고 한다면,app.js 우주선의 중앙 통제실🚨이다.우리가 지금까지 작업한 db 모듈은 단지 우주선의 부품🧱일 뿐..이제 조립을 할 차례이다!

📃 app.js

var {sequelize} = require('../models/index')

var app = express();
sequelize.sync();

이렇게 하면 서버가 실행될 때 테이블이 생성된다.그 전에 config.js에 development 환경변수에

"operatorAliases":false

를 추가해줘야지 에러가 안난다고 한다.

Sequelize

명령어및 설치방법이 담겨있는 공식문서

참조

[아키텍처 패턴] MVC 패턴이란?

https://github.com/byungju0624/im-sprint-shortly-mvc/blob/master/controllers/links/index.js

Sequelize 사용법

메소드 이름같은것들 정리잘되있음

[Node.js] #8 MySQL과 Sequelize

sequelize 기초 설명 잘되어있음