반응형
UserModel.ts
import {
Column,
CreateDateColumn,
Entity,
Generated,
JoinColumn,
ManyToMany,
OneToMany,
OneToOne,
PrimaryColumn,
PrimaryGeneratedColumn,
UpdateDateColumn,
VersionColumn,
} from 'typeorm';
import { ProfileModel } from './profile.entity';
import { PostModel } from './post.entity';
import { TagModel } from './tag.entity';
// 특정값 제한
export enum Role {
USER = 'user',
ADMIN = 'admin',
}
@Entity()
export class UserModel {
// ID
//@PrimaryGeneratedColumn() // 자동 ID 생성
// Primary Column
// Primary Column 은 모든 테이블에서 기본적으로 존재해야한다.
// 테이블 안에서 각각의 Row를 구분 할 수 있는 칼럼
// @PrimaryColumn()
//@PrimaryGeneratedColumn('uuid)
// PrimaryGeneratedColumn -> 순서대로 값이 올라감 ex) 1, 2, 3, 4 ~
// UUID
// asdfa1234asdf-asdf2234asdf-2324asdfdd-asdfsdf32
@PrimaryGeneratedColumn()
id: number;
@Column()
email: string;
// 제목
// @Column({
// // 데이터베이스에서 인지하는 칼럼 타입
// // 자동 유추, 특정 값이 필요하면 넣는다
// type: 'varchar',
// // 데이터베이스 칼럼 이름
// // 프로퍼티 이름으로 자동 유추
// name: 'title',
// // 값의 길이
// // 실제 입력 할 수 있는 글자의 길이가 300
// length: 300,
// // null 이 가능한지
// nullable: true,
// // true면 처음 저장할 때만 값 지정 가능
// // 이후엔 불가능
// update: true,
// // find()를 실행할 때 기본으로 값을 불러올지
// // 기본값이 true
// select: false,
// // 기본 값
// // 아무것도 입력 안했을 때 들어가는 값
// default: 'default value',
// // 칼럼 중 유일무이한 값이 돼야 하는지 ex) 이메일 ..
// unique: false,
// })
// title: string;
@Column({
type: 'enum',
enum: Role,
default: Role.USER,
})
role: Role;
// 데이터 생성일자
// 데이터가 생성되는 날짜와 시간이 자동으로 찍힘
@CreateDateColumn()
createAt: Date;
// 데이터 수정일자
// 데이터가 수정되는 날짜와 시간이 자동으로 찍힘
@UpdateDateColumn()
updateAt: Date;
// 데이터가 업데이트 될 때마다 1씩 올라간다.
// 처음 생성되면 값은 1
// save() 함수가 몇 번 불렸는지 기억한다.
@VersionColumn()
version: number;
@Column()
@Generated('uuid') // auto increment
additionalId: string;
@OneToOne(() => ProfileModel, (profile) => profile.user, {
// find() 실행 시 마다 항상 같이 가져올 relation
eager: false,
// 저장 할 때 relation을 한번에 같이 저장 가능
cascade: true,
// Null 가능 여부
nullable: true,
// 관계가 삭제 됐을 때
// no action -> 아무것도 안함
// cascade -> 참조하는 Row 삭제
// set null -> 참조하는 Row 에서 참조 id 를 null로 변경
// set default -> 기본 셋팅으로 설정
// restrict -> 참조하고 있는 Row 가 있는경우 참조당하는 Row 삭제 불가
// onDelete: 'RESTRICT',
})
@JoinColumn()
profile: ProfileModel;
@OneToMany(() => PostModel, (post) => post.author)
posts: PostModel;
@Column({ default: 0 })
count: number;
}
TypeORM 어노테이션 정리
1. @Entity()
- 데이터베이스에서 이 클래스를 하나의 테이블로 인식한다. 이 데코레이터가 붙은 클래스는 TypeORM에서 관리하며
자동으로 테이블이 생성된다.
@Entity() export class UserModel { ... }
2. @PrimaryGeneratedColumn()
- 자동으로 증가하는 숫자 ID를 생성한다. 주로 기본 키로 사용.
- 옵션
- 'uuid': UUID 형식의 고유 식별자를 자동으로 생성
- 'increment': 자동 증가 숫자 (기본값)
@PrimaryGeneratedColumn() id: number;
@PrimaryGeneratedColumn('uuid') id: number;
3. @Column()
- 컬럼을 정의하고 다양한 옵션을 통해 세부 설정이 가능하다.
- 옵션
- type: 컬럼의 데이터 타입 (varchar, int, boolean 등).
- length: 문자열 길이.
- nullable: true 설정 시, NULL 값 허용.
- unique: true 설정 시, 고유 값 강제.
- default: 기본값 설정.
@Column({ type: 'varchar', length: 300, nullable: true, default: 'default value' }) title: string;
4. @CreateDateColumn()
- 레코드가 생성된 시간을 자동으로 기록한다. 값은 INSERT 시에만 설정되고, 이후 수정되지 않는다.
- 데이터 생성 일시를 추적할 때 용이.
@CreateDateColumn() createdAt: Date;
5. @UpdateDateColumn()
- 레코드가 마지막으로 수정된 시간을 자동으로 기록한다. 값은 UPDATE 시마다 자동으로 갱신된다.
- 데이터 수정 일시를 추적할 때 사용한다.
@UpdateDateColumn() updatedAt: Date;
6. @VersionColumn()
- 레코드가 수정될 때마다 이 값이 자동으로 증가 ( save() 함수 )
- 데이터 충돌 방지를 위해 사용 (특히 동시성 이슈 해결).
@VersionColumn() version: number;
7. @Generated()
- 자동으로 값을 생성해주는 컬럼. 주로 'uuid' 옵션을 사용하여 고유 식별자를 생성한다.
@Column() @Generated('uuid') additionalId: string;
8. @OneToOne()
- 두 엔티티 간의 1:1 관계를 설정한다. 외래 키를 통해 다른 엔티티와 연결됨.
- 옵션:
- cascade: 관련된 엔티티를 함께 저장하거나 삭제.
- eager: 항상 관계된 데이터를 함께 조회.
- onDelete: 연결된 엔티티가 삭제될 때의 동작을 설정합니다 (CASCADE, SET NULL, RESTRICT 등).
@OneToOne(() => ProfileModel, (profile) => profile.user, { cascade: true, nullable: true }) @JoinColumn() profile: ProfileModel;
9. @OneToMany()
- 두 엔티티 간의 1관계를 설정. 주로 배열 형태로 다른 엔티티를 연결할 때 사용.
@OneToMany(() => PostModel, (post) => post.author) posts: PostModel[];
10. @ManyToMany()
- 두 엔티티 간의 N관계를 설정. @JoinTable()과 함께 사용하여 연결 테이블을 생성.
@ManyToMany(() => TagModel, (tag) => tag.users) tags: TagModel[];
반응형
'nestJS' 카테고리의 다른 글
NestJS | TypeORM Table Inheritance (0) | 2024.11.12 |
---|---|
NestJS | TypeORM Entity Embedding (2) | 2024.11.12 |
NestJS | Docker, TypeORM 설치 (0) | 2024.11.12 |
NestJS | 의존성 주입, 제어의 역전 (0) | 2024.11.06 |
NestJS | Config (env) (0) | 2024.08.25 |