아래와 같이 application
이라는 엔티티와 테이블을 만들었습니다.
CREATE TABLE application ();
@Entity
@Table(
name = "application",
uniqueConstraints = [UniqueConstraint(columnNames = ["key"])],
)
class ApplicationJpaEntity()
어플리케이션 구동시 ddl-auto는 validate로 설정해두었습니다.
spring:
jpa:
hibernate:
ddl-auto: validate
위와 같이 설정하고, 테이블을 미리 생성해 테이블이 있는것을 Sequel Pro로 확인했음에도 불구하고 아래와 같은 에러가 지속적으로 발생했습니다.
Schema-validation: missing table [application]
해결 방법
명확한 원인을 직접 코드 레벨로 파악한 것은 아니지만 이름이 예약어와 겹치면서 문제가 발생하는 것 같았습니다. 아래 옵션을 추가해 문제를 해결했습니다.
hibernate:
globally_quoted_identifiers: true
globally_quoted_identifiers_skip_column_definitions: true
globally_quoted_identifiers
옵션을 true로 지정하면 컬럼이나 테이블의 이름이 예약어와 충돌하는 것을 방지할 수 있습니다.
해당 옵션을 추가하면 컬럼, 테이블 이름을 Back Quote(`)로 감싸주게 됩니다.
충돌 방지를 위해 globallyquotedidentifiers 옵션을 추가했는데 이후 아래와 같은 예외가 발생하는 경우가 있습니다.
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column
이는 globally_quoted_identifiers
옵션 사용 시 columnDefinition에 있는 단어들도 함께 escape 되면서 발생하는 에러입니다.
위와 같은 에러를 방지하기 위해 globally_quoted_identifiers_skip_column_definitions
옵션을 추가로 설정해주는 것이 좋습니다.