[h2] 테스트 DB 연결 시 팁
환경: springboot2.5 이상, mysql 5.7 버전
1. spring jpa h2디비 적용 시 테이블 명이 아래와 같을 때 아무 설정을 안 해주면 camel case -> snake로 변형되어 적용된다.
@Table(name = "GlobalAccounts")
즉 위 테이블이 global_accounts 로 변경되어 생성된다.
테이블 명 그대로 적용되어야 한다면 아래 설정을 추가한다.
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
2. 프로덕션 코드의 설정파일이 yml 이고 테스트 코드 설정파일이 properties 면 자동으로 설정되지 않는 것 같다. 도대체 왜지?!!!
https://mageddo.com/tools/yaml-converter 로 굳이 properties -> yml을 변환하여 설정하였다.
그게 싫다면 아래 어노태이션을 매 테스트 클래스마다 넣어야 하는데 매우 별로..
@TestPropertySource(locations = "classpath:application.properties")
+ application.properties 와 application.yml 둘 다 있을 경우 yml -> properties 순으로 로딩되어 같은 key값이 있을경우 properties의 값으로 덮어짐
3. rownum에 대하여
mysql 8.0 이상에서는 row_number() 윈도우 함수를 사용가능하나 그 이하 버전에서는 지원하지 않는다.
그래서 아래와 같이 session variable을 이용하여 쿼리 내에서 등수를 뽑곤 하는데..
여기서
1. session variable 명이 h2 예약어(rownum) 이면 identifier 에러가 나고
expected identifier [42001-200]
2. 다른 이름으로 바꿔도.. 제대로된 순위가 나오지 않는다..
h2에서 등수를 뽑거나,, session variable을 사용하려면 아래 h2함수를 사용해야 하는 것 같다..
즉.. springboot jpql로 native query를 테스트하려면.. h2 문법도 잘 알아야할 듯하다.
4. String value too long 에러
h2의 경우 String에 어마무시한 json을 담을 경우 아래와 같은 에러를 만날 수 있는데,
Caused by: org.h2.jdbc.JdbcSQLDataException: Value too long for column "options CHARACTER VARYING(255)"
String은 기본 255 길이까지 가능이라, 그 이상의 데이터는 최장 길이를 아래와 같이 명시해주어야 한다..
@Column(length = 512)
private String options;