Next.js Typeorm 설치 및 설정

 

 

1. 패키지 설치

  • 데이터베이스는 postgres 를 사용
yarn add @nestjs/typeorm typeorm pg

 

2. Module설정 추가

@Module({
  imports: [
    ConfigModule(),
    TypeOrmModule.forRoot({
      type: 'postgres', // dbms 종류
      host: 'localhost', // dbms 주소
      port: 5432, // dbms 포트
      username: 'admin', // dbms 계정
      password: '1234', // dbms 비밀번호
      database: 'testdb', // dbms 데이터베이스
      entities: [__dirname + '/**/*.entity{.ts,.js}'], // entity를 자동으로 읽어옴
      synchronize: true, // entity와 db를 동기화
            logging: true, // DB에 날라가는 쿼리문을 로깅함.
    }),
    BoardModule
  ],
  controllers: [AppController],
  providers: [AppService],
})

 

3. Entity 생성

./src/entitiy/board.entity.ts 생성

@Entity()
export class Board {
  @PrimaryGeneratedColumn({ name: 'id' })
  id: number;

  @ApiProperty({ description: '제목', example: 'hello world' })
  @Column()
  title: string;

  @ApiProperty({ description: 'user_id' })
  @Column()
  userId: string;

  @ApiProperty({ description: '내용', example: 'contents' })
  @Column()
  contents: string;

  @ApiProperty({ description: '생성일', example: '2023-09-22' })
  @CreateDateColumn()
  createdAt: Date;

  @ApiProperty({ description: '수정일', example: '2023-09-22' })
  @UpdateDateColumn()
  updatedAt: Date;

  @ApiProperty({ description: '유저 정보' })
  @ManyToOne(() => User, (user) => user.boards)
  @JoinColumn({ name: 'userId' })
  user: User;
}

 

./src/entitiy/user.entity.ts 생성

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @ApiProperty({ description: '유저 아이디', example: 'admin' })
  @Column({ unique: true })
  username: string;

  @ApiProperty({ description: '패스워드', example: 'ExamplePassword1!' })
  @Column({ select: false })
  password: string;

  @ApiProperty({ description: '유저 이름', example: '홍길동' })
  @Column()
  name: string;

  @ApiProperty({ description: '유저 나이', example: '65' })
  @Column()
  age: number;

  @ApiProperty({ description: '유저 이메일', example: '' })
  @OneToMany(() => Board, (board) => board.user, {
    cascade: true,
        lazy: true,
  })
  boards: Board[];
}

 

데코레이터설명

@Entity() 해당 클래스를 데이터베이스의 테이블로 표현하는 엔터티로 선언합니다.
@PrimaryGeneratedColumn 해당 컬럼을 자동 생성되는 기본 키로 설정합니다.
@ApiProperty() API 문서에서 해당 프로퍼티를 설명하고 예제를 제공하기 위한 메타데이터를 설정합니다 (Nest.js와 @nestjs/swagger에 특화된 데코레이터).
@Column() 해당 프로퍼티를 데이터베이스의 컬럼으로 표현합니다.
@CreateDateColumn() 해당 컬럼을 생성 날짜를 자동으로 기록하는 컬럼으로 설정합니다.
@UpdateDateColumn() 해당 컬럼을 수정 날짜를 자동으로 기록하는 컬럼으로 설정합니다.
@ManyToOne(…) 해당 프로퍼티를 다른 엔터티와의 다대일 관계로 설정합니다.
@JoinColumn({ name: 'userId' }) 연관된 엔터티와의 조인 컬럼을 설정합니다.
@OneToMany(…) 해당 프로퍼티를 다른 엔터티와의 일대다 관계로 설정합니다.

 

 

cascade, lazy 옵션

- cascade:

  • cascade 옵션은 데이터베이스 관계에서 한 엔터티의 변경이 관련된 다른 엔터티에 어떻게 영향을 미칠지를 결정합니다.
  • TypeORM에서는 cascade 옵션을 사용하여, 예를 들어 부모 엔터티를 저장할 때 관련된 자식 엔터티도 함께 저장되게 설정할 수 있습니다.
  • 주요 사용 사례:
    • cascade: ["insert", "update"]: 부모 엔터티를 저장하거나 업데이트 할 때 자식 엔터티도 함께 저장하거나 업데이트합니다.
    • cascade: ["remove"]: 부모 엔터티를 삭제할 때 자식 엔터티도 함께 삭제합니다.
    • cascade: true: 모든 연산에 대해 위의 동작을 적용합니다.

lazy:

  • lazy 옵션은 관계의 엔터티를 로딩하는 방식을 제어합니다.
  • **lazy**가 **true**로 설정되면, 관계의 엔터티는 요청될 때까지 실제로 로딩되지 않습니다. 대신 **Promise**가 반환되며, 이 **Promise**를 await 키워드로 처리하면 관련 엔터티를 로딩할 수 있습니다.
  • 이는 성능 최적화와 관련된 설정으로, 매번 연관된 엔터티를 자동으로 로딩하는 것보다 필요할 때만 로딩하도록 하는 데 유용합니다.