Judaeng
TypeORM 본문
ORM?
ORM 알아보기
++자바스크립트 ORM이 아니라 ORM이 무엇인지, 어떤 개념인지 알아보고 공부하기 위해 작성한 것입니다. 자바스크립트 프레임워크로는 TYPEORM, Prisma, Sequelize, BOOKSHELF.JS 등이 있습니다. ORM(Object Relat.
hi-judaeng.tistory.com
🤷♂️TypeORM이란?
TypeScript와 JavaScript(ES5, ES6, ES7) ORM이다. -> Sequelize는 여기서 따로 정리하지 않을 것이다.
MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL 데이터베이스를 지원한다.
나는 주로 MySQL을 사용한다.
🤷♂️TypeORM을 사용하는 이유는?
나 같은 경우는 NestJS를 사용하기 때문에 TypeORM을 사용하는 것이 맞다고 판단했다.TypeScript로 이루어진 NestJS는 ORM도 TypeORM으로 사용해야 호환이 잘 될 것이라고 생각했다.이 외에도 장점은 Sequelize에 비해 상대적으로 TypeORM이 속도가 빠르다.
TypeORM은 코드 작성이 raw쿼리에 좀 더 가깝다.
등이 있다.
✏️ 설치
먼저 TypeScript와 TypeORM을 install 해야 한다.
컴퓨터에 전역으로 설치하고 싶다면 -g 옵션을 붙여주면 된다.
아래 설치는 필요한 것들을 설치하는 것이다. 다른 것을 설치 안 해서 에러가 난다면 확인하고 설치하도록 하자.
// typescript 설치
$ npm install -g typescript
// ts-node 설치
$ npm install ts-node
// typeorm만 global 설치
$ npm install -g typeorm
// mysql2, typeorm, @nestjs/typeorm 설치(2)
$ npm install mysql2 typeorm @nestjs/typeorm
// reflect-metadata 설치
$ npm install reflect-metadata
1. @nestjs/typeorm - NestJS에서 TypeORM을 사용하기 위해 연동시켜주는 모듈이다.
2. typeorm - 실제 TypeORM을 설치
3. mysql2 - MySQL 데이터베이스 연결 시 사용
4. ts-node - typescript를 즉각적으로 컴파일해서 서버를 돌리기 위한 도구(런타임)
5. reflect-metadata - 이 패키지를 사용하면 유형에 대한 런타임 반영을 수행할 수 있다.
TypeORM은 대부분 데코레이터와 함께 작동하므로 이 패키지는 이러한 데코레이터를 구문 분석하고 SQL 쿼리를 작성하는 데 사용한다.
설치를 했다면 app.modules.ts에 이 모듈을 import 해주어야 한다.
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './users/user.entity';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
entities: [User],
synchronize: true,
logging: true,
}),
],
})
export class AppModule {}
위에 코드에서 나 같은 경우엔 데이터베이스 정보들을 dotenv 라이브러리를 사용해서 노출을 막았다.
NestJS에서는 따로 dotenv설치가 있는 것 같았다. 하지만 나는 똑같이 설치하고 사용했다.
설치하고 코드 위에서 import 해서 사용하면 된다. -> import * as dotenv from 'dotenv';
- entities 옵션: 내가 작성한 Entity를 데이터베이스에 정의하기 위해 배열 안에 Entity 이름을 넣어준다.
- synchronize 옵션: 엔티티를 만들고 나면 테이블을 자동으로 생성한다.-> 개발 모드에서만 사용하는 것이 좋다고 한다.
- logging 옵션: DB Log를 보여주는 옵션이다.
위에처럼 데이터베이스 정보를 작성했다면, entity 폴더를 하나 만들어서 그 안에 만들어야 할 테이블을 정의한다.
TypeORM에선 Entity를 테이블과 같다고 표현한다. Entity 설정을 시작해보자.
✏️ Entity 설정
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column({ nullable: true }) // NULL을 허용하겠다!
lastName: string;
@Column({ default: true }) // 기본 값은 true!
isActive: boolean;
}
- @Entity(): 해당 클래스는 DB user 테이블과 매핑시킬 때 사용
- @Column(): 해당 클래스 속성과 DB user 테이블 컬럼과 매핑시킬 때 사용
- @Unique() - 유니크 컬럼을 설정할 때 사용(배열 형태로 원하는 컬럼 값을 지정하면 된다)
- @CreateDateColumn(): 데이터가 생성되는 시간을 기록할 때 사용
- @UpdateDateColumn(): 데이터가 수정되는 시간을 기록할 때 사용
- @PrimaryGeneratedColumn(): uuid 값을 지정하면 해당 컬럼은 uuid 타입으로 설정이 되며, Auto Increment 타입으로 설정
- Auto_Increment : @PrimaryGeneratedColumn()
- UUID: @PrimaryGeneratedColumn('uuid')
위처럼 Entity를 작성했다면, 서버를 띄울 때 데이터베이스 안에 테이블이 성공적으로 만들어지는 것을 확인할 수 있다.
가짜 데이터베이스가 아닌, 진짜 데이터베이스를 만든다고 가정하고, 모듈화를 진행한다면 app.modules.ts 말고, 예를 들어 Movies라는 폴더를 만들고, Movie를 만드는 기능(Create) 등을 만들어서 Movie.modules.ts, Controller, Service 등이 따로 있다면 Movie.modules.ts에 imports에 옵션을 줘야 한다.아래는 예시일 뿐이다. 비슷하겠지만 만약 기능별로 폴더를 나눈다면 아래처럼 forFeature메서드를 사용해줘야 한다.
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { movie } from '디렉토리 경로'
@Module({
imports:[TypeOrmModule.forFeature(['app.modules에 연결할 엔티티', movie])],
controllers: [MovieController],
providers: [MovieService]
})
forFeature메서드는 Service Repository 클래스에 전달하는 역할을 해준다.
이것은 NestJS에 Controller, Module, Service에 대한 개념이 잡혀있어야 편하게 모듈화 해서 엔티티를 사용할 수 있을 것 같다. 여기서 따로 Repository에 대해서 이야기하지 않겠다.
이것을 마무리로 TypeORM이란 무엇인지 알아보았고, 설치, 사용법까지 정리했다.
++ 추가
만약에 잘 안된다면, mysql 서버는 잘 띄워져 있는지, mysql database가 잘 만들어져 있는지 확인하고, 그 외에 mysql 에러는 권한 문제였던 것 같다.
기본적인 것들은 확인하면 금방 해결될 것이고, 권한 문제는 검색을 잘 활용하여 해결하면 된다. 🤯
물론 나는 기본적인 것도 확인 안 해서 시간을 많이 버리게 돼서 정리하는 것이다 ^^;
🤔 블로그 정리 후, 느낀 점
최근에 챗봇을 TypeScript로 리팩터링 하게 됐는데, 그 과정에서 NestJS + TypeORM을 사용하게 되었다.
그래서 TypeORM을 공부하고, 설치하고, 사용해보게 됐는데 생각보다 너무 복잡했다.
Sequelize를 사용하다가 TypeORM을 사용하려니 당연히 어려웠다.
Sequelize는 모델 정의를 CLI로 해주면 자동으로 테이블을 만들어준다.
하지만 TypeORM은 CLI로 지정하는 것이 없었다.
ts로 테이블 정보를 만든 건 이번이 처음이었다.
그래서 많이 어색하고 어려웠던 것 같다.
NestJS에 TypeORM을 적용하려면 NestJS의 구조를 자세하게 공부할 필요가 있는 것 같았다.
처음이라 너무 어려웠던 경험이었다. 그래서 더 자세하게 블로그를 작성하고 싶었다.
다음에 사용하게 됐을 땐, 실수를 줄이고, 시간을 아끼고 싶은 마음이 매우 크다. 😅
Active Record vs Data Mapper
- Active Record: 규모가 작은 애플리케이션에서 적합하고 간단히 사용할 수 있다.
- Data Mapper: 규모가 큰 애플리케이션에 적합하고 유지 보수하는데 효과적이다.
📝이번 게시물을 만들기 위해 참고한 사이트
'Develop > ORM' 카테고리의 다른 글
Sequelize (1) - sequelize와 sequelize-cli, 모델 정의하기 (0) | 2021.09.27 |
---|---|
ORM 알아보기 (0) | 2021.04.13 |