H2 DB Troubleshoot

최근에 T 아카데미의 JPA 프로그래밍 기초 특강 영상을 보게 됐습니다. Spring을 공부하면서 함께 종종 듣는 키워드인데, 마침 특강 영상이 올라와서 공부해보게 됐습니다.

강의해주신 김영한님이 입담도 좋으시고 굉장히 이해하기 쉽게 설명해주셔서 강의 내내 재밌게 들었습니다.

실습에서는 로컬에서 테스트용으로 사용하기 편리한 H2 데이터베이스 사용법과, 사용하면서 겪은 몇 가지 이슈를 정리해봅니다.

설치&실행

H2는 설치와 실행이 간편하기 때문에 로컬에서 간편하게 테스트하기 좋은 RDBMS입니다.

H2 홈페이지에서 다운로드 할 수 있습니다.

윈도우를 포함한 모든 플랫폼에서 사용 가능한 .zip 파일과, 윈도우에 설치해서 서비스 형태로 구동되는 .msi파일이 있는데, 굳이 설치까지 하는 건 싫어서 .zip파일로 받았습니다.

.zip 파일의 압축을 푼 뒤, bin 디렉터리에서 윈도우는 h2.bat, 맥이나 리눅스 계열은 h2.sh 파일을 실행하면 DBMS가 실행됩니다.

저는 실습을 윈도우에서 진행했기 때문에 이후의 내용은 윈도우10 기준입니다.

데이터베이스 생성

h2.bat으로 DBMS가 실행되면 브라우저에서 http://localhost:8082에 접속합니다. DBMS 실행 후 자동으로 페이지가 뜨기도 합니다.

실습에서는 DB 연결 페이지에서 설정 변경 없이(= 사용자명 sa 비밀번호 없음) 접속하면 연결이 됐는데, 아래와 같은 메시지가 뜨면서 접속이 안됐습니다.

Database "<DB_FILE_PATH>" not found, and IFEXISTS=true, so we cant auto-create it [90146-199] 90146/90146 (도움말)

실습에서는 DB가 자동으로 생성되면서 연결이 됐는데 왜 안될까 한참을 찾다가, 작업표시줄의 트레이 아이콘에 H2 Database Engine 아이콘이 있는 걸 발견했습니다.

우클릭을 하고 Create a new database..를 선택하면 데이터베이스를 생성하는 창이 나옵니다.

접속 정보만 입력하면 DB가 생성됩니다. 생성될 줄 알았습니다.

기본 비밀번호

제가 실습을 진행하는 시점에 초기 비밀번호는 공백 한 칸(스페이스바 한 번)입니다.

강의에서는 초기 비밀번호가 없었습니다. 사용자만 sa로 접속하면 바로 접속이 됐는데, 비밀번호를 입력하라니..

얻어걸려서 비밀번호를 찾았습니다.

공백 한 칸을 넣고 Create 버튼을 누르면 DB가 생성됩니다.

다시 DB 접속 페이지로 돌아와서, 앞서 DB 생성에 입력한 경로와 접속 정보를 입력하면 접속이 됩니다.

DB 경로는 다음과 같이 입력하면 됩니다.

상대 경로의 기준은 h2.bat 파일이 위치한 bin 디렉터리입니다.

사용자 홈 디렉터리(~)를 기준으로 사용해도 됩니다.

// Database path를 ./test 라고 했을 때
jdbc:h2:tcp://localhost/./test

검색 중에 DB 경로에 tcp 대신 file을 사용하는 답변들이 있었는데, file을 사용해서 연결한 경우 DB 파일에 락이 걸려서 JPA 애플리케이션 실행 시 이와 관련한 예외가 발생했습니다.

참고로, 비밀번호 변경은 다음 쿼리를 통해 할 수 있습니다. 문서

// 비밀번호를 'rainbow'로 변경할때
ALTER USER SA SET PASSWORD 'rainbow';

주의할 점은 사용자명은 대문자여야 한다는 것과 비밀번호는 홀따옴표로 감싸야 한다는 것입니다.

세션 시간 변경

DB 접속 페이지는 기본값으로 지정된 세션 유지 시간이 30분입니다.

30분마다 다시 로그인을 해야 한다는 것인데, 실습과 같이 하다보면 생각보다 30분은 짧은 시간이기 때문에 매번 다시 로그인 하는 과정이 번거로울 수도 있습니다.

어차피 로컬에서 사용할 거니까 굳이 보안에 신경 쓸 필요도 없으니 세션 시간을 좀 더 늘려보기로 했습니다.

세션 시간과 관련된 인자는 문서에서 확인할 수 있습니다.

h2.bat 파일을 다음과 같이 수정합니다.

@java -cp "h2-1.4.198.jar;%H2DRIVERS%;%CLASSPATH%" -Dh2.consoleTimeout=7200000 org.h2.tools.Console %*
@if errorlevel 1 pause

H2 실행 시 h2.consoleTimeout 값을 인자로 넘기는데, 세션 유지시간을 초 단위로 나타내는 값입니다. 위에서 지정한 7200000초는 2시간입니다.

목록으로