오랜만에 프로젝트를 진행하게 되면서 H2 database를 사용하게 되었다. 사실 설정이 어렵지 않은 내용이라 금방 넘어갈 수 있을거라고 생각했지만 실행을 돌려보니 오류가 3개나 발생하였다. 이것에 대한 해결책을 남겨보려고 한다.
이 에러가 발생하였을 때 왜 버전문제가 일어나는지에 대해 의문을 가졌다.
언제나 그렇듯 인텔리제이에서 지원해주는 형식으로 h2를 받았고
runtimeOnly 'com.h2database:h2'
형식으로 build.gradle에서 형식을 받아왔다
그렇게 하니 2.2.2.224버전이 다운받아졌는데 이것이 문제였다. 인텔리제이에서 준 그대로 실행을 돌리는게 왜 문제가 생겼는지 의아했지만 버전 문제는 언제나 어떤게 문제인지 모르는게 맞다.
버전확인을 통해
그래도 나름 안정적으로 활용이 되는 2.1.214버전을 사용하였고
runtimeOnly 'com.h2database:h2:2.1.214'
문제가 해결이 되었다.
Hibernate Dialect를 설정하여야하는 오류도 발생하였다
그것에 대한 부분은 설정부분을 추가하면서 해결을 하였다
spring:
# H2 Setting Info
h2:
console:
enabled: true # H2 Console을 사용할지 여부
path: /h2-console # H2 Console의 Path
# Database Setting Info (Database를 H2로 사용하기 위해 H2연결 정보 입력)
datasource:
### driver-class-name: org.h2.Driver
url: jdbc:h2:~/t
username: sa
password: 44
jpa:
database-platform: org.hibernate.dialect.H2Dialect #추가
hibernate:
ddl-auto: create #데이터베이스 스키마를 자동으로 생성 여부
properties:
hibernate:
dialect: org.hibernate.dialect.H2Dialect #추가
format_sql: true
# use_sql_comments: true # sql 과 함께 jpql 주석처리되어 콘솔창에 출력
# show-sql: true
이것에 대한 설정은 버전과 인식이 잘 되었다면 추가하지 않아도 해결되는 부분이다. 이때까지는 운?이 좋아서 그런지는 몰라도 설정을 따로 해주지 않아도 하이버네이트가 알아서 잘 받아줬었는데 이번에는 제대로 설정을 해주어야 했다.
이제 이 모든 내용을 끝마치고 편안하게 오류수정을 완료했다고 생각했는데 갑자기 또 작은 에러가 났다.
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000a drop table if exists [*]user cascade "; expected "identifier"; SQL statement:
SQL 문장의 구문에 문제가 발생한 것인데 내가 아직 만든 것은 User 엔티티에 대한 간단한 내용 뿐이였다. 그때 갑자기 번쩍 H2에서 User라는 테이블을 만들지 못했었던 것 같은 생각이 들어 테이블 명을 바꿔주니
package com.example.welcometravel.domain.user.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "Users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userName;
@Column(unique = true, length = 100)
private String email;
private String password;
}
잘 실행이 된다.