강의 | NestJS | 2. DB연동

flobeeee·2024년 8월 2일
0

강의

목록 보기
16/16

1. Postgres 설치

강의에서 사용하는 데이터베이스

2. TypeORM

TypeORM은 node.js에서 실행되고 TS로 작성된 객체 관계형 매퍼 라이브러리입니다.

TypeORM은 MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana 및 WebSQL과 같은 여러 데이터베이스를 지원합니다.

3. ORM이란?

Object Relational Mapping

객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결하는 작업입니다.
ORM을 이용한 개발은 객체와 데이터베이스의 변형에 유연하게 사용할 수 있습니다.

  • TypeORM vs Pure Javascript
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은 다른 모듈과 쉽게 통합됩니다.

4. TypeORM 설치

  • TypeORM을 사용하기 위해서 설치해야하는 모듈들
  1. @nestjs/typeorm
    NestJS에서 TypeORM을 사용하기 위해 연동시켜주는 모듈

  2. typeorm
    TypeORM 모듈

  3. pg
    postgres 모듈

npm install pg typeorm @nestjs/typeorm --save

참고: https://docs.nestjs.com/techniques/database

5. Entity

왜 사용하나요?

원래 ORM없이 데이터베이스 테이블을 생성할 때를 먼저 보겠습니다.

CREATE TABLE board(
id INTEGER AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description VARCHAR(255) NOT NULL
)

이런 식으로 테이블을 생성해줍니다.
하지만 TypeORM을 사용할 때는 데이터베이스 테이블로 변환 되는 Class이기 때문에 위처럼 하지 않고 클래스를 생성한 후 그 안에 컬럼들을 정의해주면 됩니다.

6. Repository

레포지토리는 엔티티 개체와 함께 작동하며 엔티티 찾기, 삽입, 업데이트, 삭제 등을 처리합니다.

데이터베이스에 관련 된 작업은 서비스에서 하는 게 아닌 레포지토리에서 하면 됩니다.
이것을 Repository Pattern 이라고도 부릅니다.

*. 시행착오

레포지토리 만드는 과정에서
하나가 deprecated 되었다.

typeorm 3버전을 쓰고 있었는데 2버전으로 다운그레이드 했다.
(아래 문제에서 함께 해결되었다.)


  • err
    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


  • err
    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});

// 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 {}

profile
기록하는 백엔드 개발자

0개의 댓글

관련 채용 정보