TypeORM이란?
node.js에서 실행되고 TypeScript로 작성된 객체 관계형 매핑 라이브러리
MysQL, PostgreSQL, Maria, SQLite 등 여러 데이터 베이스를 지원한다.
ORM이란 ? [ Object Relational Mapping ]
객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결하는 작업
ORM을 사용하여 개발하면 객체와 데이터베이스와의 관계를 유연하게 변형하여 사용 가능하다.
[ 객체 지향 : 클래스 <---(매핑)--- RDB : 테이블 ]
TypeORM의 장점
- 모델을 기반으로 DB의 테이블 체계를 자동으로 생성 및 유지
- DB에서 개체를 쉽게 삽입, 갱신, 제거 가능
- 테이블 간의 매핑을 일대일 , 일대다, 다대다 로 형성하는 것이 가능
- 간단한 CLI 명령어 제공
- 다른 모듈과 쉽게 통합 가능
TypeORM 관련 모듈 | |
@nestjs/typeorm | - NestJS에서 TypeOrm을 사용하기 위해 연동시켜주는 모듈 |
typeorm | - TypeORM 모듈 |
사용한 DB 모듈 ( sql, postgrs, maria .. ) | - 관련된 모듈 설치 npm .. |
TypeORM을 NestJs에 적용하기
[1] typeORM 설정파일 생성 ( typeorm.config)
[2] typeORM 설정파일 작성
export const typeORMconfig : TypeOrmModuleOptions = {
type: 'mySQL',
host: '127.0.0.1',
port: 5432,
username: 'admin',
password: '1234',
database: 'test-db'
entities: [__dirname='../**/*.entitiy.(js,ts)'],
synchronize: true
}
- sychronize true는 production 모드에서는 false로 하는 것을 추천함 ( 데이터의 안전성 이유 )
( true : 애플리케이션을 다시 실행할 때, 수정된 컬럼의 길이 타입 변경값들을 해당 테이블로 Drop하고 다시 생성함 )
- entities는 나중에 생성할 엔티티를 하나씩 넣어도 되고, 위 처럼 모든 엔티티를 포함하게 하는 것도 가능함
[3] 루트 모듈에서 typeORM 모듈을 import 한다.
/* app.module.ts */
@Module({
import: [
TypeOrmModule.forRoot(typeOrmConfig),
BoardModule
],
})
export class AppMoude {}
- forRoot 안에 넣어준 설정은 모든 Sub-Moudle의 부수적인 모듈들에 다 적용된다.
게시물을 위한 엔티티 생성하기 [ Entitiy ]
Entity란?
- 테이블로 변환되는 typeorm 모듈 중 하나
엔티티 생성 예제 소스 코드
import { BaseEntity, Column, Entitiy, PrimaryGeneratedColumn }
import { BoardStatus } from "./boards.moudel";
@Entity()
export class Board extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
@Column()
status: BoardStatus;
}
@Entity() | - 해당 클래스가 엔티티임을 나타내는 데코레이터이다. ( CREATE TABLE board ) |
@PrimaryGeneratedColumn() | - pgc 데코레이터 클래스는 해당 열이 엔티티의 PK 열임을 나타내는 데 사용된다. |
@Column | - Column() 데코레이터는 열을 나타내는데 사용된다. |
Repository 계층
Repository란? 엔티티 개체와 함께 작동하여 CRUD를 처리하는 모듈 중 하나이다.
데이터 베이스와 관련된 일은 서비스 계층이 아닌 Repository라는 모듈에서 작업한다. ( Repository pattern )
( http://typeorm.delightful.studio/)
Repository 생성하기
[1] 리포지토리 파일 생성하기 : Board.repository.ts
[2] 생성한 파일에 리포지토리를 위한 클래스 생성하기
- 생성 시 Repo 클래스를 Extend 한다. ( Find, insert, Delete 등 엔티티를 컨트롤 한다.
- @EntityRepository() : 클래스를 사용자 정의 저장소로 선언하는 데 사용된다. ( 일부 특정 엔티티 관리 또는 일반 저장소 )
/* board.repository.ts */
import { EntityRepository, Repository } from "typeorm";
import { Board } from "./board.entity";
@EntityRepository(Board)
export class BoardRepository extends Repository<Board> {
}
[3] 생성한 Repo를 다른 곳에서도 사용하도록 (injectable) board module에서 import 한다.
/* board.module.ts */
@Module({
import: [
TypeOrmModule.forFeature([BoardRepository]),
],
controllers: [BoardController],
providers: [BoardService]
})
export class BoardModule { }
DB와 작업하기
- Service 계층에 Repository Injection 하기
@Injectable()
export class BoardService {
construtor(
@InjectRepository(BoardRepository)
private boardRepository: BoardRepository,
){}
- BoardRepo를 사용하기 위해 생성자에 Repo 변수를 선언한다.
[1] Service에서 GetBoardById 메소드 생성하기
- typeorm에서 제공하는 findeone 메소드 사용하기
- async를 사용해 작업이 끝난 후 결과 값을 받도록 선언한다.
/* board.service.ts */
async createBoard(createBoardDto: CreateBoardDto): Promise<Board>
const { title, desciption } = createBoardDto;
const board = this.boardRepository.create({
title,
description,
status: BoardStatus.PUBLIC
})
await this.baordRepository.save(board);
return board;
}
async getBoardById(id: number): Promise <Board> {
const found = await this.boardRepository.findOne(id);
return found;
}
[2] Service 계층에서 받아온 데이터를 처리하는 컨트롤러 생성하기
/* board.controller.ts */
@Get('/:id')
getBoardById(@Param('id') id:number): Promise<Board> {
return this.boardService.getBoardById
}
. . .
TypeOrm 메서드 관련 링크
https://orkhan.gitbook.io/typeorm/docs/repository-api
...
'FrameWork & Runtime > Node.js (NestJs)' 카테고리의 다른 글
[NestJs] Controller (0) | 2024.04.26 |
---|---|
모듈 [ @Module() ] (0) | 2022.07.28 |