H2DB 사용 방법 및 필수적으로 알아야 할 것들

로컬에서 간단한 기능을 테스트하려는데, DB 설정부터 하려니 벌써 지치시나요? 잠시 무거운 MySQL, Oracle은 잊으세요. 오늘은 당신의 개발 속도를 날개 돋친 듯 빠르게 만들어 줄 경량 데이터베이스, H2DB에 대해 이야기해 보려 합니다. 이 글에서는 가장 핵심적인 H2DB 사용 방법과 함께, 실무에서 반드시 알아야 할 명확한 한계점까지 빠짐없이 다룰 것입니다.

H2DB 사용 방법 및 필수적으로 알아야 할 것들 썸네일 이미지

H2DB 사용 방법을 알아보기 전 알아두면 좋을 내용

H2 데이터베이스를 처음 접할 때 가장 먼저 알아야 할 두 가지 모드가 있습니다. 바로 ‘인메모리(In-memory)’ 모드와 ‘파일(File)’ 모드입니다. 이 둘의 차이를 아는 것이 H2 활용의 첫걸음입니다.

인메모리 모드 vs 파일 모드(휘발성 vs영구성)

  • 인메모리 모드 (In-memory Mode)
    데이터를 RAM에 저장하기 때문에 매우 빠릅니다. 하지만 전원을 끄거나 애플리케이션을 종료하면 모든 내용이 깨끗하게 사라지죠. 데이터가 유지될 필요 없는 순수한 단위 테스트에 안성맞춤입니다.
  • 파일 모드 (File Mode)
    데이터를 하드디스크에 저장하기 때문에 애플리케이션을 껐다 켜도 기록한 내용이 그대로 남아있습니다. 속도는 인메모리 모드보다 약간 느릴 수 있지만, 개발 과정에서 데이터를 유지하며 확인해야 할 때 유용하게 사용됩니다.

모드 전환, 단 한 줄이면 OK

SpringBoot 환경이라면 application.yml 파일에서 단 한 줄의 URL 설정만으로 두 모드를 자유롭게 오갈 수 있습니다.

1. 인메모리 모드 설정
RAM에서만 동작하며, mem 키워드를 사용합니다. testdb는 원하는 DB 이름으로 자유롭게 변경 가능합니다.

spring:
  datasource:
    url: jdbc:h2:mem:testdb # 'mem'이 핵심!
    driver-class-name: org.h2.Driver
    username: sa
    password:

2. 파일 모드 설정
내 컴퓨터의 특정 경로에 DB 파일을 생성합니다. ~/는 사용자 홈 디렉토리를 의미하며, testdb라는 이름의 파일이 생성됩니다.

spring:
  datasource:
    url: jdbc:h2:~/testdb # 파일 경로를 지정
    driver-class-name: org.h2.Driver
    username: sa
    password:

🚨 잠깐! 파일 모드 에러 발생 시
파일 모드로 처음 실행할 때 간혹 파일 생성 권한 등의 문제로 에러가 발생할 수 있습니다. 이 경우, 해당 경로에 testdb.mv.db 파일을 직접 생성해 주면 간단히 해결될 수 있습니다.

H2 콘솔: 데이터를 웹에서 직접 확인

H2는 웹 브라우저를 통해 데이터베이스를 직접 들여다볼 수 있는 편리한 콘솔을 제공합니다. application.yml 파일에 아래 설정을 추가하면 http://localhost:8080/h2-console과 같은 주소로 접속할 수 있습니다.

spring:
  h2:
    console:
      enabled: true
      path: /h2-console # 콘솔에 접속할 URL 경로

콘솔에 접속하면 JDBC URL을 입력하는 칸이 나옵니다. application.yml에 설정한 URL을 그대로 입력하고 연결하면, 테이블과 데이터를 직접 조회하고 쿼리를 실행해 볼 수 있습니다.

⚠️ 파일 모드 사용 시 주의 사항
파일 모드에서는 H2 콘솔이 DB 파일에 연결하고 있는 상태에서 애플리케이션이 데이터 변경을 시도하면 파일 잠금(lock) 문제로 에러가 발생할 수 있습니다. 이를 방지하려면 TCP 서버 모드로 실행하는 것이 좋습니다.
https://www.h2database.com/ 에서 H2DB 엔진을 다운로드 받아 실행 후 URL을 jdbc:h2:tcp://localhost/~/testdb와 같이 변경하면 H2 콘솔과 애플리케이션이 동시에 접속할 수 있습니다.

