카테고리 없음

[SpringBoot] Hibernate DB Table 생성시 오류 발생 (org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL ")

MoveForward 2025. 6. 13. 00:48

[콘솔 에러 메시지]

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
    alter table bet 
       add constraint FK7i47jpjlmnmjf89vsd8humfw1 
       foreign key (member_id) 
       references member (member_id)" via JDBC [Key column 'member_id' doesn't exist in table]
at ...

 

"bet" 테이블을 생성하는데 외래키인 member_id를 찾을 수 없다는 것이다.

위 에러 메시지는 일부분만 발췌한 것이다.

전체 에러 메시지는 Member 테이블의 기본키인 "member_id" 뿐만 아니라, Bet 테이블이 외래키로 참조하는 모든 키에 대해 찾을 수 없다는 내용의 메시지를 포함하고 있었다.

 

오류가 발생한 문제의 원인은 다음 2가지로 유추하였다.

1. 엔티티의 잘못된 연관관계 매핑

2. DB의 구조적 오류

 

 

[Bet Entity 구성]

/**
 * 배팅
 * (Member : Bet = 1 : N)
 * (Event : Bet = 1 : N)
 * (BettingOption : Bet = 1 : N)
 */
@Entity
@Getter
@NoArgsConstructor
public class Bet extends BaseEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "bet_id")
    private Long id;

    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "member_id", nullable = false)
    private Member member;

    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "event_id", nullable = false)
    private Event event; //소속 Event

    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "betting_option_id", nullable = false)
    private BettingOption bettingOption; //배팅 옵션

    private Long amount; //배팅 포인트
    //생성 일자(배팅 일자)
}

Member, Event, BettingOption 엔티티도 반대로 @OneToMany로 올바르게 매핑되어 있었다.

이를 보았을때, "1. 엔티티의 잘못된 연관관계 매핑"이 오류의 원인은 아니다.

 

그렇다면, "2. DB의 구조적 오류"가 원인인가?

jpa:
  hibernate:
    ddl-auto: create

프로젝트를 실행하면 모든 테이블을 DROP후 CREATE 하는 전략을 채택하고 있어서 외래키를 왜 참조하지 못하는지 이해하지 못하였다. 

 

MySQL DB의 "Bet" 테이블의 구조를 살펴보았더니, 기본키인 "id" 만 존재하고 나머지 컬럼은 존재하지 않았다.

 

에러 메시지에 명시된 것처럼 외래키가 모두 컬럼으로 생성되지 못하였다.

 

 

[해결 방안]

@JoinColumn의 nullable 속성을 조정해보고, ID 생성 전략인 @GeneratedValue의 strategy 속성을 조정해보았지만, 아무런 소득이 없었다.

 

"MySQL의 스키마 자체를 삭제 후 재생성하고, 프로젝트를 실행"하였다.

에러 없이 Bet 테이블이 모든 컬럼을 가지고 있는 것을 확인할 수 있다.