티스토리 뷰
▶sequelize 통해서 MySQL 연동
1. ORM(Object Relational Mapping)에 대해
ORM은 객체와 관계형 DB를 연결해줍니다.
- 객체 지향 프로그래밍은 클래스 사용 ↔ 관계형 데이터 베이스는 테이블 사용
- 객체를 통해 간접적으로 데이터베이스 데이터를 다룸
- 장점
- 쿼리문이 아닌 메서드로 데이터를 조작할 수 있음
- 코드의 가독성을 올려줌
- 재사용 및 유지보수의 편리성 증가
- 단점
- 프로젝트의 복잡성이 커질 경우 난이도 또한 증가
- 관계형 데이터베이스의 고유 기능을 이용하기 어려움
대표적으로는
- TypeORM + nextJS
- Sequelize + express
가 있습니다. 이번에는 sequelize에 대해 알아보려고 합니다.
2. Sequelize
sequelize는 ORM의 한 종류로 SQL문을 사용하지 않아도 명령문 만으로 DB관리가 가능합니다.
필요에 따라 Row Query(SQL 쿼리문)도 사용이 가능합니다.
3. Sequelize 설치
$ npm i mysql2, sequelize, sequelize-clis
$ npx sequelize init
위 명령어를 모두 실행하고 나면 다음 파일이 생성되게 됩니다.
- config
- DB와 연결 설정
- models
- 테이블 정의 및 스키마 정의
- migrations
- 테이블, 스키마 수정
- seeders
- 백업본 저장
4. 초기 설정하기
우리의 mysql과 연동해야 하기 때문에 접속이 가능하도록 비밀번호를 입력해야 합니다.
그런데 이 비밀번호는 사용자에게 노출이 되어서는 안 되겠죠?
이 작업을 하기 위해
따라서 최상단 폴더에 .env로 파일을 하나 만들어줍니다.
1️⃣ .env 파일
DB_PASSWORD = ****
접속할 수 있는 비밀번호를 작성해서 저장해 줍니다.
2️⃣ config.js 파일
이제 config.json 파일을 열어줍니다.
여기서 env를 사용해야 하기 때문에 파일 확장자명을 .json → .js 로 변경해 줍니다.
그리고 내부 코드는 다음과 같이 살짝 변경해 줍니다.
const dotenv = require('dotenv');
dotenv.config();
// 설치한 dotenv 파이브러리를 사용하겠다는 뜻
module.exports = {
development: {
username: 'root',
password: process.env.DB_PASSWORD,
database: 'test', // 가지고 있는 데이터베이스 이름 입력
host: '127.0.0.1',
port: '3306',
dialect: 'mysql',
},
test: {
username: 'root',
password: process.env.DB_PASSWORD,
database: 'test',
host: '127.0.0.1',
port: '3306',
dialect: 'mysql',
},
production: {
username: 'root',
password: process.env.DB_PASSWORD,
database: 'test',
host: '127.0.0.1',
port: '3306',
dialect: 'mysql',
},
};
저는 미리 mysql에 'test'라는 데이터베이스를 만들어놨었기 때문에 'test' 데이터베이스를 사용하겠다고 작성했습니다.
그리고 방금 .env 파일에서 작성한 내용들을 이용하기 위해 dotenv 라는 라이브러리를 활용했습니다.
이제 위와 같이 작성한 데이터베이스 정보를 토대로 연결을 진행할 것입니다.
3️⃣ models/index.js 파일
다음으로 models/index.js 파일을 열어줍니다.
그러면 되게 많은 코드들을 볼 수 있는데, 모두 선택해서 delete 합니다.
해당 파일에서 Sequelize라는 객체를 만들어서 이 객체를 app.js에 가져가 쓸 예정입니다.
const Sequelize = require('sequelize');
const config = require('../config/config');
const env = 'development'; // cross-env를 활용하여 배포용일 때는 production으로 적용
// cross-env : 명령어에 따라 달라지게 .env를 등록해줌
const dbconfig = config[env]; // config.js의 development 설정 = 개발용 데베 가져왔다
// dbconfig에는 confing.js에서 development의 정보들이 들어있음
// 만든 user 테이블 정보 가져오기
const user = require('./user');
const sequelize = new Sequelize(
dbconfig.database,
dbconfig.username,
dbconfig.password,
dbconfig
);
const db = {};
// 객체 값 채워주기
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
4️⃣ app.js 파일
방금 수정한 models/index.js 파일 정보를 가져와 db연결을 하겠습니다.
콘솔창에 지정한 로그가 잘 뜨면 성공한 것입니다.
const express = require('express');
const db = require('./models/index');
const app = express();
app.use(express.json(), express.urlencoded({ extended: false }));
// json() 데이터를 읽게 해주고 body-parser
// url 데이터를 query나 param을 nodejs 내부 모듈로 읽겠다. 확장 프로그램 허용X
db.sequelize
.sync()
.then(console.log('DB연결 성공!!'))
.catch(err => console.log(err));
app.listen(3000, () => {
console.log('3000번으로 서버 실행 중');
});
5. 테이블 만들어보기
db연결은 끝났으니, 이제 sequelize를 이용하여 쿼리문 없이 테이블을 만들어 보겠습니다.
models 폴더에 user.js 파일을 만들어줍니다(users 테이블을 만들예정입니다).
1️⃣ models/user.js 파일
// user 테이블 만들기
// 제약조건이랑 스키마 설정
const Sequelize = require('sequelize');
// sequelize를 통해 연결된 DB에 쿼리문(SQL문) 없이
// 자동으로 만들 테이블에 관한 설정
class User extends Sequelize.Model {
static init(sequelize) {
return super.init(
// 여기에 정보를 적어두면 됨
{
// 테이블 컬럼 스미카 및 제약조건
// user테이블에 필요한 컬럼명
email: {
type: Sequelize.STRING(100),
allowNull: false,
unique: true,
comment: '이메일',
},
password: {
type: Sequelize.STRING(100),
allowNull: false,
comment: '비밀번호',
},
},
{
// 테이블 정보
modelName: 'User',
tableName: 'users',
charset: 'utf8mb4',
createdAt: true,
updatedAt: true,
sequelize,
}
);
}
}
module.exports = User;
2️⃣ models/index.js 파일
아까 만들었던 models/index.js 파일을 열어줍니다.
여기에 좀전에 만들었던 user.js 파일에 있는 users 테이블 정보를 가져오려고 합니다.
그리고 db 객체에 넣어주기만 하면 됩니다.
// 테이블에 대한 정보와 config에 대한 정보를 모아서
// sequelize라는 객체를 만드는데 이 객체를 app.js에 가져가서
// 쓸 예정
const Sequelize = require('sequelize');
const config = require('../config/config');
const env = 'development'; // cross-env를 활용하여 배포용일 때는 production으로 적용
// cross-env : 명령어에 따라 달라지게 .env를 등록해줌
const dbconfig = config[env]; // config.js의 development 설정 = 개발용 데베 가져왔다
// dbconfig에는 confing.js에서 development의 정보들이 들어있음
// 만든 user 테이블 정보 가져오기
const user = require('./user');
const sequelize = new Sequelize(
dbconfig.database,
dbconfig.username,
dbconfig.password,
dbconfig
);
const db = {};
db.User = user;
Object.keys(db).forEach(name => {
db[name].init(sequelize);
});
// 객체 값 채워주기
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
'백엔드 > NodeJS' 카테고리의 다른 글
[NodeJS] 환경변수 .env (0) | 2023.01.14 |
---|---|
[NodeJS] prettier & eslint 설정하기 (0) | 2022.12.27 |
[NodeJS] body-parser란? (0) | 2022.12.02 |
[NodeJS] NodeJS(express) + React 연동하기 (0) | 2022.11.24 |
[NodeJS] nodeJS + mongoDB + EC2 권한 문제 해결하기(배포) (0) | 2022.11.24 |
- Total
- Today
- Yesterday
- CSS
- 머신러닝
- 프로젝트 회고
- 자바
- 리액트 훅
- JSP
- 리액트
- styled-components
- 파이썬
- react-query
- 딥러닝
- 인프런
- HTML
- 스타일 컴포넌트 styled-components
- TypeScript
- 타입스크립트
- testing
- Python
- 프론트엔드 공부
- next.js
- jest
- 데이터분석
- 프론트엔드
- rtl
- 디프만
- 자바스크립트 기초
- 자바스크립트
- 프론트엔드 기초
- frontend
- react
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |