JPA 대소문자 구별 에러 해결 with MariaDB

2024. 1. 1. 01:01프로젝트/[EATceed] 몸무게 증량 어플

728x90

 

문제 발생

 

프로젝트를 배포한 후 개발한 api에 요청하였더니, 아래와 같은 문제를 마주하였다.

 

Hibernate : select foodentity0_.food_pk as food_pk1_0_, foodentity0_.food_calorie as food_cal2_0_, foodentity0_.food_carbohydrate as food_car3_0_, foodentity0_.food_fat as food_fat4_0_, foodentity0_.food_main_category as food_mai5_0_, foodentity0_.food_name as food_nam6_0_, foodentity0_.food_protein as food_pro7_0_, foodentity0_.food_serving_size as food_ser8_0_, foodentity0_.food_sub_category as food_sub9_0_ from food_tb foodentity0_ order by foodentity0_.food_name asc limit ?
Error: 1146-42S02: Table 'gaebaljip.food_tb' doesn't exist

 

Hibernate의 쿼리 결과를 살펴보니 뭔가 이상하다.

 

쿼리 안의 테이블 명과 컬럼이 소문자로 작성되어 있다.

분명히, JPA를 통해 테이블 이름과 컬럼 이름을 대문자로 작성하였고, schema.sql의 테이블과 테이블의 컬럼도 대문자로 작성하였습니다.

 

혹시 몰라, 운영중인 RDS의 인스턴스에 쿼리를 날려 테이블과 컬럼을 확인해본 결과 역시 모두 대문자로 작성되어있었습니다.

 

현재, 운영중인 MairaDB의 인스턴스의 테이블은 대문자이고 쿼리안의 테이블은 소문자입니다.

따라서, MariaDB에서는 테이블명을 구분할 때 대소문자를 구분한다는 사실을 알 수 있습니다.

 

 

MariaDB에서는 lower_case_table_names의 default 값이 0이다.

lower_case_table_names란??

lower_case_table_names는 MySQL 및 MariaDB에서 사용되는 시스템 변수로, 데이터베이스 서버가 테이블 이름의 대소문자 구분을 어떻게 처리할지 결정합니다. 이 변수의 값에 따라 테이블 이름의 대소문자 구분 여부가 달라집니다.
-ChatGPT-

 

따라서, Hibernate가 쿼리를 생성하여 날릴 때  JPA에서 컬럼 매핑한 대로 쿼리가 대문자로 날라가면 된다.

 

문제 해결

 

springboot에는 DB Physical Naming Strategy이 있다.

이는 모든 도트는 밑줄로 대체하고 CamelCase대문자는 밑줄로 대체하며 모든 테이블은 소문자로 구성한다.

 

현재 yml에는 Physical Naming Strategy에 관해서 아무런 설정도 하지 않았기 때문에 springboot의 default 설정이 자동 적용된다.

 

따라서, DB Physical Naming Strategy를 변경하면 된다.

 

hibernate에는 설정한 DB 관련 변수들을 그대로 사용할 수 있는 PhysicalNamingStrategyStandardImpl

전략이 있다.

 

 

따라서, yml 파일에 아래 설정을 추가한다.

hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

 

 

해결 완료!

select foodentity0_.FOOD_PK as food_pk1_0_, foodentity0_.FOOD_CALORIE as food_cal2_0_, foodentity0_.FOOD_CARBOHYDRATE as food_car3_0_, foodentity0_.FOOD_FAT as food_fat4_0_, foodentity0_.FOOD_MAIN_CATEGORY as food_mai5_0_, foodentity0_.FOOD_NAME as food_nam6_0_, foodentity0_.FOOD_PROTEIN as food_pro7_0_, foodentity0_.FOOD_SERVING_SIZE as food_ser8_0_, foodentity0_.FOOD_SUB_CATEGORY as food_sub9_0_ from FOOD_TB foodentity0_ order by foodentity0_.FOOD_NAME asc limit ?

 

 

728x90