Spring Batch를 프로젝트에 적용을 하면서 Batch DB와 Entity DB를 분할을 하려던 중 Entity Naming 에 관련하여 문제가 발생하였다 😂
Not a managed type: class Entity ...
처음발생한 문제는 @Entity를 읽지 못하는 에러였다.
Entity annotation을 달지 않아서 발생한 문제인줄 알고 삽질을..하였지만 ㅠㅠ 모든 Entity에 annotation이 모두 붙여져 있다는 것을 확인하였다
도대체 뭐가 문제인거야ㅜㅜ
이 에러를 잡으려다가.. 새로운 에러를 만나게 되었다 🤯
2023-03-03 06:17:50.040 WARN 47525 --- [ restartedMain] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL " create table DETAIL_EXCHANGE ( id bigint not null auto_increment, aud varchar(255), cad varchar(255), chf varchar(255), cny varchar(255), eur varchar(255), gbp varchar(255), hkd varchar(255), jpy varchar(255), nzd varchar(255), usd varchar(255), user_id bigint, primary key (id) ) type=MyISAM" via JDBC Statement
갑자기 처음 보는 "type=MyISAM" 이 나왔고, 알아보니 table type 이 "MyISAM"으로 설정이 되어 발생하는 에러였다!! 난 아무것도 설정하지 않았는데 ㅠㅠ 왜 자동으로 설정되는거냐구..
찾아보니 application.properties 에 아래와 같은 설정을 넣어 변경하였다.
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MariaDBDialect
그 후 DB를 분리를 하려고 시도를 했지만 ㅠㅠ 결국 분리 성공을 하지 못하고 1개의 DB만 사용하기로 했다..
당연히 1개의 DB만 사용하니 별다른 문제들이 발생 안하고 잘 실행 될 줄 알았지만 ㅠㅠ 역시나 또 다른 에러가 발생하였다 😱
more than one table found in namespace...
테이블 이름이 중복한다는 에러였다
분명 hibernate 도 업데이트로 되어 있었는데, 원래 존재하던 table이 새로 생성이 되었다!!
같은 테이블로 인식되어야 할 Entity가 아래와 같은 이름으로 변경되어 새로 추가가 되었다.
예)
user_weather // 기존에 있었던 table
USER_WEATHER // 새로 생성된 table
대소문자를 항상 같은 문자로 인식하던 것이 대문자로 생성이 되었다!!!
구글링으로 1차 해결..ㅜㅜ
Maria db variable 설정이 다른 문자로 인식하도록 설정이 되어있는지 확인해본결과
show variables like 'lower_case_table_names';
value 값이 '1' 로 설정되어 있는 것을 확인하였다.
RDS 들어가서 1 -> 0 으로 수정하였다
수정 법 : https://yeonyeon.tistory.com/68
수정 후 다시 실행 하였지만, 이번에는 이름이 snake_case 로 인식되어야 할 테이블이 camelCase로 새로 생성 되는 것을 확인하였다.
예)
user_weather // 기존에 있던 table userWeahter // 새로 생성된 table
이때 진심 포기하고 싶었다ㅠㅠ
열심히 찾아본 결과ㅠㅠ 처음 근본 원인이.. hibernate naming 문제로 인해 발생한 에러였던 것을 확인하였다 😡 (그동안 삽질.. 열심히 하하핳)
처음 프로젝트 생성시 application.yml 에 hibernate naming 을 아래와 같이 설정해 두었다.
spring: jpa: hibernate: naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
이렇게 설정 할 경우, 원래 snake_case 로 설정될 이름들이 모두 camelCase로 설정된다 ㅠㅠ
snake_case로 변경하기 위해 다시 naming을 설정해 주었다
spring: jpa: hibernate: naming: physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
변경을 해주니, 에러가 나지 않고 잘 작동하는 것을 확인하였다ㅠㅠ
JPA.. 이해하고 쓰자 ㅠㅠ
참조
https://rebeccajo.tistory.com/14
https://mollangpiu.tistory.com/259
https://velog.io/@rladuswl/%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94-%EA%B3%BC%EC%A0%95-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0