포시코딩

[Nest.js] 7. Entity & Repository 본문

Node.js

[Nest.js] 7. Entity & Repository

포시 2023. 2. 16. 12:56
728x90

Entity

생성

article.entity.ts

import { Column, CreateDateColumn, DeleteDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm';

@Entity({ schema: 'nest_prac', name: 'articles' })
export class Article {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  @Column('varchar', { length: 50 })
  title: string;

  @Column('varchar', { length: 1000 })
  content: string;

  @Column('varchar', { length: 10 })
  author: string;

  @Column('varchar', { select: false })
  password: string;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;

  @DeleteDateColumn()
  deletedAt: Date | null;
}
  • PK에는 @PrimaryGeneratedColumn 어노테이션 사용
  • password는 정말 필요한 상황이 아니면 select를 할 필요가 없기 때문에 { select: false }
  • 실제 삭제(Hard Delete)가 아닌 논리적 삭제(Soft Delete)를 하기 위해 
    deletedAt 컬럼을 위처럼 세팅.
    전체 게시글을 가져올 때  deletedAt이 null인 게시물만 갖고오는 방식으로 삭제된 효과를 줄 수 있다.

 

Repository

repository 사용에는 일반 repository와 커스텀 repository 사용으로 나뉘는데

일반 repository 명세는 다음과 같다.

 

https://github.com/typeorm/typeorm/blob/master/docs/repository-api.md

 

GitHub - typeorm/typeorm: ORM for TypeScript and JavaScript. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle,

ORM for TypeScript and JavaScript. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana, WebSQL databases. Works in NodeJS, Browser, Ionic, Cordova and Electron platforms. -...

github.com

 

일반 repository의 사용은 express에서 처럼 따로 파일을 만드는게 아니다. 

service의 생성자에 사용할 repository를 주입하면 된다.

 

service의 생성자에 repository를 주입하기 전에 먼저 

해당 서비스를 관장하는 module에서 Article entity를 imports한다고 명시해줘야 한다. (중요!)

 

module에서 entity 명시

board.module.ts

imports: [TypeOrmModule.forFeature([Article])],

그 다음 아까 typeorm.config.service.ts에서 비워놓았던 entities에서도 명시해주면 된다.

 

config에서 entity 명시

typeorm.config.service.ts

entities: [Article],

 

service의 생성자에 repository 주입

마지막으로 service의 생성자에 repository를 주입한다.

 

board.service.ts

constructor(
  @InjectRepository(Article) private articleRepository: Repository<Article>
) {}

 

이렇게 일반 repository를 사용할 준비가 되었다.

728x90