H2DB 테스트는 완벽한 테스트가 아니다?

“H2로 테스트했으니 운영 DB에서도 문제없겠지?”라고 생각한다면 큰 오산입니다. H2는 만능이 아니며, 명확한 한계점을 가집니다.

  • 문법 차이와 기능 부재: H2는 MySQL이나 Oracle과 문법이 미묘하게 다르고, 특정 함수나 시퀀스 같은 기능들을 지원하지 않는 경우가 많습니다. 특히, 복잡한 쿼리가 핵심이거나 스토어드 프로시저(Stored Procedure)를 많이 사용하는 프로젝트라면 H2는 거의 무용지물입니다. 운영 DB에만 존재하는 함수나 문법, 프로시저를 H2 환경에서는 테스트할 수 없기 때문입니다.
  • 데이터 의존성 문제: 또한, 테스트를 위해 기존 데이터가 필수적이거나 데이터 간의 연관 관계가 매우 중요한 경우에도 H2 활용은 어렵습니다. H2는 보통 테스트마다 데이터가 초기화되는 ‘깨끗한 상태’에서 시작합니다. 회원, 게시글, 댓글, 좋아요 등 수많은 연관 관계를 가진 복잡한 데이터를 매번 테스트 전에 세팅(setup)하는 것은 쉽지 않은 일입니다. 기초 데이터를 서버 실행 시마다 insert 되게 해놓으면 괜찮을 수도 있습니다.

결론적으로 H2는 기본적인 단위 테스트나 개발 초기 단계의 프로토타이핑에 적합하며, 최종적으로는 실제 운영 환경과 동일한 DB에서 통합 테스트를 반드시 거쳐야 합니다.

그럼에도 H2를 쓰는 이유: 압도적인 편의성과 속도

이런 명확한 한계에도 불구하고 왜 수많은 개발자들이 H2를 애용할까요? 답은 압도적인 편의성과 속도에 있습니다.

  • 설치가 필요 없다: 의존성 추가만으로 즉시 사용 가능합니다.
  • 빠른 실행 속도: 메모리 기반으로 동작하여 테스트가 매우 빠릅니다.
  • 독립적인 환경: 각 개발자가 자신만의 DB 환경을 가질 수 있어 테스트 데이터 충돌을 막아줍니다.

마지막으로, H2를 운영 환경에서 쓰지 않는 이유

결론부터 말하면, 안정성과 데이터 무결성, 성능 때문입니다. H2는 대용량 데이터 처리나 동시 접속자 수가 많은 실제 서비스 환경을 고려하여 설계되지 않았습니다. 중요한 고객 데이터를 다루는 운영 환경에서는 데이터 손실 방지, 백업 및 복구, 정교한 튜닝 기능 등을 제공하는 MySQL, Oracle, PostgreSQL 같은 검증된 RDBMS를 사용하는 것이 바람직합니다.

이 글에서는 제가 꼭 필요하다고 생각하는 부분만 간추려봤습니다. 보다 자세한 내용은 H2DB 공식 사이트에서 확인하시기 바랍니다.

자주 묻는 질문 (FAQ)

H2DB를 운영 환경에서 절대 사용하면 안 되나요?

사용자가 거의 없고 데이터가 중요하지 않은 아주 작은 개인 프로젝트나 내부용 툴이라면 사용을 고려해 볼 수는 있지만, 일반적인 서비스에서는 안정성, 데이터 무결성, 성능 문제로 절대 권장하지 않습니다.

H2DB와 SQLite의 차이점은 무엇인가요?

둘 다 경량 임베디드 DB지만, H2는 순수 자바로 작성되어 JVM 환경과 통합이 매우 용이하고 인메모리 기능을 강력하게 지원하는 반면, SQLite는 C언어로 작성되어 다양한 플랫폼에서 널리 사용되는 파일 기반 데이터베이스입니다. 스프링 생태계에서는 H2가 더 흔하게 사용됩니다.

H2 콘솔 접속 시 JDBC URL을 잊어버렸다면 어떻게 하나요?

스프링 부트 애플리케이션을 실행할 때 콘솔 로그를 잘 살펴보세요. H2 console available at ‘/h2-console’. Database available at ‘jdbc:h2:mem:…’ 와 같은 로그가 출력되며, 여기에 접속해야 할 정확한 URL이 나와 있습니다.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다