그동안 MySQL을 이용해 개발할 때 Sequelize를 사용했었는데
이번에 진행중인 Node.js 프로젝트에서 TypeORM을 처음 사용해봐서 공부를 해보겠습니다..
우선 ORM이 뭔지부터 알아봐야하는데
ORM이란 Object-Relational Mapping의 약자로, 객체와 관계형 데이터베이스 간의 매핑을 제공하는 기술이다
(개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스를 다룰 수 있게 도와줌)
그럼 관계형 데이터베이스는 또 뭐냐,,,?
관계형 데이터베이스는 데이터를 테이블 형식으로 저장하고, 테이블 간의 관계를 이용하여 데이터를 조직화하는
데이터베이스 시스템이다.
=> 이러한 데이터베이스는 관계형 모델에 기반하고 있으며, 데이터를 행과 열의 형태로 표현하는 테이블을 사용함!
이런 관계형 데이터베이스 관리 시스템 RDBMS의 대표적인 예시가 현재 프로젝트에서 사용하는 MySQL!
그래서 TypeORM이 뭐느냐하면..
TypeScript와 JavaScript를 위한 객체 관계 매핑(ORM) 라이브러리로,
데이터베이스와 상호 작용할 때 객체 지향적인 접근 방식을 사용할 수 있게 해주는 도구라고 생각하면 된다
TypeORM은 엔터티를 정의할 때 클래스를 사용하며 이는 코드의 가독성과 재사용성을 높이는데 도움이 된다
(각 클래스의 멤버 변수는 데이터베이스의 열(Column)에 매핑)
그럼 바로 TypeORM을 사용하는 법을 알아보자~~
module.exports = {
host: "141.164.37.26",
port: 3306,
username: "test",
password: "비밀~",
database: "test",
};
configs/db.config.js
데이터베이스 연결에 필요한 정보를 포함하는 설정 파일을 만들어준다
=> 이 정보들은 TypeORM과 같은 ORM(Object-Relational Mapping) 라이브러리를 사용하여 Node.js에서
MySQL 데이터베이스에 연결할 때 필요함!
module.exports = class User {
constructor(id, username, password, name, studentId) {
this.id = id;
this.username = username;
this.password = password;
this.name = name;
this.studentId = studentId;
}
};
models/user.model.js
이렇게 User 객체를 생성하는 파일을 하나 만들어주고
const EntitySchema = require("typeorm").EntitySchema;
const User = require("../models/user.model");
module.exports = new EntitySchema({
name: "User",
target: User,
columns: {
id: {
primary: true,
type: "bigint",
generated: true,
},
username: {
unique: true,
type: "varchar",
nullable: false,
},
password: {
type: "varchar",
nullable: false,
},
name: {
type: "varchar",
nullable: false,
},
studentId: {
name: "student_id",
type: "varchar",
nullable: false,
},
},
});
entities/user.entity.js
(우선 entitiy가 뭔지 알아야하는데 엔터티는 데이터베이스 테이블과 매핑되는 객체이다!)
EntitySchema는 TypeORM에서 엔터티를 정의하기 위한 스키마를 생성해준다
위의 코드처럼 EntitySchema를 사용하여 User 클래스를 엔터티로 정의한다.
(target 속성에는 매핑할 클래스를 지정하고, columns 속성에는 데이터베이스 테이블의 열을 정의)
=> target 속성에 User 클래스를 지정함으로써, 이 엔터티는 User 클래스와 매핑됨
이를 통해 TypeORM은 엔터티를 기반으로 데이터베이스 테이블을 생성하고, 이 스키마를 통해 컬럼의 타입 및 다양한 설정을 정의할 수 있다!
const { DataSource } = require("typeorm");
const config = require("./configs");
module.exports = new DataSource({
type: "mysql",
synchronize: true,
logging: true,
entities: ["./entities/*.js"],
migrations: [],
subscribers: [],
...config.db,
});
data-source.js
위의 코드는 TypeORM에서 데이터 소스를 설정하고 생성하기 위한 코드이다
DataSource는 TypeORM에서 데이터베이스에 연결할 때 사용되는 클래스이며
(연결 설정을 담당)
중요 부분을 살펴보면
1. entities 속성은 TypeORM이 데이터베이스와 매핑할 엔터티(모델)들의 위치를 나타내고
2. ... 연산자 (JavaScript에서 전개 연산자)를 사용하여 configs/db.config.js 파일을 펼쳐서 인수로 전달하고 있다
const AppDataSource = require("../data-source");
module.exports = AppDataSource.getRepository(require("../models/user.model"));
repositories/user.repository.js
이 코드는 TypeORM에서 데이터베이스와 상호 작용할 때 사용되는 Repository를 얻어오는 부분이다
TypeORM에서 Repository는 데이터베이스 테이블과 상호 작용하는데 사용되는 객체로, 해당 테이블의 레코드를 만들거나 조회, 업데이트, 삭제하는 등의 작업을 수행할 수 있다!
data-source.js 파일에서 애플리케이션의 데이터베이스 연결을 나타내는 DataSource 객체를 가져오고
getRepository를 통해 특정 엔터티에 대한 Repository를 얻어온다
module.exports를 사용하여 다른 파일에서 이 Repository를 가져와 사용할 수 있도록 내보냄
=> 이제 User 모델에 대한 Repository를 다른 파일에서 사용할 수 있게 됨!
CREATE USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀~';
CREATE USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '비밀~';
CREATE DATABASE `test`;
GRANT ALL PRIVILEGES ON `test`.* TO 'test'@'localhost';
GRANT ALL PRIVILEGES ON `test`.* TO 'test'@'%';
FLUSH PRIVILEGES;
db.sql
MySQL 데이터베이스에 새로운 사용자를 생성하고, 해당 사용자에게 특정 데이터베이스에 대한 모든 권한을 부여하는 SQL 스크립트이다
=> 이러한 스크립트를 실행하면 'test' 사용자가 생성되고, 'test' 데이터베이스에 대한 권한이 부여된다!
(이후에는 'test' 사용자를 통해 해당 데이터베이스에 접근할 수 있게 됨)
'Backend > Node' 카테고리의 다른 글
[Node.js] Nodemailer를 사용하여 회원가입시 이메일 인증 구현하기 (0) | 2024.05.07 |
---|---|
AWS를 이용하여 Node.js + MongoDB 배포하기 [Co-Code] (0) | 2024.04.06 |
CORS란 무엇일까? (1) | 2024.02.04 |
JWT 토큰 (1) | 2024.01.31 |