본문 바로가기
FrameWork & Runtime/Node.js (NestJs)

TypeORM

by jaeaemin 2022. 10. 3.

 

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

 

Repository APIs - typeorm

chunk: number - Breaks removal execution into multiple groups of chunks. For example, if you want to remove 100.000 objects but you have issues doing so, you can break them into 10 groups of 10.000 objects, by setting { chunk: 10000 }, and remove each grou

orkhan.gitbook.io

 

 

 

...

반응형

'FrameWork & Runtime > Node.js (NestJs)' 카테고리의 다른 글

[NestJs] Controller  (0) 2024.04.26
모듈 [ @Module() ]  (0) 2022.07.28