냐냐한 IT/냐냐한 Spring Boot

Spring Boot에 H2 추가

소소하냐 2019. 9. 16. 20:46

Spring Boot + MyBatis 프로젝트 연습 목록 

- 01. 신규 Spring Boot 프로젝트 만들기

- 02. Thymeleaf, spring-boot-devtools 추가

- 03. Spring Boot에 H2 추가 (현재 포스트)

 


이번 포스팅에서는 앞서 만든 프로젝트에 H2 Database 설정을 추가합니다. 연습 프로젝트이므로 MySQl과 같은 DBMS를 사용하지 않고 간단한 테스트용으로 내장 Database로 H2를 선택하였습니다. 

 

H2 의존성 추가 

1. pom.xml에 아래 내용 추가

	<dependencies>
		... 기존 내용 생략 ...
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</dependency>
	</dependencies>
  • 참고 : 프로젝트 생성 시에 의존성 선택 화면에서 H2 Database 선택하면 자동으로 추가된다.

 

2. 브라우저에서 H2 Database 콘솔 접근 

    : 로컬 서버 시작 후 http://localhost:8080/h2-console 접속 

h2 콘솔 페이지 화면

  • 참고 : 기본 접속 URL은 /h2-console. 접속 URL을 변경하려면 spring.h2.console.path 속성을 변경
  • 참고 : H2 웹 콘솔은 아래와 같은 조건을 만족할 경우 자동으로 구성된다.
    • 서블릿 기반 웹 애플리케이션 개발
    • classpath에 com.h2database:h2가 있어야 한다.
    • Spring Boot develper tools를 사용해야 한다.
      (develper tools을 사용하지 않는다면 spring.h2.console.enabled=true 속성을 추가하여 사용 가능 )

3. H2 Database 콘솔에서 JDBC URL로 [Connect]

    : JDBC URL에 원하는 이름(예:jdbc:h2:~/leveldiary) 넣고 [Connect] 버튼 클릭 (JDBC URL 기본값 : jdbc:h2:mem:testdb ) 

  • 기본값이 아닌 원하는 이름으로 설정할 경우 application.properties에 해당 설정을 작성해야 한다.
spring.datasource.url=jdbc:h2:~/leveldiary
spring.datasource.username=sa
spring.datasource.password=

 

  • 필자의 경우 H2 웹 콘솔 연결 시 오류 발생 : "Database "mem:testdb" not found, and IFEXISTS=true, so we cant auto-create it [90146-199] 90146/90146 (Help)"
    • 기본값인 jdbc:h2:mem:testdb에도 오류가 발생
    • 원하는 이름인 jdbc:h2:~/leveldiary에도 오류가 발생
    • 오류 문구에 나오는 IFEXISTS=true를 추가하여도(jdbc:h2:mem:testdb;IFEXISTS=TRUE) 동일한 오류 또는 duplicate IFEXISTS 오류가 발생
    • 오류 원인 : 최근 버전의 경우 보안상의 이유로 웹 콘솔에서 새 데이터베이스를 작성할 수 없다 함. (필자에게 설치된 버전은 h2-1.4.199) 이러한 이유로 h2를 별도로 설치 후 dababase를 직접 생성한 후에 작업하기로 결정 (관련 내용 보기- [새창])
      • Mac에서 H2 설치 및 사용
        1. 명령어 : $ brew install h2 
          (참고 : Install h2 on Mac OSX [새창])
        2. 사용 명령어 : $ h2 -web
        3. 콘솔 연결 : http://localhost:8082/ 
        4. 접속한 h2 콘솔에서 JDBC URL에 원하는 이름(예:jdbc:h2:~/leveldiary)으로 접속하면 해당 이름으로 데이터베이스가 생성됨
        5. 연결 끊기
          (연결 끊지 않고 http://localhost:8080/h2-console 연결하면 Database may be already in use: null. Possible solutions: close all other connection(s); use the server mode [90020-199] 90020/90020 오류가 발생)
        6. http://localhost:8080/h2-console에 접속하여 앞서 설정했던 JDBC URL(예:jdbc:h2:~/leveldiary)로 연결

4. H2 데이터베이스에 테이블 생성 및 데이터 입력

    4-1. /src/main/resourcesschema.sql 파일 추가 및 아래 내용 입력 (참고 : Spring Boot Reference - Initialize a Database 보기 [새창])

DROP TABLE IF EXISTS testtbl;
 
CREATE TABLE testtbl (
  id INT AUTO_INCREMENT  PRIMARY KEY,
  name VARCHAR(250) NOT NULL
);
 
INSERT INTO testtbl (name) VALUES
  ('name1'),
  ('name2'),
  ('name3');

    4-2. 서버 재시작

    4-3. http://localhost:8080/h2-console 접속하여 확인하면 해당 테이블(testtbl)이 생성된 것을 확인 가능

  • 하지만 필자의 경우 해당 테이블이 생성되지 않았다. 이유는 spring.datasource.url을 인식하지 못해서 생긴 문제 
  • 해결 방법 : pom.xmlspring-boot-starter-jdbc 내용 추가 후 서버 재시작 및 확인하면 테이블이 생성된 것을 확인할 수 있다(jdbc가 아닌 jpa를 사용할 경우에는 jpa 의존성 추가)
	<dependencies>
		... 기존 내용 생략 ...
        <!-- 앞서 추가했던 h2 -->
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</dependency>	
    
        <!-- 이 부분 추가 --> 
		<dependency>
		  <groupId>org.springframework.boot</groupId>
		  <artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>	
	</dependencies>
  • 위 내용 추가 후 다시 확인하면 해당 테이블(testtbl)이 생성된 것을 확인 가능

 

참고 : jdbc:h2:mem:데이터베이스이름 과 jdbc:h2:~/데이터베이스이름 차이

  • jdbc:h2:mem:데이터베이스이름 : 데이터가 유지되지 않는 메모리 내 모드(In-memory)
  • jdbc:h2:~/데이터베이스이름 : 로컬 데이터베이스에 연결하기 위한 URL (Embedded(local) connection)
    --> 생성된 데이터베이스는 홈 디렉터리에서 '데이터베이스이름.mv.db' 형태로 확인이 가능
  • 자세한 내용은 H2 홈페이지의 Database URL Overview 내용 확인 [새창]

지금까지의 내용은 github에 branch:003-add-h2[새창]로 확인하실 수 있습니다

 

참고 사이트 : Baeldung - Spring Boot With H2 Database [새창]

 


Spring Boot + MyBatis 프로젝트 연습 목록 

- 01. 신규 Spring Boot 프로젝트 만들기

- 02. Thymeleaf, spring-boot-devtools 추가

- 03. Spring Boot에 H2 추가 (현재 포스트)