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를 참조 하는 관계가 설정이 된 것을 확인 할 수 있다.