Intro
스프링부트에서는 아래와 같은 설정으로 간단하게 인메모리 H2 데이터베이스를 사용 할 수 있습니다.
application.yml
spring:
datasource:
url: jdbc:h2:mem:testdb
username: sa
build.gradle.kts
runtimeOnly("com.h2database:h2")
이후 h2:console 설정을 켠다면, 콘솔 페이지에서 데이터베이스를 직접 확인 해 볼 수 있는데요
spring:
h2:
console:
enabled: true
settings:
web-allow-others: true
위와 같이 설정했을때에는, /h2-console
경로로 들어가면 데이터베이스를 웹 페이지에서 직접 확인 해 볼 수 있습니다.
그런데, Test Connection을 해 보았을 때 아래와 같이 오류가 발생하는 경우가 있습니다.
Database "mem:testdb" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-214] 90149/90149 (Help)
원인
에러 메시지에서 알 수 있는 것 처럼, mem:testdb
데이터베이스가 존재하지 않기 때문입니다. 미리 생성을 하거나 리모트 데이터베이스 생성을 허용하면 된다고 하면서, 두번째 옵션은 보안상 추천하지 않는다고 하네요.
External Libraries를 확인 해 보면
h2:database:2.1.214
버전이 들어와 있는 것을 확인 할 수 있습니다.
그런데 H2:1.4.198
버전부터 보안상의 문제로 자동 데이터베이스 생성을 막아 두었는데요, 그렇게 때문에 DB 파일이 생성되지 않고 있기 때문에 이러한 문제가 발생 한 것 입니다.
만약 H2 콘솔에서의 데이터베이스 생성을 허용 한다면, /h2-console
페이지로 접속 할 수 있는 누구나 시스템에 접근해 원하는 무엇이든 할 수 있는 보안상 허점이 생기게 됩니다.
해결
데이터베이스 수동 생성
물론 H2 버전을 1.4.197 이하로 낮추는 방법으로 (보통 1.4.193로 많이 변경합니다) 문제를 해결 할 수 있지만, 위에서 언급 했던 것 처럼 찝찝한 보안상의 이슈가 생깁니다.
조금은 번거롭더라도 수동으로 데이터베이스 파일을 생성 해 주는 것이 좋은데요.
데이터 베이스 생성은 아래의 링크를 참고 하시면 됩니다.
https://h2database.com/html/tutorial.html#creating_new_databases
하지만 이어서 소개해드릴 더 쉬운 방법이 있습니다.
더미 Entity 생성으로 DB 생성 유도하기
제가 주로 사용하는 방법인데요, JPA를 사용한다면 ddl-auto
기능을 활용해서 쉽게 해결 할 수 있습니다.
다들 아시는 것 처럼, DDL-AUTO 기능을 사용하면 스프링부트 어플리케이션이 실행되며 자동으로 필요한 테이블을 생성 하는데요, 그 과정에서 데이터베이스도 만들게 됩니다.
- 아래와 같이 ddl-auto를 create-drop 으로 변경 하고 (인메모리 DB로 작동하기 때문에 어차피 새로 켤 때 초기화 됩니다)
spring:
application:
name: user-service
datasource:
url: jdbc:h2:mem:testdb
username: sa
jpa:
hibernate:
ddl-auto: create-drop # 시작할 때 새로 생성 하고 세션을 마칠 때 스키마를 소멸 시킵니다.
show-sql: true
h2:
console:
enabled: true
settings:
web-allow-others: true
- 엔티티 클래스를 하나 생성 해 줍니다.
뭐든 상관 없으니 JPA가 자동으로 테이블을 만들 수 있을 정도로만 해주면 충분 합니다.
@Entity
class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
}
- 이제 준비가 되었으니 어플리케이션을 실행 해 줍니다.
위에 보이는 것 처럼, 어플리케이션이 실행 되며 테이블이 drop 및 create 됩니다.
- 이제 h2-console 에서
Test Connection
이 문제 없이 가능합니다.
이상입니다.
'Programming > JPA ⁄ Spring' 카테고리의 다른 글
스프링 Stereotype 어노테이션 @Component @Controller @Service @Repository 차이점 (0) | 2022.12.30 |
---|---|
스프링 부트 프로젝트에서의 안정적인 대용량 파일 업로드 (0) | 2022.12.11 |
스프링 부트 java -jar 혹은 bootrun시 port 변경하기 (0) | 2022.11.14 |
[SpringBoot] 에러 발생시 Slack으로 알림 보내기 (0) | 2022.10.26 |
BCryptPasswordEncoder 사용시 인코딩 할때마다 결과가 달라져요 (0) | 2022.10.15 |