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 키워드로 처리하면 관련 엔터티를 로딩할 수 있습니다.
- 이는 성능 최적화와 관련된 설정으로, 매번 연관된 엔터티를 자동으로 로딩하는 것보다 필요할 때만 로딩하도록 하는 데 유용합니다.
'Backend > Nest.js' 카테고리의 다른 글
Nest.js Swagger Bearer 인증 적용 (1) | 2023.09.26 |
---|---|
Nest.js Security Jwt strategy 적용 (0) | 2023.09.26 |
Nest.js Swagger 설치 및 설정 (0) | 2023.09.25 |
Nest.js Swagger 용 Decorator 작성 (0) | 2023.09.25 |
Nest.js class-validation, class-transformer 적용 및 사용 (0) | 2023.09.25 |