MVC & ORM
MVC Design Patterns
MVC : Model View Controller
- SW Architecture Design Pattern(소프트웨어 구조 설계 패턴)
- separates application functionalities(기능 세분화)
- Promotes organized programming(조직화된 프로그램)
Model
- Knowledge
- Handles Data(데이터 처리)
- Interaction with Database(데이터베이스 상호작용)
View
- Visual representation of a model(모델 시각적 표현)
- What the users see(UI)
Controller
- Receives input(입력 수신)
- Process requests(요청 처리)
- get data from a model(데이터 받아오기)
- pass data to the view(view를 위한 데이터 전달)
MVC Flow
ORM
ORM : Object-Relational Mapping
Object <-> ORM <-> Relational Database
- 데이터를 명시적으로 다룰 수 있다.
Sequelize
- a promise-based Node.js ORM
- 지원 RDBMS
- Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server
- SQL 문법이 조금씩 다른 경우도 통합해서 사용할 수 있다.
Sequelize 및 도구 이용
Squelize 및 sequelize-cli 설치
- Squelize 설치
npm install sequelize sqlite3
- Squeeze-cli 설치
npm install --save-dev sequelize-cli
ORM 설정(bootstraping)
npx sequelize-cli init
해당 명령어가 성공적으로 동작하면
- Config
- models
- migrations
- seeders
폴더 및 파일이 생성된다. 여기서 config 파일에 DB 연결 정보를 작성하여 해당 DB로 접근이 가능하다.
모델 생성
npx sequelize-cli model:generate --name url --attributes url:string,title:string,visits:integer
- –name : 모델명, 나중에 s가 붙어 테이블 명이 된다.
- –attributes : 필드 생성
- id, createdAt, updatedAt은 자동 생성된다.
- models, migrations 폴더의 name.js, ~-create-name.js에서 확인 가능하다.
- 마이그레이션시 models의 파일과, migrations의 파일을 읽어 적용하기 때문에 defaultValue와 같은 추가 옵션을 해당 파일에 명시해 줄 수 있다.
모델 마이그레이션
- 생성한 모델을 config.json파일 정보를 사용하여 해당 DB에 접근해 테이블을 생성한다,
npx sequelize-cli db:migrate
# npx sequelize-cli db:migrate:undo -> 마이그레이션 실행 취소
- 스키마 변경이 있을 때마다 마이그레이션을 실행해줘야 한다.
- Migrations 에서 확인 가능하다.
Sequelize 문법(CRUD)
Create
// Create a new user
const jane = await User.create({ firstName: "Jane", lastName: "Doe" });
console.log("Jane's auto-generated ID:", jane.id);
Read
- SELECT * FROM ~
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
- SELECT foor, bar FROM ~
Model.findAll({
attributes: ['foo', 'bar']
});
- WHERE
Post.findAll({
where: {
authorId: 2
}
});
// SELECT * FROM post WHERE authorId = 2;
Update
// Change everyone without a last name to "Doe"
await User.update({ lastName: "Doe" }, {
where: {
lastName: null
}
});
Delete
// Delete everyone named "Jane"
await User.destroy({
where: {
firstName: "Jane"
}
});
Squeeze Associations(Join)
1:1 - hasOne, belongsTo
const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);
A.hasOne(B); // A HasOne B
A.belongsTo(B); // A BelongsTo B
1:N - hasMany
const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);
A.hasMany(B); // A HasMany B
N:M belongsToMany
const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);
A.belongsToMany(B, { through: 'C' }); // A BelongsToMany B through the junction table C(1:N N:1 관계를 연결하기 위한 자동 모델 생성)
본 포스팅은 코드스테이츠 BEB 과정을 수강하며 작성한 글입니다.
Reference
https://sequelize.org/docs/v6/other-topics/migrationshttps://sequelize.org
https://sequelize.org/docs/v6/core-concepts/model-querying-basics/
https://sequelize.org/docs/v6/core-concepts/assocs/