H2 Database란?
H2 Database는 가볍고 편리한 인 메모리 데이터 베이스로 프로그램 구동 시 메모리에 데이터를 저장하고, 애플리케이션이 종료되면 메모리가 삭제되는 데이터베이스이다. 이는 일반적으로 테스트 환경 혹은 Dev 환경 등 데이터에 대한 영속성이 요구되지 않는 환경에서 데이터를 저장하는데 사용한다. 브라우저 기반의 콘솔 프로그램 또한 제공해, 어떤 데이터가 저장되었고 삭제되었는지를 편하게 확인할 수 있다.
📌 영속성이란 프로그램이 종료돼도 데이터가 사라지지 않는 특성을 뜻한다.
이번 시간에는 Spring Data JPA를 사용해 H2 Database를 사용 설정하는 방법을 알아볼 것이다.
코틀린 스프링 프로젝트에 Spring Data JPA, H2 Database 사용 설정하기
plugin.jpa 플러그인 사용 설정하기
일반적으로 스프링에서 JPA를 사용한다고 하면, 구현체인 Hibernate를 사용한다. 이 Hibernate는 ORM 라이브러리로써 특정 객체를 테이블에 매핑 시키기 위해 @Entity 라는 어노테이션을 사용하는데, Hibernate의 사용자 가이드에서는 이 @Entity라는 어노테이션이 붙은 클래스는 매개변수가 없으면서 가시성이 public 혹은 protected로 설정된 생성자가 있어야 한다고 명시한다.
하지만, 코틀린에서 프로퍼티가 정의된 클래스는 일반적으로 기본 생성자를 자신이 가진 프로퍼티를 매개변수로 갖는 생성자를 자동으로 생성한다. 이로 인해 Hibernate의 요구사항과 충돌이 발생할 수 있으며, 이를 해결하기 위해서는 다음과 같이 별도의 생성자를 정의하고 이 생성자를 호출할 때는 기본 값들을 사용해 객체가 생성될 수 있도록 해야 한다.
@Entity
class User(
@Id val id: Long? = null,
val name: String
) {
constructor() : this(null, "")
}
하지만, 매번 Entity를 정의할 때마다 이런 매개변수가 없는 생성자를 만드는 것은 보일러 플레이트 코드가 되고, 코드의 가독성을 떨어트릴 수 있다. 이 문제를 해결하기 위해 코틀린에서는 plugin.jpa라는 플러그인을 제공한다. 이 플러그인을 사용하면, 클래스를 아래와 같이 같이 작성해도 컴파일 타임에 자동으로 매개변수가 없는 생성자를 만들어준다.
@Entity
class User(
@Id val id: Long? = null,
val name: String
)
plugin.jpa 플러그인을 적용하는 방법은 간단하다. 단순히 build.gradle.kts 파일에 다음과 같이 plugin.jpa 플러그인을 추가하면 된다.
plugins {
// JPA 플러그인 설정
kotlin("plugin.jpa") version "1.9.25"
}
이제 플러그인 설정이 마무리 됐으니, 의존성 설정을 진행해보자.
Spring Data JPA, H2 Database 의존성 설정하기
Spring Data JPA를 사용하기 위해서는 두가지 의존성을 설정해야 한다. 하나는 Spring Boot 프로젝트에서 JDBC(Java Database Connectivity)를 더 쉽고 효율적으로 사용할 수 있도록 도와주는 스타터 패키지인 spring-boot-starter-data-jdbc 라이브러리에 대한 의존성을 추가하는 것이고, 다른 하나는 Spring Boot 프로젝트에서 JPA(Java Persistence API)를 쉽고 효율적으로 사용할 수 있도록 도와주는 스타터 패키지인 spring-boot-starter-data-jpa에 대한 의존성을 추가하는 것이다. 이들 각각에 대한 의존성은 implementation 함수를 통해 설정한다.
dependencies {
// Spring Data JDBC 의존성 설정
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
// Spring Data JPA 의존성 설정
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
...
}
이제 H2 Database에 대한 설정만 남았다. H2 Database는 런타임에 실행되는 인메모리 데이터 베이스 이므로, runtimeOnly 함수를 통해 com.h2database:h2 를 사용하도록 하면 된다.
dependencies {
// Spring Data JDBC 의존성 설정
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
// Spring Data JPA 의존성 설정
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
// H2 Database 사용 설정
runtimeOnly("com.h2database:h2")
...
}
이렇게 설정하면 모든 의존성 설정이 마무리 된다.
이제 마지막 한 단계가 남았다. 나머지 한 단계도 마저 마무리 해보자.
@Entity, @Embeddable, @MappedSuperclass가 붙은 클래스들이 상속 가능하게 만들기
자바에서는 기본적으로 클래스가 상속 가능하게 설정되는 반면, 코틀린에서 클래스는 기본적으로 final로 선언돼 상속이 불가능하며, 상속 가능하게 만들기 위해서는 다음과 같이 open 이라는 키워드가 앞에 붙어야 한다.
@Entity
open class User(
@Id val id: Long? = null,
val name: String
)
하지만, Hibernate를 사용할 때는 @Entity, @Embeddable, @MappedSuperclass 가 붙은 클래스들은 상속 가능하도록 되어야 한다. 이를 위해 build.gradle.kts 파일에 다음과 같은 설정을 추가로 해주면 @Entity, @Embeddable, @MappedSuperclass 어노테이션이 붙은 클래스들이 상속 가능해진다.
allOpen {
annotation("jakarta.persistence.Entity")
annotation("jakarta.persistence.MappedSuperclass")
annotation("jakarta.persistence.Embeddable")
}
*allOpen 블록은 Kotlin의 kotlin-allopen 플러그인을 사용하여 특정 애노테이션이 붙은 클래스들을 자동으로 open으로 만드는 데 사용되는 블록이다.
이제 build.gradle.kts에서는 모든 준비가 마쳐졌다. 전체 코드는 다음 링크에서 확인할 수 있다.
전체 코드: build.gradle.kts - GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.
다음으로는 H2 Database관련 설정을 application.properties에 추가해보자.
application.properties에 H2 Database 설정하기
H2 Database 연결 설정하기
H2 Database 연결을 설정하기 위해서는 다음 네가지를 설정해줘야 한다.
- spring.datasource.url: 어떤 url을 통해 db에 접근이 가능한지
- spring.datasource.driverClassName:어떤 드라이버를 사용할 것인지
- spring.datasource.username: DB 유저 이름
- spring.datasource.password: DB 유저 비밀번호
예를 들어 jdbc:h2:mem:testdb 를 통해 db에 접근하면서 org.h2.Driver 드라이버를 사용하고, 사용자 이름은 user 비밀번호는 password으로 설정하고 싶다면 다음과 같이 설정해주면 된다.
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=dummyuser
spring.datasource.password=password
그러면 연결과 관련된 설정이 마무리되었다.
H2 Database 콘솔 설정하기
이제 H2 Database 용 콘솔을 사용할 수 있도록 설정해보자. spring.h2.console.enabled의 값을 true로 두면 콘솔이 활성화되고, spring.h2.console.path를 /h2-console로 설정하면 /h2-console 경로를 통해 콘솔 창에 접근할 수 있게 된다.
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
여기까지 모든 준비가 마무리됐다. 전체 코드는 다음 링크에서 확인할 수 있다.
전체 코드: application.properties-GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.
이제 스프링 애플리케이션을 실행하고, 콘솔에 접근해보자.
H2 Database 콘솔 사용하기
http://localhost:8080/h2-console 로 접근하면 다음과 같은 화면이 나온다.
화면에 위의 application.properties에 설정한 데이터를 적은 후 Connect를 눌러주면 다음과 같이 콘솔 창이 나오는 것을 볼 수 있다.
여기까지 모든 설정이 마무리됐다.
이어서 H2 Database 내부에 테이블을 만드는 방법을 알아보자.
전체 코드: GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.