JavaScript로 Database를 다루려면 클라이언트 객체가 필요하다.
이 클라이언트는 SQL을 Database Server에 전달해서 원하는 작업을 처리하고,
그 결과를 받아오는 역할을 하는 객체이다.
이때 Database의 종류에 맞는 클라이언트 객체를 사용해야 한다.
MySQL을 사용할 것이기 때문에 MySQL2라는 패키지에 있는 클라이언트 객체를 사용할 것이다.
💡 이 방법은 SQL문을 잘 모르면 사용하기 어렵다는 단점이 있다.
이러한 문제를 해결하기 위해 생겨난 방법이 ORM 패키지를 이용한 두 번째 방법이다.
// mysql2 패키지의 클라이언트 객체
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: "localhost",
user: "root",
database: "test",
});
connection .query(
// 바로 이 부분이 데이터베이스를 제어하기 위해 사용하는 SQL
// 의미 : member 테이블에서 id column의 값이 1인 row 조회하기
"SELECT * FROM 'member' WHERE 'id' = 1",
function (err, results, fields) {
console.log(results);
}
);
💡 ORM 패키지
ORM은 Object-Relational Mapping의 약자로,
데이터베이스에 있는 데이터를 하나의 객체에 매핑시키는 기술을 말한다.
쉽게 말해, JavaScript로 데이터 관련 코드를 작성해도 그 내용이 ORM 패키지 위에서 자동으로 SQL문으로 변환되고, 그 후 클라이언트 객체를 통해 DBMS에 전달될 수 있다는 의미이다.
가장 먼저 터미널에 npm install mysql2 sequelize sequelize-cli
를 입력하여 3가지의 패키지를 설치한다.
- mysql2 : 클라이언트 객체를 제공하는 패키지
- sequelize : 사용할 ORM 패키지
- sequelize-cli : 데이터베이스 관련 작업을 sequelize와 연동해서 터미널에서 직접 명령어를 수행할 수 있도록 하는 패키지
sequelize를 사용할 때에는 프로젝트 내부의 디렉토리도 그에 알맞은 구조로 잡아주는 것이 좋다.
앞에서 설치했던 sequelize-cli
패키지 명령어를 사용하면 이 작업을 쉽게 할 수 있다.
터미널에 npx sequelize init
명령을 실행한다.
- config 디렉토리 : configuration의 줄임말로, 데이터베이스 접속에 관한 각종 설정 포함하고 있다.
config 디렉토리 안에 있는 config.json 파일을 다음과 같이 수정한다.
터미널에 npx sequelize db:create --env development
명령을 입력하고 실행한다.
데이터베이스가 성공적으로 생성되었다면 결과 화면을 다음과 같을 것이다.
💡 주의
여기서 id가 보이지 않는 이유는 Sequelize에서 기본적으로 id에 대한 속성을 추가해주기 때문이다.
앞서 살펴 명령어를 터미널에 입력하고 실행시킨다.
명령을 실행한 결과는 아래와 같다.
models 폴더와 migrations 폴더 안에 파일들이 새롭게 생성된 것을 확인할 수 있다.
migrations : 데이터베이스 내부에서 일어나는 모든 변경 사항들
migrations 디렉토리 안에 생성된 파일을 이해하고 수정해보자.
// migrations > 20220213094722-create-member.js
'use strict';
module.exports = {
// up 메소드 : migration을 적용할 때 실행
async up(queryInterface, Sequelize) {
// createTable() : 테이블을 생성하는 메소드
// 테이블 이름을 Member이라는 단수형으로 지정했지만, 실제로는 Members 복수형으로 생성되었다.
// ---> 이것이 Sequelize의 특징! 테이블명으로 단수형으로 지정했더라도 자동으로 복수형으로 변환한다.
await queryInterface.createTable('Members', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
name: {
type: Sequelize.STRING
},
team: {
type: Sequelize.STRING
},
position: {
type: Sequelize.STRING
},
emailAddress: {
type: Sequelize.STRING
},
phoneNumber: {
type: Sequelize.STRING
},
admissionDate: {
type: Sequelize.DATE
},
birthday: {
type: Sequelize.DATE
},
profileImage: {
type: Sequelize.STRING
},
// 정의하지 않았지만 자동으로 포함된 컬럼들
// 보통 해당 ROW의 "생성 시간"과 "갱신 시간"을 추가하는 경우가 많다.
createdAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn('now'), // 기본값) 현재시간이 자동으로 들어가도록 설정
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn('now'), // 기본값) 현재시간이 자동으로 들어가도록 설정
}
});
},
// down 메소드 : migration을 적용 해제할 때 실행
async down(queryInterface, Sequelize) {
// dropTable() : 테이블을 삭제하는 메소드
await queryInterface.dropTable('Members');
}
};
migration을 적용하면 Members 테이블이 생성된다.
터미널에서 npx sequelize db:migrate
명령어를 입력하고 실행한다.
이 명령어는 migrations 디렉토리에 있는 모든 migration을 적용하라는 의미이다.
터미널에 위와 같은 결과가 나타났다면 COWORK 라는 데이터베이스 안에 Members 라는 테이블이 성공적으로 생성된 것이다.
터미널을 열고 npx sequelize db:migrate:undo
명령어를 실행한다.
이 명령어는 가장 최근에 적용된 migration 하나를 적용 해지하는 명령어이다.