일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 모두의캠퍼스
- Redux
- #api 문서화
- server
- #스웨거
- 카카오게임즈
- #Swagger
- #Swagger-codegen
- 쿠버네티스 컨트롤러
- React
- AWS
- action
- Site Reliability engineering
- Reducer
- 북딜
- docker
- Kubernetes
- 쿠버네티스
- React.js
- javascript
- fluentd
- IP
- 프로세스 통신
- 프로세스
- ecs
- 기술PM
- #Swagger-editor
- 모캠
- SRE
- #Swagger-ui
- Today
- Total
탕구리's 블로그
ORM(Object Relation Mapping)을 이용해보자!!! 1편 Sequelize.js 본문
시작하기 전에
해당 블로그에 작성되는 글은 주인장의 지극히 주관적인 생각이 다수이며, 대부분의 지식은 구글링을 통해 얻고 있기 때문에 옳지않은 정보가 있습니다.
잘못된 부분이나 수정해야 하는 부분이 있다면 과감히 덧글을 남겨주세요! 모르는게 많은 새싹입니다
오늘의 주제
오늘의 주제는 ORM(Object Relation Mapping)에 대한 포스팅을 할 예정입니다. 주제를 선정한 특별한 이유는 없고.. 평소 궁금했고 어쩌다 보니 ORM을 이용한 프로젝트의 소스코드를 분석해야하는 일이 생겨서 주제로 선정하게 되었답니다!
ORM이 무엇인지, 어떤 장단점이 있는지, 간단한 예제를 만들어보는 실습위주로 진행하도록 하겠습니다. 재밋게 읽어주세요.
ORM? 넌 누구냐!!!!
ORM의 장점
ORM의 단점
ORM을 이용해보자!
npm install sequelize --save
npm install mysql --save
여기서 잠깐
여기서 제가 사용하는 DBMS는 MYSQL입니다. Object와 Mapping을 할 DBMS가 필요하기 때문에 로컬 혹은 클라우드 환경에서 이용할 수 있는 DBMS가 필요합니다.
저는 이렇게 도커를 통해 mysql 환경을 구축해 주었습니다. 버전은 lastest로 이용했는데, docker hub에 찾아보니 8.0v인것 같습니다. 버전에 따른 특별한 기능을 이용하지 않으니 무난하게 5.6이나 5.7 버전을 설치해주셔도 됩니다.
좀 더 편리한 설명을 위해 저는 디렉터리 구조를 이렇게 잡았습니다!
기본 디렉터리는 sequelize-example/src 입니다.
Sequelize Setting
var fs = require('fs'); var path = require('path'); var config = require('./config'); var Sequelize = require('sequelize'); const db = {} const sequelize = new Sequelize( 'databaseName', // 데이터베이스 이름 'username', // 유저 명 'password ', // 비밀번호 { 'host': 'localhost', // 데이터베이스 호스트 'port': 3308, 'dialect': 'mysql' // 사용할 데이터베이스 종류 } ); // 하나씩 파일을 캐싱해 두는 방식 db['Publisher'] = sequelize.import(path.join(__dirname, 'publisher.js')); // 디렉터리 내의 모든 파일을 순회하며 캐싱하는 방식이다. fs.readdirSync(__dirname) .filter(function(file) { return (file.indexOf('.') !== 0) && (file !== 'index.js' && file !== 'config.js'); }) .forEach(function(file) { var model = sequelize.import(path.join(__dirname, file)); db[model.name] = model; }); // 모델간의 relation을 설정해주는 작업을 한다. config.initAssociations(db) // 각각 실행타이밍에 맞춰 hooks 또한 설정 가능합니다. config.initHooks(db); // 객체에 대한 definition을 모델링하며, 각각 객체에 대해 동기작업을 실행합니다. db.user.sync().then(() => { db.book.sync(); }); // db.Publisher.drop(); // db.Publisher.sync({force: true}); // 객체를 편하게 쓰기위해 그냥 다 담아줍니다. db.sequelize = sequelize; db.Sequelize = Sequelize; module.exports = db;
#Seqelize.import()
파일에 있는 모델의 정의와 왁벽히 같은 Object를 생성하여 저장합니다. 내부적으로 캐시되어 여러번의 호출이 발생하더라도 문제가 발생하지 않습니다. 서버구동시 앱단에서 캐싱을 실행하면 한번에 처리가 가능합니다.
Model definition
module.exports = (sequelize, DataType) => { return sequelize.define('user', { user_id: { type: DataType.INTEGER, primaryKey: true, autoIncrement: true, }, password: { type: DataType.STRING(45), allowNull: true, }},{ classMethods: {}, tableName: 'user', underscored: true, timestamps: false, }) })
TimeStamp
- createAt, updatedAt 컬럼이 생성된다. 기능을 끄려면 false로 설정해 줍니다.
paranoid
- true인 경우에 deleteAt 컬럼이 테이블에 추가됩니다. 해당 컬럼에 값(날짜)이 표기된 경우 find시 row는 검색되지 않는다.
underscored
- Naming 규칙을 정한다. snakeCase로 설정된다. default는 CamalCase이다.
freezeTableName
- define 메소드의 첫번쨰 인자를 설정한 이름으로 사용할 수 있다. (근데 저는 옵션을 켜고 설정해준 다음 첫번째 인자를 뺏더니 오류가..)
Comment
- description을 명세해줍니다.
Data Type (Mysql)
Sequelize에서 제공하는 Mysql의 데이터 타입은 다음과 같습니다. 이 외에도 많은 데이터 타입을 지원합니다.
더 많은 내용을 원하시면 여기를 방문해 주세요.
STRING(1234) => VARCHAR(1234)STRING.BINARY => VARCHAR BINARYTEXT => TEXTTEXT('tiny') => TINYTEXTINTEGERBIGINTBIGINT(11)FLOATFLOAT(11)FLOAT(11, 12) => FLAOT(11,12)DOUBLEDECIMALDATE(6) => mysql5.6.4+DATEONLYBOOLEANENUM('value1', 'value2')JSONGEOMETRYGEOMETRY('POINT')GEOMETRY('POINT', 4326)
Defining as part of a property
const Employee = sequelize.define('employee', { name : { type: Sequelize.STRING, allowNull: false, get() { // this는 객체의 속성에 접근이 가능하게 해준다. const title = this.getDataValue('title'); return this.,getDataValue('name') + ' (' + title + ')'; } } })
Object Association
'use strict';
var config = { initAssociations: function(db) { db.user.hasOne(db.book, { foreignKey: 'user_id' }); db.book.belongsTo(db.user) }, }; module.exports = config;
var config = { initAssociations: function(db) { db.user.hasMany(db.book, { foreignKey: 'user_id' }); db.book.belongsTo(db.user) db.memo.belongsTo(db.memo) }, }
user.belongsToMany(book, { as : Target, through : 'Source_Target', foreignKey : 'user_id', otherKey : 'status' }) book.belongsToMany(user, { as : Source, through : 'Source_Target', foreign_key : user_id })
물론, 중간테이블에 대해서도 추가컬럼을 설정해 줄 수 있다.
Source_Target = sequelize.define( 'Source_Task', { status: Datatype.String }) user.belongsToMany('book', { through : worker_task})
이렇게 ORM 중에서도 Sequelize.js 패키지에 대하여, ORM이란 무엇인지? ORM에 대한 장단점이 무엇인지? 기초적으로 Model에 대한 Definition을 정의하고 매핑 방법, 여러개의 Model에 대해 관계를 정리하고 설정하는 방법을 알아보았습니다.
2편에서는 Mapping을 완성한 Object들에 대하여 기본적인 CRUD 작업을 하는 방법에 대해 알아보도록 하겠습니다!
COMING SOON!!!!!!!!!!!!
'javascript > Node.js' 카테고리의 다른 글
Node.js Stream API에 대해 알아보자! (0) | 2018.12.19 |
---|---|
ORM(Object Relation Mapping)을 이용해보자! 2편 CRUD! (0) | 2018.06.17 |
Node.js Crypto 모듈 (0) | 2017.12.25 |