-
NestJS 기본강의 - 3. TypeORMNestJS/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