ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NestJS 기본강의 - 3. TypeORM
    NestJS/NestJS 기본강의 2022. 7. 8. 16:02

    TypeORM 이란?

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

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

     

    ORM ( Object Relational Mapping ) 이란?

    - 객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결하는 작업이다

    - ORM을 이용한 개발은 객체와 데이터베이스의 변형에 유연하게 사용할 수 있다

     

    TypeORM vs Pure Javascript

    - TypeORM

    const boards = Board.find({ title: 'Hello', status: 'PUBLIC' });

    - Pure Javascript

    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은 다른 모듈과 쉽게 통합


    TypeORM을 사용하기 위해서 설치해야하는 모듈들

    - @nestjs/typeorm

        ㆍNestJS에서 TypeORM을 사용하기 위해 연동시켜주는 모듈

    - typeorm

        ㆍTypeORM 모듈

    - pg

        ㆍPostgres 모듈

    npm install pg typeorm @nestjs/typeorm --save

     

    Entities

    : 엔티티를 이용해서 데이터베이스 테이블을 생성해준다. 그래서 엔티티 파일이 어디에 있는 설정

     

    왜 Entity를 생성해야하나?

    - TypeORM을 사용할 때는 데이터베이스 테이블로 변환되는 Class이기 때문에 클래스를 생성한 후 그안에 컬럼들을 정의

     

    import { Entity, BaseEntity, Column, PrimaryGeneratedColumn } from 'typeorm';
    import { BoardStatus } from './boards.model';
    
    @Entity()
    export class Board extends BaseEntity {
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column()
      title: string;
    
      @Column()
      description: string;
    
      @Column()
      status: BoardStatus;
    }

    - @Entity()

    : Entity() 데코레이터 클래스는 Board클래스가 엔티티임을 나타내는 데 사용된다. ( CREATE TABLE board 부분 )

     

    - @PrimaryGeneratedColumn()

    : PrimaryGeneratedColumn() 데코레이터 클래스는 id 열이 Board 엔티티의 기본 키 열임을 나타내는데 사용

     

    - @Column()

    : Column() 데코레이터 클래스는 Board 엔티티의 title 및 description과 같은 다른 열을 나타내는 데 사용

     

    Repository 란?

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

    - 공식 문서 주소

    : http://typeorm.delightful.studio/classes/_repository_repository_.repository.html 

     

     

    - @EntityRepository()

    : 클래스를 사용자 정의(CUSTOM) 저장소로 선언하는 데 사용된다

      사용자 지정 저장소는 일부 특정 엔티티를 관리하거나 일반 저장소일 수 있다.

    import { Repository } from 'typeorm';
    import { Board } from './board.entity';
    
    export class BoardRepository extends Repository<Board> {}

    Service에 Repository 넣어주기 ( Repository Injection )

    // Inject Repository to Service
      constructor(
        @InjectRepository(BoardRepository)
        private boardRepository: BoardRepository,
      ) {}

    - @InjectRepository

       : 이 데코레이터를 이용해서 이  서비스에서 BoardRepository를 이용한다고 이걸 boardRepository 변수에 넣어준다.

     

    Service에서 getBoardById 메소드 생성하기

    - typeOrm 에서 제공하는 findOne 메소드 사용하기

    - async await을 이용해서 데이터베이스 작업이 끝난 후 결과값을 받을 수 있게 하기

     

    데이터베이스에 관련된 로직은 Repository로 이동...

    - 리포지토리 패턴은 서비스에 있는 데이터베이스관련 로직을 Repository쪽으로 모아주면 된다.

     

    remove() vs delete() ?

    - remove : 무조건 존재하는 아이템을 remove 메소드를 이용해서 지워야한다. 그러지 않으면 에러 발생(404)

    - delete : 만약 아이템이 존재하면 지우고 존재하지 않으면 아무런 영향이 없다

       이러한 차이 때문에 remove를 이용하면 하나의 아이템을 지울 때 두번 데이터베이스를 이용해야하기 때문에(아이템 유무 + 지우기) 데이터베이스에 한번만 접해도 되는 delete를 사용

        const result = await this.boardRepository.delete({ id, user });
        if (result.affected === 0) {
          throw new NotFoundException(`Can't find Board with id ${id}`);
        }
        console.log('result', result);

    - 삭제되지 않았으면 affected===0 이므로 에러를 던져준다.

    'NestJS > NestJS 기본강의' 카테고리의 다른 글

    NestJS 기본강의 - 5. 권한 & 로그 & 설정  (0) 2022.07.11
    NestJS 기본강의 - 4. 인증  (0) 2022.07.08
    NestJS 기본강의 - 2. Pipe  (0) 2022.07.07
    NestJS 기본강의 - 1. 시작  (0) 2022.07.07

    댓글

Designed by Tistory.