TypeOrm Test

TypeOrm을 사용하여 엔티티를 생성하고 관계를 설정해보는 것 까지 이번 포스팅에서 진행 해보도록 합니다.🤐

먼저 typeorm을 사용하기위해 서버를 구동해야 하는데… 간단하게 하려 했지만 기존에 하던 곳에서 하는게 가장 편하다고.. 저는 Nest서버에서 실행 하기로 했습니다..
도저히 다른곳에서 시작하기가…

NestJs 와 TypeOrm 연동 포스팅은 나중에 진행 하기로 하고 지금은 엔티티생성 관계 설정까지만!!!

먼저 User 엔티티를 만들어보도록 합니다. 최대한 간단하게 ㅎ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

export enum UserRole {
ADMIN = "admin",
EDITOR = "editor",
GHOST = "ghost"
}

@Entity()
export class Users {

@PrimaryGeneratedColumn()
id: number;

@Column('varchar', { name: 'email', unique: true, length: 30 })
email: string;

@Column('varchar', { name: 'name', length: 20, unique: true })
name: string;

@Column('int', { name: 'age' })
age: number;

@Column('varchar', { name: 'job', length: 10, nullable: true })
job: string;

@Column({
name: 'role',
type: 'enum',
enum: UserRole,
default: UserRole.ADMIN
})
role: UserRole;
}

그리고 관계를 맺기위한 Post 엔티티를 생성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class Posts {

@PrimaryGeneratedColumn()
id: number;

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

@Column('text', { name: 'content' })
content: string;
}

엔티티를 생성하고 잠시 데이터베이스에 테이블이 잘 생성 됬는지 확인을 먼저 해봐야죠?

두개의 테이블이 모두 생성 되었습니다.

이제 두 테이블간의 관계를 설정해 주도록 하겠습니다. 지금까지의 데이터베이스 테이블 관계 설정을 할 때 사실 제일 많이 사용되는게 1 대 다 관계였는데 1대1 관계는 그다지 설정할 일이 별로 없었고
시퀄라이즈에을 사용하였을때만 다대다를 설정해 보았기 때문에 이번 테스트는 1 대 다 관계를 통해 테스트를 진행 할 예정 입니다.

먼저 User 엔티티에 @OneToMany 데코레이터를 통해 설정을 해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
import { Posts } from "./posts.entity";

export enum UserRole {
ADMIN = "admin",
EDITOR = "editor",
GHOST = "ghost"
}

@Entity()
export class Users {

@PrimaryGeneratedColumn()
id: number;

@Column('varchar', { name: 'email', unique: true, length: 30 })
email: string;

@Column('varchar', { name: 'name', length: 20, unique: true })
name: string;

@Column('int', { name: 'age' })
age: number;

@Column('varchar', { name: 'job', length: 10, nullable: true })
job: string;

@Column({
name: 'role',
type: 'enum',
enum: UserRole,
default: UserRole.ADMIN
})
role: UserRole;

// 관계 설정
@OneToMany(() => Posts, (posts) => posts.users)
posts: Posts[];
}

그리고 다음 Post 엔티티에는 OneToMany의 반대 ManyToMany를 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
import { Users } from "./user.entity";

@Entity()
export class Posts {

@PrimaryGeneratedColumn()
id: number;

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

@Column('text', { name: 'content' })
content: string;

@ManyToOne(() => Users, (user) => user.posts, {
nullable: false,
onDelete: 'CASCADE',
})
@JoinColumn([{ name: 'Userid', referencedColumnName: 'id' }])
users: Users;
}

ManyToOne에서는 JoinColumn 을 생략이 가능하지만 기본적으로 생성해주는 이름이 마음에 안들거나 데이터 베이스 설계시 특정 컬럼을 참조하기로 했다면 설정하면 좋을 것 같다고 생각한다.

이렇게 관계를 설정해주고 다시 데이터베이를 확인해본다.




확인 결과 다음과 같이 Post테이블에서는 User테이블의 Pk를 참조 하는 관계가 설정이 된 것을 확인 할 수 있다.

Author

han Ju Ryeon

Posted on

2021-09-09

Updated on

2021-12-05

Licensed under

댓글