(Spring) DB 관련 - H2 설정
H2 세팅
build.gradle 설정
1
2
runtimeOnly 'com.h2database:h2'
// runtimeOnly 'com.h2database:h2:1.4.193'
반드시 버전을 명시해줄 것.버전 명시하지 않을 시 최신 버전이 설치되는데, 콘솔에서 connect해보면 자동으로 db 파일을 생성할 수 없어서 에러가 발생한다. :mem:을 써서 인메모리에 하든, :file:을 써서 파일로 저장하든 관계없이 에러가 발생함. 이는어떤 취약점 때문에자동으로 파일 생성하는걸 막아둬서 그렇다고 함. IFEXISTS 플래그를 주면 된다고 나와있는데 줘도 안됨.Database “mem:testdb” not found, and IFEXISTS=true, so we cant auto-create it [90146-199] 90146/90146 (Help)
- 또 최신 버전으로 바꿔서 해보니까 잘 되네… 뭐가 문제였을까…
- 아무튼, 예전 버전 DB를 쓰는 경우 주의해야 하는게 Java8 대응 같은게 안돼서 뭔가 안돌아갈 수 있음. 이런 종류의 에러는 원인이 딱 생각이 안나서 생각보다 애를 먹을 수 있음.
- 2019/07/10 - [Coding/Kotlin Java] - [java] 날짜 시간 처리 관련 : DB에서 꺼낸 데이터가 LocalDateTime 타입 필드에 들어갈 때 에러나는 경우가 있음 항목 참조
application.yml 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
h2:
console:
enabled: true
path: /h2-console # localhost:8080/h2-console로 콘솔 접속
sql:
init:
schema-locations: init-h2/schema.sql
data-locations: init-h2/data.sql
## member_key 같은 컬럼을 memberKey 필드에 자동으로 매핑되게 하려면
mybatis.configuration.map-underscore-to-camel-case=true
DB_CLOSE_DELAY, DB_CLOSE_ON_EXIT에 대한 설명은 공식 docs 참조
schema.sql, data.sql 초기화
- 프로젝트 실행 시 자동으로 테이블 생성하고 mock 데이터 넣는 것은 다음 링크를 참조.
- 틀리게 나와있는 곳이 너무 많은데, 아래 링크에 정확하게 나와있다.
- https://stackoverflow.com/questions/38040572/spring-boot-loading-initial-data
- https://docs.spring.io/spring-boot/how-to/data-initialization.html#howto.data-initialization.using-basic-sql-scripts
기타
H2에서의 ACID
http://www.h2database.com/html/advanced.html#acid
H2에서는 @Transactional(SERIALIZABLE)로 설정해도 deadlock이 안걸린다.
- 2019/07/23 - [DB] - Transaction 관련 : isolation level, deadlock
- 1.4.193 버전만 그런건지는 모르겠는데… MySQL 같은 경우 deadlock이 걸리면서 트랜잭션 수행이 안되는데 H2는 그냥 그런거 없이 실행됨.
- 근데 FOR UPDATE 로 update lock을 거는건 잘 된다.
This post is licensed under CC BY 4.0 by the author.