Spring에서 H2 데이터베이스는 주로 개발 및 테스트 환경에서 사용하기에 적합한 가벼운 메모리 기반의 관계형 데이터베이스입니다. H2는 Java로 구현되어 있으며, 빠르고 가볍게 설정할 수 있어서, 특히 애플리케이션의 기본적인 CRUD 작업을 빠르게 실험하거나 테스트할 때 많이 활용됩니다. `Spring Boot`와 쉽게 통합할 수 있고, 자체 내장된 콘솔을 통해 데이터베이스의 데이터를 직관적으로 조회할 수 있습니다.
주요 특징
- In-Memory 및 디스크 모드: H2는 인메모리 모드로 설정할 수 있어, 애플리케이션 종료 시 모든 데이터가 사라지며, 이를 통해 테스트 환경에 적합합니다. 디스크에 저장하는 모드도 지원하여 데이터를 영구적으로 보관할 수 있습니다.
- 빠른 설치 및 간단한 설정: H2는 JAR 파일 하나만으로 작동하며, 별도의 설치 과정 없이 쉽게 사용할 수 있습니다.
- SQL 및 JDBC 호환성: SQL 쿼리를 지원하고 `JDBC`를 통해 Java 애플리케이션과 연결할 수 있습니다.
- H2 콘솔 제공: 브라우저 기반의 웹 콘솔을 통해 직접 데이터베이스를 조회하고 쿼리를 실행할 수 있어, 데이터 상태를 쉽게 확인할 수 있습니다.
- Spring Boot와의 통합: Spring Boot에서는 별도 설정 없이 의존성 추가만으로 H2 데이터베이스를 사용할 수 있습니다.
H2 데이터베이스는 여러 가지 모드로 사용할 수 있습니다. 각 모드에 따라 데이터 저장 방식과 접근 방식이 다르기 때문에, 애플리케이션의 목적에 맞게 적절히 선택하는 것이 중요합니다.
1. 서버 모드 (Server Mode)
서버 모드는 `클라이언트-서버 방식`으로 H2를 사용하는 방식입니다. H2 데이터베이스가 독립적으로 실행되고, 여러 애플리케이션이 네트워크를 통해 데이터베이스에 접근할 수 있는 구조입니다.
- 특징: 독립된 데이터베이스 서버가 실행되며, TCP/IP 프로토콜을 통해 네트워크 접근이 가능합니다.
- 장점: 여러 애플리케이션이 동시에 접근 가능하며, 실제 데이터베이스와 유사하게 사용할 수 있어 로컬 개발용으로 적합합니다.
- 단점: 인메모리 모드보다는 초기 설정이 필요하며, 별도의 서버 프로세스를 유지해야 합니다.
- 사용 방법:
- jdbc:h2:tcp://localhost/~/testdb 같은 형태의 URL을 사용합니다.
- 서버를 먼저 실행해야 하며, H2 Console 또는 애플리케이션에서 네트워크를 통해 접속합니다.
2. 인메모리 모드 (In-Memory Mode)
인메모리 모드는 데이터를 메모리에만 저장하고 애플리케이션 종료 시 모든 데이터가 사라지는 방식입니다. 주로 테스트 환경에서 빠르게 데이터를 읽고 쓰기 위해 사용됩니다.
- 특징: 애플리케이션과 H2 데이터베이스가 동일한 JVM 메모리를 공유합니다.
- 장점: 매우 빠르며, 테스트 환경에서 DB 초기화 및 데이터 휘발이 필요할 때 적합합니다.
- 단점: 애플리케이션 종료 시 데이터가 모두 삭제되기 때문에 영구적인 데이터 보관에는 부적합합니다.
- 사용 방법:
- jdbc:h2:mem:testdb 형태의 URL을 사용하여, 메모리 기반으로 데이터베이스를 설정합니다.
- Spring Boot에서 기본적으로 지원하며, 인메모리 모드로 설정하면 테스트 시 매번 새로운 데이터베이스를 생성합니다.
3. 임베디드 모드 (Embedded Mode)
임베디드 모드는 H2 데이터베이스를 애플리케이션 내부에 임베드하여 로컬 파일로 데이터를 저장하는 방식입니다. 애플리케이션이 실행될 때 H2가 로드되며, 별도의 데이터베이스 서버 없이 애플리케이션 내에서 데이터베이스가 동작합니다.
- 특징: 애플리케이션이 실행되면서 데이터베이스가 함께 로드되고, 파일로 데이터를 저장하여 애플리케이션 종료 후에도 데이터를 보관할 수 있습니다.
- 장점: 설치 과정이 필요 없으며, 로컬 파일로 데이터를 저장하므로 개발과 테스트 환경에서 영구적인 데이터 보관이 가능합니다.
- 단점: 애플리케이션과 데이터베이스가 밀접하게 연결되어 있어, 여러 애플리케이션이 동일 데이터베이스에 접근하기 어렵습니다.
- 사용 방법:
- jdbc:h2:~/testdb와 같은 URL을 사용하여 파일 기반 데이터베이스로 설정합니다. ~은 사용자 홈 디렉토리를 의미합니다.
- 파일 시스템에 데이터베이스 파일이 생성되어 애플리케이션 종료 후에도 데이터를 보관할 수 있습니다.
각 모드의 요약 및 선택 가이드
모드 | 특징 | 장점 | 단점 | 추천 용도 |
서버모드 | TCP/IP로 접근하는 독립 서버 방식 | 다중 애플리케이션 접근 가능 | 별도 서버 프로세스 필요 | 로컬 개발 및 네트워크 연결이 필요한 경우 |
인메모리 모드 | 메모리에 데이터 저장, 종료 시 데이터 삭제 | 빠른 속도, 테스트에 적합 | 애플리케이션 종료 시 데이터 삭제 | 단기 테스트, 유닛 테스트 등 |
임베디드 모드 | 애플리케이션 내에 파일로 임베드됨 | 설치 없이 파일로 데이터 저장 | 다른 애플리케이션 접근 어려움 | 단일 애플리케이션 개발 및 테스트 환경 |
Spring Boot에서 H2 설정하기
1. 의존성 추가
`build.gradle` 파일에 H2 데이터베이스 의존성을 추가합니다.
dependencies {
implementation 'com.h2database:h2'
}
2. 애플리케이션 설정
`application.properties`나 `application.yml` 파일에서 H2 설정을 추가합니다.
# H2 데이터베이스 설정
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true # H2 콘솔 활성화
spring.h2.console.path=/h2-console # H2 콘솔 경로 설정
3. H2 콘솔 접속
애플리케이션을 실행한 후, `http://localhost:8080/h2-console`에 접속하면 H2 콘솔에 접근할 수 있습니다. 접속 시 JDBC URL, 사용자명, 비밀번호를 입력하여 접속합니다. 위 설정의 경우, `jdbc:h2:mem:testdb` URL과 `sa` 사용자명을 입력하면 됩니다.
예제 Entity와 Repository 설정
다음은 간단한 H2 데이터베이스를 사용하는 Spring Data JPA 예제입니다.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
// Getters and setters
}
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {
}
H2 데이터베이스 사용 시 주의할 점
- 데이터 휘발성: 인메모리 모드로 설정하면 애플리케이션 종료 시 데이터가 삭제됩니다. 영구적으로 데이터를 보관하려면 디스크 모드로 설정해야 합니다.
- 생산 환경 비적합: H2는 개발 및 테스트 환경에 최적화되어 있으며, 데이터베이스가 매우 가벼운 만큼 성능이 제한적이기 때문에 실제 운영 환경에서는 MySQL, PostgreSQL 같은 별도의 DBMS를 사용하는 것이 좋습니다.
H2 데이터베이스는 개발 중인 애플리케이션의 빠른 테스트에 유용하며, 특히 Spring과 통합하여 `JPA` 작업을 실험하기에 적합한 도구입니다.
읽어주셔서 감사합니다.
'Spring' 카테고리의 다른 글
Spring - JDBC Template (1) | 2024.11.10 |
---|---|
Spring - Database Driver (1) | 2024.11.09 |
Spring - @Transactional (1) | 2024.11.05 |
Spring - REST API 와 RESTful (0) | 2024.10.18 |
Spring - JPA, Entity, 영속성 컨텍스트 (4) | 2024.10.10 |