일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 자바스크립트 프로미스
- javascript closure
- CSS
- HTML
- 자바스크립트 async await
- html 주석
- 리액트 함수형 컴포넌트
- 프론트엔드 리액트
- 자바스크립트 클로저
- 자바스크립트 실행 컨텍스트
- 자바스크립트 promise
- 자바스크립트 생성자 함수
- 프론트엔드
- javascript
- 웹 개발 트렌드
- 자바스크립트 scope
- 자바스크립트 연산자
- 리액트 개념
- css position
- 티스토리챌린지
- 자바스크립트 클래스
- css3
- 자바스크립트 상속
- 자바스크립트 반복문
- 오블완
- javascript opreator
- html 코드
- 자바스크립트
- javascript opreators
- css 포지션
- Today
- Total
Multi Developer SuHo
Node js ORM 시퀄라이즈란? (데이터베이스를 쉽게 제어할 수 있는 라이브러리 ) 본문
Node js ORM 시퀄라이즈란? (데이터베이스를 쉽게 제어할 수 있는 라이브러리 )
Dreaming Developer Student 2025. 3. 24. 10:41안녕하세요 오늘은 Node js에서 SQL 쿼리문을 직접 작성하지 않고 자바스크립트 코드로 데이터베이스를 제어할 수 있도록 도와주는 라이브러이인 Sequelize에 대해 알아보겠습니다.
📑목차
1. ORM (Object-Relational-Mapping)
1-1. ORM란?
1-2. ORM 특징
1-3. ORM 탄생 배경
2. Sequelize
2-1. Sequelize 란?
2-2. Sequelize 라이브러리 설치
2-3. Sequelize 특징
2-4. Sequelize 문법
2-5. Sequelize 모델 생성 (클래스 init 메서드 호출 형태)
2-6. 테이블 필드 속성 종류
2-7. 테이블 속성 종류
서론
본문으로 들어가기 전 Sequelize에 대해 들어보신적 있으신가요? "시퀄라이즈" 라고 했을때 개발 분야라면 들어보셨을 겁니다. 저도 "Sequelize" 에 대해 학습한적 이 없어서 이번 기회에 자세히 알고자 합니다. 그럼 본문으로 들어가겠습니다.
본론
1. ORM (Object-Relational-Mapping)
1-1. ORM란?
객체와 관계형 데이터베이스를 SQL문 작성없이도 자동으로 매핑(연결)해주는 것을 뜻합니다.
1-2. ORM 특징
OOP(객체 지향 프로그래밍)에서 사용되는 객체의 프로그래밍을 관계형 데이터베이스의 테이블과 매핑해서 이전에 SQL을 작성하는것을 하지않고, 데이터베이스와 상호작용을 할 수 있습니다.
객체를 전달하면 원하는 형태의 SQL문을 작성해서 데이터베이스와 상호작용할 수 있습니다.
필드 즉, 엔티티를 정의할때 객체의 형태 필드에 저장하는 데이터의 형태를 객체로 매핑하면 좀 더 데이터의 관리의 가독성이 높아진다.
1-3. ORM 탄생 배경
객체와 관계형 데이터를 다룰때 불일치를 해결하기 위해서 탄생하게되었습니다. 초기에는 SQL문을 자동으로 생성하고
실행하는 간단한 내용으로 탄생하게 되었습니다. 이후 점점 스키마와 객체의 모델을 매핑하는 기술로 발전하였고, 데이터베이스를 다룰때 SQL문을 직접 작성하지 않고 개발 생산성과 가독성을 높이기 위해 사용됩니다.
2. Sequelize (시퀄라이즈)
2-1. Sequelize (시퀄라이즈) 란?
node js에서 mysql 등 RDBMS(관계형 데이터베이스)를 쉽게 작업할 수 있도록 도와주는 라이브러리를 말합니다
2-2. Sequelize 라이브러리 설치
$ npm i sequelize
2-3. Sequelize 특징
1. ORM 중 하나로, 객체와 데이터베이스를 매핑(연결)하는데 도와줍니다.
2. 자바스크립트 구문으로 객체를 메서드의 매개변수로 전달하게 되면 SQL의 작성을 해서 데이터베이스를 제어할 수 있도록 도와준다.
2-4. Sequelize 문법
const { Sequelize } = require('sequelize');
// 연결 속성을 가지고 있는 객체
// Sequelize 매개변수로 {} 속성을 전달하지 않고
// 매개변수의 순서 첫번째 데이터베이스 이름
// 매개변수 두번째 사용자 계정 이름
// 매개변수 세번째 사용자 계정 비밀번호
// 매개변수 네번째 객체의 값으로 호스트와 데이터베이스 종류
const sequelize = new Sequelize(
'project',
'myid',
'admin123!',
{
host : 'localhost',
dialect : 'mysql'
}
)
// 커넥션 요청을 할 객체
// 동기화및 커넥션 요청
// 동기화 당시 테이블의 값을 모두 제거하고 새로 생성할건지 속성정의를 force 키의 값으로 전달 true가 초기화 삭제 false 초기화 X
sequelize.sync({ force : false }).then(() => {
console.log("데이터베이스 동기화 됬다.")
})
하나하나 문법을 살펴보도록 하겠습니다.
먼저 sequelize 라이브러리를 가져옵니다.
const { Sequelize } = require('sequelize');
그 다음 새로운 객체인 Sequelize를 생성합니다.
-- 매개변수의 순서 --
1. 첫번째 데이터베이스 이름
2. 매개변수 두번째 사용자 계정 이름
3. 매개변수 세번째 사용자 계정 비밀번호
4. 매개변수 네번째 객체의 값으로 호스트와 데이터베이스 종류 및 포트
const sequelize = new Sequelize(
process.env.DATABASE_NAME, // 사용할 데이터 베이스 이름
process.env.DATABASE_USER, // 사용할 데이터 베이스 계정
process.env.DATABASE_PASSWORD, // 사용할 데이터 베이스 비번
// 여기서부터는 네 번째 매개변수를 받는데 객체로 받는다.
{
// 사용할 데이터베이스와, 호스트, port 정보를 받을 수 있습니다.
host : process.env.DATABASE_HOST,
dialect : "mysql", // 사용할 데이터베이스 지정하는 속성
port : process.env.DATABASE_PORT
}
);
이 코드를 보면 node js 환경에서 제공해주는 process 객체안에 환경 변수를 포함하는 env에 접근하여 설정한 환경 변수를 가져옵니다.
다음 코드입니다.
sequelize.sync({ force : false }).then(() => {
console.log("데이터베이스 동기화 됬다.")
})
sequelize.sync( ) : Sequelize 정의한 모델과 데이터베이스 테이블을 동기화 하는 함수
force 옵션
1. force : true 인 경우
이 경우에는 강제로 기존 테이블을 삭제하고 다시 생성합니다.
sequelize.sync({ force : true })
2. force : false 인 경우
false 인 경우에는 기존 테이블을 유지하면서, 테이블이 없을 시 생성합니다.
sequelize.sync({ force : false })
2-5. Sequelize 모델 정의 (클래스 init( ) 메서드 호출 형태)
먼저 sequlize 라이브러리 안에 있는 Model 객체와 DataTypes 객체를 가져옵니다
const { Model, DataTypes } = require("sequeluze");
Model 객체는 Sequelize에서 제공하는 기본 클래스로, 이를 상속받아 데이터베이스 테이블을 다루는 모델을 정의할 수 있습니다.
DataTypes 객체는 Sequelize에서 제공하는 데이터타입 들을 정의한 객체를 말합니다.
const {Model , DataTypes} = require('sequelize');
class Posts extends Model {
static init (sequelize) {
return super.init({
content : {
type : DataTypes.STRING(100),
allowNull : false
}
}, {
sequelize,
timestamps : false,
underscored : false,
modelName : 'Post',
tableName : 'posts',
paranoid : false,
charset : "utf8mb4",
collate : "utf8mb4_general_ci"
})
}
static associate(models) {
models.Posts.belongsTo(models.Users, { foreignKey : "user_name", target : "name", onDelete : "CASCADE" });
}
}
이 코드를 설명하면 Posts 클래스는 Model 클래스에서 상속받고 있습니다. Model 클래스를 상속받게 되면 데이터베이스와 상호작용할 수 있습니다. Posts.create( ) 이런 메서드를 사용할 수 있다는 것이죠.
일부분을 나눠서 살펴보겠습니다
static init (sequelize) {
return super.init({
content : {
type : DataTypes.STRING(100),
allowNull : false
}
}, {
sequelize,
timestamps : false,
underscored : false,
modelName : 'Post',
tableName : 'posts',
paranoid : false,
charset : "utf8mb4",
collate : "utf8mb4_general_ci"
})
}
여기서 중요한 점은 왜 static init(sequelize) 를 왜 매개변수로 받느냐 입니다. 그 이유는 sequelize는 new Sequelize로 생성된 인스턴스(객체)입니다. Sequelize 모델은 데이터베이스 연결을 통해 정의하고, 초기화되기 때문에, 이 매개변수로 전달된 sequelize 인스턴스를 사용해 모델과 데이터베이스를 연결하는 이유입니다.
return super.init({
} , {
})
여기서 return super.init ( ) 메서드는 테이블을 생성하고 데이터베이스와 매핑한 테이블을 반환하는 메서드를 말합니다.
첫 번째 객체에서는 테이블 필드를 정의하고, 두 번째 객체에는 테이블 속성들을 정의합니다.
2-6. 테이블 필드 속성 종류
1. type : 자료형을 나타냅니다. (STRING, INT, DOBULE 등등..)
2. allowNull : NULL 값이 허용할지 여부 true or false
3. autoIncrement : 해당 컬럼이 자동 증가할지 여부
4. defaultValue : 기본값을 지정하는 속성
2-7. 테이블 속성 종류
1. sequelize : Sequelize 모델이 어떤 데이터베이스를 연결을 사용할지 지정, sequelize는 연결된 Sequelize 인스턴스를 전달받습니다.
2. timestamps : 모델에 createAt (생성시간), updateAt (수정시간) 필드를 자동으로 생성할지 여부
3. underscored : 필드 이름을 스네이크 표기법으로 지정할지 여부 (true 일시 스네이크 표기법)
4. modelName : Sequelize 에서 사용하는 모델의 이름
5. tableName : 실제 데이터베이스 테이블 이름
6. paranoid : 삭제 시간을 기록할지 여부
7. charset : 문자 인코딩 방식 설정, 다양한 유니코드 문자를 인코딩 방식 "utf8mb4"
8. collate : 문자 정렬 규칙 설정, 대소문자를 구분하지 않는 정렬 규칙 "utf8mb4_general_ci"
마지막으로 Sequelize에서 모델 간의 관계를 설정하는 코드를 보겠습니다.
static associate(models) {
models.Posts.belongsTo(models.Users, { foreignKey : "user_name", target : "name", onDelete : "CASCADE" });
}
여기서 belongsTo는 1:1 (일대일 관계) M:N (다대다 관계) 에서 사용됩니다.
외래키인 "user_name"을 지정하였고 name
belongsTo : 자식 모델이 부모 모델에 속한다는 관계를 말합니다.
hasMany : 부모 모델이 자식모델을 여러개 가질 수 있는 관계를 말합니다.
CASCADE : 부모 레코드가 삭제되면 자식 레코드도 함께 삭제되는 동작
sourceKey : 관계를 설정할 때 외래키가 다른 모델의 기본키가 아니라 특정 필드를 참조해야 할 때 를 사용합니다
결론
Sequelize는 Node.js에서 관계형 데이터베이스와 쉽게 상호작용할 수 있도록 돕는 ORM(Object-Relational Mapping) 라이브러리입니다. 모델 정의, 데이터베이스 관계 설정, 쿼리 실행 등 다양한 기능을 제공하여 개발자가 데이터베이스 작업을 더 직관적으로 처리할 수 있게 해줍니다. Sequelize는 관계형 데이터베이스와의 상호작용을 단순화하고, SQL을 작성하지 않고도 데이터를 호율적으로 처리할 수 있습니다.
'Node.js 기록' 카테고리의 다른 글
Node js Cors(Cross-Origin Resource Sharing)란? (0) | 2025.03.15 |
---|---|
Node js AJAX, Fetch, Axios, Form 태그의 요청과 차이 (1) | 2025.03.15 |
Node js JWT 토큰(JSON Web Token)이란 (0) | 2025.03.13 |
Node js Multer 모듈로 이미지 업로드 (0) | 2025.03.13 |
Node js [GET 방식과 POST 방식, 요청 객체(Requset), 응답 객체(Response) ] (0) | 2025.03.10 |