티스토리 뷰
이전에 springboot와 hsqldb를 연동해서 간단히 프로토타입을 만들기 위한 준비를 했었다.
Springboot + embedded hsqldb 로 간단히 샘플 프로젝트 만들기
springboot는 이게 정말 왜 되지? 할 정도로 내장되어 있는 편리한 기능들이 많이 있다. 이번에 소개할 내용도 그렇다. 내부 로직을 까보지 않아서 정확한 동작원리는 파악하지 못했지만 그래도 급
oingdaddy.tistory.com
이와 거의 유사한 embedded db가 있는데 이번에 소개할 embedded db는 바로 h2 database이다. 설정하는 방법이나 사용하는 방법 모두 hsqldb와 유사하다. 간단하게 프로토타이핑을 할 수 있도록 DB 구성을 하는 것이라고 보면 된다.
사용법
pom.xml
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
pom.xml 에는 h2database dependency를 추가해준다.
application.yml (or application.properties)
spring:
datasource:
url: jdbc:h2:~/test
driverClassName: org.h2.Driver
username: sa
password:
initialization-mode: always
schema: classpath:h2/schema.sql
data: classpath:h2/data.sql
h2:
console:
enabled: true
path: /h2-console
application.yml에는 h2 database 연결을 위한 datasource 설정을 한다. 위의 설정을 가감없이 그대로 사용하면 된다.
위처럼 initailization-mode를 always로 설정하면 재기동 될때마다 schema, data로 지정해 놓은 내용들로 초기화를 진행한다.
schema.sql
DROP TABLE IF EXISTS user;
CREATE TABLE user(
id INT PRIMARY KEY,
email VARCHAR(30),
name VARCHAR(30),
tel VARCHAR(30)
);
DROP TABLE IF EXISTS product;
CREATE TABLE product (
no VARCHAR(5),
name VARCHAR(50)
);
data.sql
INSERT INTO `user` (`id`, `email`, `name`, `tel`) VALUES
(1, 'kim@naver.com', 'Kim', '010-0000-0001'),
(2, 'janny@naver.com', 'Janny', '010-0000-0002'),
(3, 'billie@naver.com', 'Billie Eilish', '010-0000-0003'),
(4, 'taylor@naver.com', 'Taylor Swift', '010-0000-0004'),
(5, 'jack@naver.com', 'Jack', '010-0000-0005'),
(6, 'hong@hanmail.net', '홍길동', '010-0000-0006'),
(7, 'kang@naver.com', '강감찬', '010-0000-1111');
INSERT INTO `product` (`no`, `name`) VALUES
('10001', 'TV'),
('10002', 'Notebook'),
('10003', 'Phone'),
('10004', 'Monitor'),
('10005', 'Washer'),
('10006', 'Car'),
('10007', 'Table'),
('10008', 'Beer'),
('10009', 'Bike'),
('10010', 'Boat');
schema 부분은 DDL을 data 부분에는 DML을 정의하면 된다.
Spring과 연동하여 사용을 할때는 다른 DB와 연결하는 것과 동일하다. 일반적인 Spring과 MyBatis에서 사용하는 예를 들면 다음과 같다.
Controller
@Slf4j
@RequestMapping("/user")
@Controller
public class UserController {
private UserService userService;
@GetMapping("/all")
public ResultBean<UserVo> getUsers() {
...중략...
List<UserVo> users = userService.getUsers();
...후략...
}
}
Service
@Slf4j
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<UserVo> getUsers() {
return userMapper.findByAll();
}
}
Mapper
public interface UserMapper {
public List<UserVo> findByAll();
}
Mapper sql
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sample.oingdaddy.dbmapper.UserMapper">
<select id="findByAll" resultType="sample.oingdaddy.vo.UserVo" fetchSize="1000">
SELECT id
, name
, email
, tel
FROM `user`
</select>
이렇게 한셋을 구성했으면 구성된 app을 기동시켜보자.
기동로그에 H2 console available at '/h2-console'. Database available at 'jdbc:h2:~/test' 부분이 나오는것을 볼 수 있다. 정상 기동이 되었고 H2 console을 사용할 수 있다고 한다.
일단 기동이 되었으니 결과가 잘 나오는지 실행을 해본다.
{"header":{"resultCode":"001","resultMessage":"Success"},"data":[{"id":1,"name":"Kim","email":"kim@naver.com","tel":"010-0000-0001"},{"id":2,"name":"Janny","email":"janny@naver.com","tel":"010-0000-0002"},{"id":3,"name":"Billie Eilish","email":"billie@naver.com","tel":"010-0000-0003"},{"id":4,"name":"Taylor Swift","email":"taylor@naver.com","tel":"010-0000-0004"},{"id":5,"name":"Jack","email":"jack@naver.com","tel":"010-0000-0005"},{"id":6,"name":"홍길동","email":"hong@hanmail.net","tel":"010-0000-0006"},{"id":7,"name":"강감찬","email":"kang@naver.com","tel":"010-0000-1111"}]}
정상적으로 h2 database에 넣었던 값이 출력되는것을 확인할 수 있다.
이렇게 직접 짜놓은 코드로 확인을 할 수도 있지만 H2 console 이라는것을 통해서도 확인할 수 있다.
방금 기동한 서버의 port가 8080이라면 다음 경로로 접속을 해보자.
localhost:8080/h2-console
위 경로로 접속을 하면 다음과 같은 화면이 나와야 한다.
PL/SQL Developer 와 비슷한 H2 database의 DB 접속 툴이 아주 경량화된 모습으로 사용할 수 있다. Connect를 눌러서 접속을 해보자.
그러면 위와 같이 SQL Developer가 나타난다. 생각보다 괜찮다. 좌측에 만든 테이블의 정보를 확인할 수도 있고 SQL statement를 입력하여 직접 컨트롤 할수도 있다.
select * from user 라는 쿼리를 Run 해보면 위와 같은 모습으로 결과값이 출력되는것을 확인할 수 있다. Run을 눌러도 되고 Ctrl + Enter 키를 눌러서도 실행이 가능하다. 별도의 플러그인이나 소프트웨어의 설치 없이 웹에서 아주 간편하게 이용이 가능하다.
끝!
'Framework > Spring' 카테고리의 다른 글
spring-boot-starter, parent 로 dependency 관리하기 (0) | 2021.02.10 |
---|---|
Spring Validation Message properties 파일을 통해 관리하기 (2) | 2021.02.09 |
Springboot 에서 @ComponentScan 설정 및 사용법 (2) | 2021.01.14 |
Springboot + Redis 연동하는 초간단 샘플 만들어보기 (3) | 2021.01.05 |
Spring properties 사용시 UnsatisfiedDependencyException: Could not resolve placeholder 오류 조치 (0) | 2020.12.29 |