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

Haewoong Lee님의 프로필 이미지

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

외래키 지정에 관해서

해결된 질문

작성

·

199

0

@ManyToOne(() => ProductCategory)
  @Field(() => ProductCategory)
  productCategory: ProductCategory;

외래키를 위와 같이 지정해주는 경우와

@ManyToOne(() => ProductCategory)
  @Field(() => String)
  productCategoryId: string;

이렇게 지정해주는 경우 데이터베이스에 테이블 사이의 관계가 만들어질 때 차이는 없나요?

typeORM과 graphQL 요청시 객체를 그대로 전달하느냐 아니면 string 형식의 id만 전달하느냐 정도의 차이만 있나요?

답변 1

1

노원두님의 프로필 이미지
노원두
지식공유자

안녕하세요! Haewoong님!

관계를 지정해 주는 부분은 결국 TypeORM의 @ManyToOne 이에요!
따라서, @ManyToOne 만 제대로 지정이 되어있으면 등록, 조회(relations) 등 모든 것이 정상적으로 작동합니다!

그러면, 아래의 2개의 차이를 확인해 보아야겠죠?!

1. productCategory: ProductCategory;
2. productCategoryId: string;

 

결국, 위 두 개 모두 class에 속한 내용들이에요. 간단한 class를 하나만 볼까요?

class Monster {
   name: string;
   power: number;
}

보시다시피, name, power 등은 class의 멤버변수예요! 변수의 오른쪽 부분은 타입이네요!


이러한 내용을 바탕으로 위의 결과를 다시 한 번 정리해 볼까요?!

1. productCategory: ProductCategory;
2. productCategoryId: string;

결국, 위 1번과 2번의 차이는 타입스크립트 차이가 되겠네요!
문제는 2번으로 진행하는 경우, 데이터 등록 및 조회(실제 relations 등을 통한 데이터 조회도 가능합니다)를 하더라도 타입 불일치 문제가 발생하게 됩니다. 왜냐하면, relations으로 조회시, 타입은 string이라고 되어있는데 해당 key 안에는 Category 객체가 들어가 있게 되기 때문이죠!(물론, 타입스크립트를 무시하시고 진행하면 정상작동 되지만, 추천드리지 않아요!)

Haewoong Lee님의 프로필 이미지
Haewoong Lee
질문자

친절하고 상세한 답변 감사드립니다.