밤빵's 개발일지
[TIL]20240924 H2 데이터베이스 사용법 본문
H2 데이터베이스 사용법
개발을 하게되면 여러 가지 데이터베이스(DB)를 다룰 필요가 있다. 특히 로컬에서 애플리케이션을 개발하고 테스트할 때는 경량화된 인메모리(In-Memory) 데이터베이스가 유용한데, 그 중에서 H2 데이터베이스라는 걸 알게되면서, 이번 개발일지를 통해 H2 데이터베이스의 개념과 설정 방법, 그리고 실제 사용 예시를 만들어봤다.
▶H2 데이터베이스란?
H2 데이터베이스는 경량화된 오픈 소스 관계형 데이터베이스로, 인메모리 방식과 디스크 저장 방식을 모두 지원한다. 데이터베이스 데이터를 메모리에만 저장하거나, 파일로 저장할 수 있다. H2는 JDBC API를 통해 쉽게 접근할 수 있고, Spring Boot 같은 프레임워크에서 테스트용 데이터베이스로 자주 사용된다. 주요 특징은 다음과 같다.
→ 빠른 속도:
메모리에 데이터를 저장하기때문에 매우 빠른 속도로 데이터 접근이 가능하다.
→ 경량성:
작은 크기의 경량 데이터베이스로, 설치나 설정이 간단하다.
→ 웹 콘솔 제공:
데이터베이스를 직접 조회하고 조작할 수 있는 웹 기반 콘솔을 제공한다.
→ 테스트에 적합:
애플리케이션 개발 중, 테스트 환경에서 데이터베이스를 쉽게 사용할 수 있어서 개발 및 테스트에 유리하다.
▶ H2 데이터베이스 설정하기
H2 데이터베이스는 주로 Spring Boot 환경에서 많이 사용된다. Spring Boot 프로젝트에 H2 데이터베이스를 설정하는 방법은 간단하다.
▷ Gradle에서 H2 의존성 추가
먼저 build.gradle 파일에 H2 데이터베이스 의존성을 추가 한다.
dependencies {
implementation 'com.h2database:h2'
runtimeOnly 'com.h2database:h2'
// Spring Boot 관련 다른 의존성들 생략!
}
→ H2 데이터베이스가 프로젝트에 추가된다. 이후 애플리케이션이 실행될 때 H2 데이터베이스가 함께 시작된다.
▷ application.properties 또는 application.yml 파일 설정
다음으로 src/main/resources 폴더에 있는 application.properties 또는 application.yml 파일에 H2 데이터베이스 설정을 추가한다. Spring Boot는 기본적으로 H2 데이터베이스를 쉽게 사용할 수 있도록 설정을 제공하므로, 필요한 최소 설정을 추가하면 된다.
# H2 데이터베이스 설정
# 메모리 상에 testdb라는 이름으로 H2 데이터베이스 생성
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# H2 웹 콘솔 활성화
spring.h2.console.enabled=true
# H2 웹 콘솔 접속 경로
spring.h2.console.path=/h2-console
# Hibernate 설정
spring.jpa.hibernate.ddl-auto=update
# 애플리케이션 포트 설정
server.port=8082
→ 위 설정은 인메모리 모드로 H2 데이터베이스를 설정한 예시로, H2의 웹 콘솔을 /h2-console 경로로 활성화해 데이터베이스 상태를 쉽게 확인할 수 있다.
▷ H2 웹 콘솔 접속하기
H2 웹 콘솔을 사용하면 데이터베이스 상태를 쉽게 조회하거나 직접 SQL 쿼리를 실행할 수 있다. 애플리케이션을 실행한 후 브라우저에서 http://localhost:8082/h2-console로 접속하면 H2 웹 콘솔 화면이 나타난다. 여기서 다음과 같은 정보로 로그인할 수 있다.
application.properties 또는 application.yaml 에 설정한
- JDBC URL: jdbc:h2:mem:testdb
- User Name: [기본값은 sa]
- Password: [빈칸]
로그인 후, SQL 쿼리 등을 직접 실행해볼 수 있다.
▶ H2 데이터베이스를 사용한 실제 예시
Spring Boot 프로젝트에서 H2 데이터베이스를 사용하는 코드를 작성해 보았다. 아래는 간단한 사용자 관리 애플리케이션에서 H2 데이터베이스를 사용하는 예시이다. 이 예시에서는 Dto를 생략하고, set 메서드도 사용하지 않으며, get 메서드만 포함했다.
▷ User 엔티티 클래스
package com.sparta.testreview.user.entity;
import jakarta.persistence.*;
import lombok.Getter;
@Entity
@Getter
@Table(name = "users") // 테이블 이름을 users로 변경 (SQL 예약어이기 때문에 테이블 이름으로 바로 사용할 수 없다.)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// 기본 생성자
public User() {}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
// 사용자 정의 생성자 (필요 시 사용)
public User(String name, String email) {
this.name = name;
this.email = email;
}
}
▷ UserRepository 인터페이스
package com.sparta.testreview.user.repository;
import com.sparta.testreview.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
▷ UserService 클래스
package com.sparta.testreview.user.service;
import com.sparta.testreview.user.entity.User;
import com.sparta.testreview.user.repository.UserRepository;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User createUser(String name, String email) {
User user = new User(name, email); // Dto 대신 직접 값 전달
return userRepository.save(user);
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
}
▷ UserController 클래스
package com.sparta.testreview.user.controller;
import com.sparta.testreview.user.entity.User;
import com.sparta.testreview.user.service.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping
public ResponseEntity<User> createUser(@RequestParam String name, @RequestParam String email) {
User createdUser = userService.createUser(name, email);
return ResponseEntity.ok(createdUser);
}
@GetMapping
public ResponseEntity<List<User>> getAllUsers() {
List<User> users = userService.getAllUsers();
return ResponseEntity.ok(users);
}
}
▷ Spring Boot 애플리케이션 실행 클래스
package com.sparta.testreview;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class H2DatabaseExampleApplication {
public static void main(String[] args) {
SpringApplication.run(H2DatabaseExampleApplication.class, args);
}
}
▷ application.properties 설정 파일
# H2 데이터베이스 설정
# 메모리 상에 testdb라는 이름으로 H2 데이터베이스 생성
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# H2 웹 콘솔 활성화
spring.h2.console.enabled=true
# H2 웹 콘솔 접속 경로
spring.h2.console.path=/h2-console
# Hibernate 설정
spring.jpa.hibernate.ddl-auto=create
# 애플리케이션 포트 설정
server.port=8082
→ 이 코드를 통해 Spring Boot 애플리케이션에서 H2 데이터베이스를 사용해 사용자 데이터를 관리할 수 있다. 애플리케이션이 실행된 후, H2 웹 콘솔에 접속하여 http://localhost:8082/h2-console에서 데이터베이스 상태를 확인할 수 있다.
▶ H2 데이터베이스의 장점과 단점
▷장점:
→ 빠른 속도:
인메모리 모드를 사용하면 매우 빠른 데이터 접근 속도를 제공한다.
→ 경량성:
매우 가볍고, 설정이 간단하여 테스트와 개발에 적합하다.
→ 웹 콘솔 제공:
H2 웹 콘솔을 통해 SQL 쿼리를 직접 실행하고 데이터베이스 상태를 쉽게 확인할 수 있다.
→ 쉽게 설정 가능:
Spring Boot 프로젝트에서 손쉽게 설정하고 사용할 수 있다.
▷단점:
→ 데이터 휘발성:
인메모리 모드를 사용할 경우, 애플리케이션이 종료되면 데이터가 사라진다. 따라서 실제 운영 환경에서는 파일 모드를 사용하는 것이 좋다. (재실행하면 초기화된다.)
→ 대규모 데이터 처리 한계:
H2는 경량 데이터베이스이기 때문에, 대규모 데이터 처리나 복잡한 쿼리 처리에는 적합하지 않다.
▶결론
H2 데이터베이스는 경량이면서도 빠르고, 개발 및 테스트 환경에서 매우 유용하게 사용할 수 있는 데이터베이스이다. 특히 Spring Boot와의 호환성이 좋고, 설정이 간편하기 때문에 애플리케이션을 개발할 때 빠르게 DB 환경을 구성할 수 있다... 웹 콘솔 열리는걸 첨부해야되는데.. 절대 안 열리는중 ㅠㅠㅠ 계속해보고 성공하면 추가할 예정 .....!
'개발Article' 카테고리의 다른 글
[TIL]20240926 데이터 복제(Replication)&샤딩(Sharding) (1) | 2024.09.26 |
---|---|
[TIL]20240925 서버 사이드 렌더링(SSR)과 클라이언트 사이드 렌더링(CSR) 비교 (0) | 2024.09.25 |
[TIL]20240923 클린 코드(Clean Code)작성 원칙 (0) | 2024.09.23 |
[WIL]20240922 API Rate Limiting (3) | 2024.09.23 |
[TIL]20240921 SQL&NoSQL 데이터베이스 (0) | 2024.09.21 |