강의에서 사용하는 데이터베이스
TypeORM은 node.js에서 실행되고 TS로 작성된 객체 관계형 매퍼 라이브러리입니다.
TypeORM은 MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana 및 WebSQL과 같은 여러 데이터베이스를 지원합니다.
Object Relational Mapping
객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결하는 작업입니다.
ORM을 이용한 개발은 객체와 데이터베이스의 변형에 유연하게 사용할 수 있습니다.
const boards = Board.find({title: "Hello", status: "PUBLIC"})
db.query('SELECT * FROM boards WHERE title = "Hello" AND status = "PUBLIC"
, (err, result) => {
if (err) {
throw new Error("Error")
}
boards = result.rows;
}
TypeORM 특징과 이점
모델을 기반으로 데이터베이스 테이블 체계를 자동으로 생성합니다.
데이터베이스에서 개체를 쉽게 삽입, 업데이트 및 삭제할 수 있습니다.
테이블 간의 매핑 (일대일, 일대 다 및 다 대다)을 만듭니다.
간단한 CLI명령을 제공합니다.
TypeORM은 간단한 코딩으로 ORM 프레임워크를 사용하기 쉽습니다.
TypeORM은 다른 모듈과 쉽게 통합됩니다.
@nestjs/typeorm
NestJS에서 TypeORM을 사용하기 위해 연동시켜주는 모듈
typeorm
TypeORM 모듈
pg
postgres 모듈
npm install pg typeorm @nestjs/typeorm --save
참고: https://docs.nestjs.com/techniques/database
왜 사용하나요?
원래 ORM없이 데이터베이스 테이블을 생성할 때를 먼저 보겠습니다.
CREATE TABLE board(
id INTEGER AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description VARCHAR(255) NOT NULL
)
이런 식으로 테이블을 생성해줍니다.
하지만 TypeORM을 사용할 때는 데이터베이스 테이블로 변환 되는 Class이기 때문에 위처럼 하지 않고 클래스를 생성한 후 그 안에 컬럼들을 정의해주면 됩니다.
레포지토리는 엔티티 개체와 함께 작동하며 엔티티 찾기, 삽입, 업데이트, 삭제 등을 처리합니다.
데이터베이스에 관련 된 작업은 서비스에서 하는 게 아닌 레포지토리에서 하면 됩니다.
이것을 Repository Pattern 이라고도 부릅니다.
레포지토리 만드는 과정에서
하나가 deprecated 되었다.
typeorm 3버전을 쓰고 있었는데 2버전으로 다운그레이드 했다.
(아래 문제에서 함께 해결되었다.)
Type 'string' has no properties in common with type 'FindOneOptions< Board>'
@Get('/:id')
getBoardById(@Param('id') id: number) : Promise<Board> {
return this.boardsService.getBoardById(id); //id에 빨간줄 뜸
}
typeorm 3버전을 쓰고 있었는데 2버전으로 다운그레이드 했다.
해결에 참고한 url
Type 'number' has no properties in common with type 'FindOneOptions<Board>'.
const found = await this.boardRepository.findOne(id);
//id 에러남
const found = await this.boardRepository.findOneBy({id: id});
err
post api 호출시, 테이블을 생성하는 create 인식 불가
해결방법: 아래 링크 참고하여 소스 보완
[Nest.js] postgreSQL, typeORM 적용시켜보기
// board.repository.ts
import { DataSource, Repository } from "typeorm";
import { Board } from "./board.entity";
import { Injectable } from "@nestjs/common";
@Injectable()
export class BoardRepository extends Repository<Board> {
constructor(datasource: DataSource) { // 추가
super(Board, datasource.createEntityManager()); // 추가
}
}
// boatd.module.ts
import { Module } from '@nestjs/common';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';
import { BoardRepository } from './board.repository';
import { Board } from './board.entity'; // 추가
import { TypeOrmModule } from '@nestjs/typeorm'; // 추가
@Module({
imports: [TypeOrmModule.forFeature([Board])], // 추가
controllers: [BoardsController],
providers: [BoardsService, BoardRepository]
})
export class BoardsModule {}