본문 바로가기

Backend/NestJS

[TypeORM] @OneToMany 그리고 @ManyToOne에서 추가로 알게 된 것들

주말에 인프런 '따라하며 배우는 NestJS'를 수강하였다. 

이미 NestJS로 개발을 하고 있고, 부족한 부분을 채워넣는 것이 우선이기에 강의를 끝에서부터 듣고 있다 ㅎ 

 

그중에 오늘 @OneToMany와 @ManyToOne에 대한 내용을 수강하였는데, 내가 놓치고 있던 부분이 있어 다시 한번 정리하고자 한다. 

 

상황은 이렇다. 

1명의 User는 여러개의 Board를 쓸 수 있다. (@OneToMany) 

1개의 Board - 게시글 하나에 대해서는 여러명이서 1개의 게시글을 작성할 수 없다. (@ManyToOne) 

 

정리하자면, User의 입장에서는 @OneToMany이고, Board의 입장에서는 @ManyToOne인 것이다. 

참고로 TypeORM을 사용할때 @ManyToOne을 PostgreSQL에 적용할 경우 많은 쪽(Boards)이 주인이며, @ManyToOne인 Board가 User의 id를 가지고 있어 FK(외래키)로 User의 id를 가지고 있는다. 

 

 

위의 상황에 대해 Entity 파일에서 코드로 작성해보자. 

ex) user.entity.ts

@OneToMany(type=>Board, board=>board.user, { eager: true }) 
boards: Board[];

1명의 User는 N개의 Board(게시글)을 작성할 수 있다. 

(파라미터1) type => Board는 현재 User와 관계를 맺은 Entity가 Board임을 명시해준다. 

(파라미터2) board => board.user => User 엔티티와 관계를 맺은 board 엔티티에서는 User에 접근하기 위해서는 board 엔티티의 user로 접근을 해야함을 명시한다 

(파라미터3) eager:true => User을 가져올 때 board 정보도 함께 가져오는 것에 대한 설정을 의미한다. true면 User을 가져올때 board도 함께 가져온다. 

 

그리고 Board[]가 배열인 이유는 1명의 User은 여러 개의 Board 게시글을 작성할 수 있기에 [] 배열에 값을 할당하였다. 

ex) board.entity.ts

@ManyToOne(type=>User, user=>user.boards, { eager: false }) 
user: User;

여러개의 게시글이 한 명의 User에게도 속할 수 있는 것이 @ManyToOne이다.

(파라미터 1) type => User은 현재 Board와 관계를 맺은 Entity가 User임을 명시해준다. 

(파라미터 2) user=>user.boards => Board 엔티티와 관계를 맺은 user 엔티티에서는 Board에 접근하기 위해 user에서 정의한 boards로 접근해야함을 명시한다.

(파라미터 3) eager:false => Board를 가져올 때 user 정보는 가져오지 않는다. 

 

 

이번 강의를 들으면서 관계설정을 할때 파라미터로 들어오는 값들에 대해서 크게 상관을 하지 않았던 것 같은데 나의 큰 실수라고 생각했다. 앞으로 TypeORM 관계설정을 할 때 파라미터로 들어오는 값들에 대해서도 큰 인지를 해야겠다고 다시금 다짐하는 계기가 되었다.