JPA Create Table Error

JPA 초기 적용 시, 테이블 생성 불가 문제

원인 : 테이블 생성 시, CREATE 문이 정상적으로 수행되지 않음.

오류 내용

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement “\000a    
create table pas_table_info (\000a       tbl_info_id bigint not null auto_increment,\000a        
modified_wker_dt datetime(6),\000a        modified_wker_id varchar(255),\000a        
created_wker_dt datetime(6),\000a        created_wker_id varchar(255),\000a        
tbl_comments varchar(255),\000a        tbl_name varchar(255),\000a        
tbl_owner varchar(255),\000a        tbl_pk varchar(255),\000a        
tbl_type varchar(255),\000a        primary key (tbl_info_id)\000a    ) engine[*]=InnoDB”; 
expected “identifier”; SQL statement: ...

오류에 대한 예상 원인

  • DB 예약어를 사용하여 객체를 정의할 경우, 해당 에러가 발생함.
    • 인터넷에 찾아보면 제일 많았던 오류, 그래서 다 찾아봤으나 해결 못함.
  • Dialect 설정이 잘못된 경우, mysql 방언도 종류 별로 deprecated 된 클래스도 있고 다양함.
    • 하지만 딱히 크게 문제되는 부분이 없었음.
    • DB 버전에 맞게 설정했어도 문제가 동일하게 발생함
  • 드라이버 설정이 DB와 호환성 문제 발생 케이스
    • 드라이버 설정 및 버전이 DB와 호환이 안되는 경우에 발생
    • 해당 케이스 수정하여도 문제 동일하게 발생함.

해결

원래 초기 설정 내 datasource의 경우, 기존 업무 프로젝트에서 사용한 것과 동일하게 가져옴.

다만 설정만 가져왔지 별도의 DB config나 그런건 가져오지 않음. 여기서 문제가 발생함.

  • 기존 datasource 코드
  datasource:    
      primary:      
        driver-class-name: com.mysql.cj.jdbc.Driver      
        jdbc-url: jdbc:mysql://127.0.0.1:3306/test      
        username: test      
        password: 1234
  • 문제 해결한 코드
  datasource:      
    driver-class-name: com.mysql.cj.jdbc.Driver      
    url: jdbc:mysql://127.0.0.1:3306/test      
    username: test      
    password: 1234

왜 문제가 되었나?

설정의 spring.datasource.jdbc-url 이 문제가 되었다. Spring 에서는 spring.datasource.url 이 없으면, 자동으로 Embeded database가 자동으로 실행된다. jdbc-url은 자동설정된 datasource빈을 사용하지 않고, 직접 config 설정한 빈을 사용할때 사용된다.(예: 여러개의 datasource가 필요할경우).

즉 스프링 부트 내부에서는 hikari cp가 기본 설정이긴 하지만 hikari.jdbc-url 옵션을 참고하지 않는다. 따라서, 별도 설정된 데이터소스 Config 가 없는 상황에서 jdbc-url을 사용하여, 구동 시 해당 주소를 찾지 못해 Create를 내장된 h2에 치려고 하니 방언을 mysql 로 잡아서 문법에러가 계속 발생했다.

실제로 위 에러 내용을 보면 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException 라고 되어 있다.

MySQL 로 연결 시도를 했는데 왜 h2 DB 에러를 발생시키지? 를 먼저 생각했다면 파악할 수도 있었을 것 같다.

참고

  • https://blog.naver.com/PostView.naver?blogId=sipzirala&logNo=222484525256&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView
  • https://jojoldu.tistory.com/296
  • https://stackoverflow.com/questions/71255939/what-is-difference-spring-datasource-hikari-jdbc-urls-parameter-connection-tim

© 2024. Chiptune93 All rights reserved.