개발/spring

[h2] 테스트 DB 연결 시 팁

방푸린 2023. 8. 17. 16:07
반응형

환경: 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]

http://www.h2database.com/html/advanced.html

2. 다른 이름으로 바꿔도.. 제대로된 순위가 나오지 않는다..

 

h2에서 등수를 뽑거나,, session variable을 사용하려면 아래 h2함수를 사용해야 하는 것 같다..

http://h2database.com/html/functions.html#set

 

즉.. 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;
728x90
반응형