인프런 커뮤니티 질문&답변

ak님의 프로필 이미지
ak

작성한 질문수

따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)

typeORM에서 ManyToOne, ManyToMany 관하여 질문있습니다.

작성

·

430

0

안녕하세요? 좋은 강의 잘 듣고있습니다 ^^
 
강의 보다 질문이 생겼는데,
 
1.
 
아래에서 MayToOne에 있는 user: User; 는 실제 DB테이블에 컬럼으로 들어가지는 않나요?
다른 수많은 Many.. One.. 들도 그렇구요.. 그럼 왜 저렇게 작성해주는거죠?
 
2.
 
강의를들으면서 MayToOne이나 OneToMany 관련 이해를 위해, 다른 자료를 찾아보았는데
단순 하나와 여럿, 여럿과 하나의 관계가 있는 것을 나타낸다고 이해가 되는데, 실제 DB 스키마에서 어떻게 설정되어 사용되는지
이해가 어렵더라구요. 혹시 간략히 설명 부탁드려도 될까요? 감사합니다. (__)
 
 

답변 1

0

John Ahn님의 프로필 이미지
John Ahn
지식공유자

안녕하세요!!
좋은 질문 주셔서 감사합니다. 

혹시 제가 엔티티 만드는 부분에서 관계를 이미 설정했는데
또 fk 칼럼을 다시 만든 부분에 대해서 질문 주신 거죠?! 

이렇게 하면 좋은 점은 조인 없이 관계 테이블의 fk도 조회할 수 있게 됩니다. 

예를 들어서

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity()
export class Profile {

@PrimaryGeneratedColumn()
id: number;

@Column()
gender: string;

@Column()
photo: string;

}

 


import {Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn} from "typeorm";
import {Profile} from "./Profile";

@Entity()
export class User {

@PrimaryGeneratedColumn()
id: number;

@Column()
name: string;

@OneToOne(type => Profile)
@JoinColumn()
profile: Profile;

}

이렇게 프로필과 유저 엔티티가 1:1 관계로 있고
이때 join 없이 단순히 User 엔티티를 불러오면 어떤 정보가 올까요? 

User {
     id: 3,
     name: "John"

이런 식으로 올 것입니다. profileId는 오지 않죠...
그러면 profileId를 가져오려면 어떻게 해야 할까요? 

await User.findOne({id: userId}, {relations: ["profile"]}) 이런 식으로 relations 옵션을 이용해서 JOIN을 해와야 가져올 수가 있습니다. 

이런 식으로 가져오면
profile의 Id 뿐만 아니라 gender, photo 모든 칼럼의 정보까지 가져오게 됩니다. 

하지만 이미 칼럼을 명시적으로 생성해놓으면 profileId fk를 받을 수 있게 됩니다. 

현재 저희는 이걸 @Column() 데코레이터를 사용했지만 더 명시적으로 하려면 @RelationId라는 것을 이용해서도 할 수 있습니다.

감사합니다.

ak님의 프로필 이미지
ak

작성한 질문수

질문하기