iamkanguk.dev

[NestJS - 트러블슈팅] Cannot read properties of undefined (reading 'joinColumns') 본문

Framework/NestJS

[NestJS - 트러블슈팅] Cannot read properties of undefined (reading 'joinColumns')

iamkanguk 2023. 11. 23. 19:28

최근에 Hard-Delete에서 Soft-Delete로 변경하면서 repository method와 entity 쪽에 전반적으로 변경이 일어났는데..

오늘 개발한 API들을 점검하면서 글 제목과 같이 에러가 발생했다. JoinColumns는 FK를 연결할 때 쓰는건데 아무리 봐도 잘못된 부분이 없는데 어디가 문제인지 도저히 모르겠는 것이다.

 

위의 에러는 Soft-Delete를 하는 과정에서 발생한 이슈이다.

 

필자가 참여하고 있는 프로젝트에서는 Schedule과 ScheduleArea 엔티티가 각각 있다. 기존 고드를 제공해보겠다.

 

// ScheduleEntity
@OneToMany(
    () => ScheduleAreaEntity,
    (scheduleArea) => scheduleArea.scheduleId,
    {
      cascade: true,
    },
)
scheduleAreas: ScheduleAreaEntity[];

// ScheduleAreaEntity
@ManyToOne(() => ScheduleEntity, (schedule) => schedule.scheduleAreas, {
    onDelete: 'CASCADE',
    onUpdate: 'CASCADE',
})
@JoinColumn({ name: 'scheduleId', referencedColumnName: 'id' })
schedule: ScheduleEntity;

 

위의 코드는 Entity 끼리 연관관계를 맺어주는 부분이라고 보면 된다. 딱 보면 어디가 문제가 있어보이는가? 왜 나만 안보일까...?

 

문제점을 찾음!

문제점은 바로 ScheduleEntity 부분쪽에 (scheduleArea) => scheduleArea.scheduleId 부분이다.

왜냐면 나는 ScheduleAreaEntity 쪽에는 schedule 이라고 FK 연결 설정을 해놨는데, 필자는 JoinColumn의 name 부분에 scheduleId라고 설정을 해놔서 scheduleArea.scheduleId로 접근을 한 것 같다.

 

// ScheduleEntity
@OneToMany(
    () => ScheduleAreaEntity,
    (scheduleArea) => scheduleArea.schedule,
    {
      cascade: true,
    },
)
scheduleAreas: ScheduleAreaEntity[];

// ScheduleAreaEntity
@ManyToOne(() => ScheduleEntity, (schedule) => schedule.scheduleAreas, {
    onDelete: 'CASCADE',
    onUpdate: 'CASCADE',
})
@JoinColumn({ name: 'scheduleId', referencedColumnName: 'id' })
schedule: ScheduleEntity;

 

그래서 위와 같이 코드를 수정하면 정상적으로 작동을 하는 것을 확인할 수 있다!

다시 한번 꼼꼼하게 살펴보자!