• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

OneToMany 관계 설정 질문드립니다.

22.06.24 14:53 작성 조회수 206

0

 안녕하세요 조현영님. 질문이 계속 쏟아져나오네요! 첫 질문 때 이야기 했던 사용자(UserEntity)와 이미지(ImageEntity)간의 관계는 OneToMany 관계인것에 대해 질문하려합니다. UserEntity에 image라는 컬럼을 두고 아래 처럼 관계 설정 하였습니다.

// user.entity.ts
@OneToMany(() => ImagesEntity, (join) => join.imageForigenKeyForUser)
  @JoinColumn()
  image?: ImagesEntity;

아래는 ImageEntity의 관계 설정입니다.

// image.entity.ts
@ManyToOne(() => UserEntity)
  imageForigenKeyForUser: string;

질문 1. mysql 워크밴치등으로 Image테이블을 보면 imageForigenKeyForUserId라는 컬럼이 생성되었습니다. 이렇게 컬럼이름 + Id가 붙은 컬럼을 가상 컬럼이라 부르는것이 맞을까요?

질문 2. 만약 위 질문이 맞다면 원래 제가 예상한것은 User테이블에 imageId라는 가상 컬럼이 생기는것을 예상했는데 User테이블에는 가상 컬럼이 존재하지가 않네요. 위 코드에서 관계 설정이 잘못된 것일까요? 제가 이전에 상품과 이미지 관계를 OneToOne으로 맺었을 때는 제가 원한대로 (JoinColumn()이 붙은쪽에 컬럼이름 + Id가 붙은 가상 컬럼이 생성됨) 관계가 형성 되었습니다. 아래 코드를 사용해서요.

// product.entity.ts
@OneToOne(() => ImagesEntity, (join) => join.imageForigenKeyForProduct)
  @JoinColumn()
  image: ImagesEntity;
 
// image.entity.ts
  @OneToOne(() => ProductEntity)
  imageForigenKeyForProduct: string;

질문 3. 한쪽에서 OneToMany 관계로 시작하면 받는쪽은 ManyToOne이 맞죠?

ex) @OneToOne() Image => @ManyToOne() ImageForigenKey

질문이 많은거 같은데 시간 나실 때 천천히 봐주시면 감사할거 같습니다.

답변 1

답변을 작성해보세요.

0

1. 아뇨 imageForeignKeyForUserId는 실제로 존재하는 컬럼이므로 가상컬럼이 아닙니다. 그냥 외래키 컬럼입니다. imageForeignKeyForUser가 가상 컬럼이죠.

2. UserTable에 이미지 아이디가 안 생깁니다. 일대다에서는 다에 외래키컬럼이 생기는 것입니다. 이미지에 유저 아이디가 기록되어야죠.

3. 네 맞습니다.

이승훈님의 프로필

이승훈

질문자

2022.06.24

아 OneToMany => ManyToOne 관계는 많은 쪽에 외래키가 생기는것이군요. 그러면 user쪽에서 image에 접근하려면 어떻게 해야 할까요? user에는 외래키가 없어서 접근 방법을 모르겠어요. 사용자와 이미지의 관계라 이미지를 1, 사용자를 n으로 두기에도 묘한 상황이라서요. 

user에서도 image 가상 컬럼 생성할 수 있습니다. 강좌에서도 했습니다. user와 workspace로요.

이승훈님의 프로필

이승훈

질문자

2022.06.24

약간 방법을 알아낸거 같네요 감사합니다!