• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

하위 테이블이 되는 엔티티에서 외래키 컬럼을 별도로 작성하는 이유가 궁금합니다

24.01.02 18:37 작성 조회수 188

0

강의에서 OneToMany, ManyToOne 관계인 엔티티들을 보면

/entity/Users.ts

// ...
@Entity({ schema: 'sleact', name: 'users' })
export class Users {
@PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;
// ...
@OneToMany(
    () => WorkspaceMembers,
    (workspacemembers) => workspacemembers.User,
  )
  WorkspaceMembers: WorkspaceMembers[];
// ...
}

/entity/WorkspaceMembers.ts

@Entity('workspacemembers', { schema: 'sleact' })
export class WorkspaceMembers {
// ...
@Column('int', { primary: true, name: 'UserId' })
  UserId: number;
// ...
@ManyToOne(() => Users, (users) => users.WorkspaceMembers, {
    onDelete: 'CASCADE',
    onUpdate: 'CASCADE',
  })
  @JoinColumn([{ name: 'UserId', referencedColumnName: 'id' }])
  User: Users;
// ...
}

WorkspaceMembers 엔티티에서 UserId 컬럼을 별도로 작성하신 뒤

@JoinColumn 데코레이터에서 Users 엔티티에서 가져온 'id'컬럼을

본 엔티티에서 'UserId' 컬럼으로 사용하겠다고 지정하셨는데요

 

이외에도 다른 일대다, 다대일 관계인 엔티티 중

다대일 파일들에 모두 '(상위테이블)Id' 이런 식으로 컬럼을 직접 설정하셨더라구요.

이 이유가 무엇인지에 대해서 질문드리고 싶어서 글 작성합니다.

 

개인적으로 연습하면서 TypeORM 공식문서나 깃북을 확인했을때는 관계에 대해서는 지정을 하되,

하위 테이블에선 별도로 외래키에 대한 컬럼까지는 작성하지 않았는데요.

제가 작업중인 환경에서 테스트할 때도

user.entity.ts

// ...
@Entity({ name: 'Users' }) 
export class Users {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

// ..

  @OneToMany(() => Posts, (post: Posts) => post.user, {
    cascade: true,
  })
  post: Posts[];
}

posts.entity.ts

// ...
@Entity({ name: 'Posts' })
export class Posts {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  // @Column({ type: 'int' })
  // userId: number;

// ...

  @ManyToOne(() => Users, (user: Users) => user.post, {
    onDelete: 'CASCADE',
  })
  // 외래키 정보
  // @JoinColumn([
  //   {
  //     referencedColumnName: 'id', // 상대방 컬럼
  //     name: 'userId', // 여기서 쓸 컬럼
  //   },
  // ])
  user: Users[];
}

이 상태에서 DB와 테이블을 생성했을때 외래키가 되는 'userId'가 생성되는 것 확인하였습니다.

단 이 상태에서는 서비스 단에서 리포지터리로 데이터를 입력할 수가 없었습니다.

 

이 부분은 JoinColumn 데코레이터가 있어도 결과는 같았습니다.

 

혹시 자동적으로 만들어지는 외래키 컬럼에는 서비스에서 typeorm 사용해도

직접적으로 데이터를 집어 넣지 못하기 때문에,

외래키 컬럼을 직접 만들어주고 JoinColumn 데코레이터 사용해서 명시적으로 지정을 해줘야만 한다 라고 생각하면 될까요?

 

제가 제대로 이해한 것이 맞을까요?

답변 1

답변을 작성해보세요.

2

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.02

안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용은 TypeORM에서 엔티티 간의 관계를 맺을 때 외래키 컬럼을 별도로 작성하는 이유와 관련된 내용으로 보입니다. 이와 관련하여 유사한 질문에 대한 답변이 있는 게시글이 있어서 링크를 공유드립니다.

제로초님께서는 하위 테이블에서 외래키 컬럼을 별도로 작성하는 이유에 대해 답변하셨는데, 별도의 외래키 컬럼인 OwnerId가 실제로 존재하며, Owner는 join 후에 생성되는 속성(실제 컬럼이 아닌)으로, 둘을 모두 적는 이유는 외래키 컬럼 자체도 사용할 수 있게 하기 위함이라고 하셨습니다. 이를 통해 OwnerId와 같은 실제 컬럼값을 직접 컨트롤할 수 있게 하는 것입니다.

관련 내용을 확인하시려면 아래 링크를 참고하세요.

질문에 대한 더 자세한 답변을 원하시면 해당 링크를 통해 강의 내용과 답변을 확인해보시는 것을 추천드립니다.

jeongho218님의 프로필

jeongho218

질문자

2024.01.02

"OwnerId는 실제로 존재하는 컬럼이고, Owner는 join 후에 생성되는 속성입니다(실제 컬럼이 아닙니다). 그래서 둘 다 적어준 것이고 공존이 가능한 것이고요.

Owner만 존재해도 되긴 하는데 OwnerId에 값을 직접 넣을 수는 없으므로 OwnerId를 따로 만들어서 직접 컨트롤할 수 있게 한 겁니다."

아 이 문장 읽어보니 이해되네요 감사합니다