반응형
문제 상황
Repository 테스트 코드 작성을 위해 H2 데이터베이스 세팅 중 JPA를 통한 Table 생성 오류가 발생하였습니다.
- h2 데이터베이스에서 TINYINT형을 지원하지만, @Column(columnDefinition = "TINYINT(1)") 처럼 길이를 제한하는 경우는 인식을 하지 못하는 문제였습니다.
- @Column(columnDefinition = "TINYINT", length=1) 로 설정해도 제대로 길이를 제한이 되지 않음
// @Column(columnDefinition = "TINYINT(1)")
// @Column(columnDefinition = "TINYINT", length = 1)
@Column(columnDefinition = "TINYINT")
private Integer status;
에러 메시지
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table histories (floor integer, room_no integer, slot_id integer, status TINYINT(1),)";]
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:94) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.internal.Helper.applySqlStrings(Helper.java:217) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createTables(SchemaCreatorImpl.java:428) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createSequencesTablesConstraints(SchemaCreatorImpl.java:344) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:239) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:172) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:142) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:118) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:250) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at java.base/java.util.HashMap.forEach(HashMap.java:1429) ~[na:na]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:322) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
...
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "create table histories (floor integer, room_no integer, slot_id integer, status TINYINT[*](1),)"; SQL statement:
create table histories (floor integer, room_no integer, slot_id integer, status TINYINT(1), primary key (id)) [42001-224]
생각한 해결 방법
- 애플리케이션 운영 환경에서는 ddl-auto=none으로 실행하고 있으므로, TINYINT(1)을 TINYINT로 변경하여 진행하기
- 실제 운영 데이터베이스에는 TINYINT(1)로 설정되어 있고 JPA로 변경하지 않는다면 큰 문제는 없음
- 애플리케이션에서 관리하는 엔티티의 DDL 정보를 schema.sql를 이용해 실행
- 별도의 스키마 파일을 작성해야 하는 불편함이 있음
결론으로는 1번 방법으로 기존 엔티티에 컬럼 설정을 TINYINT로 변경해서 해결하였다.
테스트 코드 작성을 위해 기존 코드를 변경하는 것이 좋지 않은 방법인데, 테스트 코드 실행 시 schema.sql 로 테이블 스키마 초기화가 잘 되지 않아 1번 방법으로 진행하였습니다.
추후에 sql 파일로 초기화하는 방법도 포스팅하겠습니다.
참고자료
Hibernate JPA, MySQL and TinyInt(1) for Boolean instead of bit or char
반응형
'트러블슈팅' 카테고리의 다른 글
[트러블슈팅] Spring DateTimeFormatter 생성 비용 최적화 (0) | 2024.11.07 |
---|---|
[트러블슈팅] 스프링 @SpringBootTest와 @ExtendWith 빈 주입 이슈 해결 - No qualifying bean of type 'package path' available (0) | 2024.10.01 |
[Mac] iTerms2 개발 환경 세팅하기 (2) | 2024.09.08 |
[트러블슈팅] Spring Cache Redis - List 역직렬화MismatchedInputException 해결 (0) | 2024.08.17 |
[트러블슈팅] Jib 빌드 이미지 실행 이슈 해결 - Error: Unable to access jarfile app.jar (0) | 2024.08.09 |