반응형

설명

  • H2는 자바로 구현된 오픈소스 데이터베이스
  • 인메모리와 파일 기반의 데이터베이스 설정이 가능하다.
  • 별도의 설치 과정 없이 임베디드로 바로 사용할 수 있다.

Dependency 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

DB 스크립트 추가

  • 서버 구동시 스키마 생성, 데이터 추가를 위해 필요
  • ~/src/main/resources/schema.sql
    DROP TABLE IF EXISTS User;
    
    CREATE TABLE User (
        userSeq  BIGINT UNSIGNED AUTO_INCREMENT,
        userName VARCHAR(100),
        regDate  DATETIME,
        PRIMARY KEY (userSeq)
    );
    
  • ~/src/main/resources/data.sql
    INSERT INTO User (userName, regDate) VALUES ('john', NOW());
    INSERT INTO User (userName, regDate) VALUES ('tom', CURRENT_DATE());
    INSERT INTO User (userName, regDate) VALUES ('jane', TIMESTAMPADD(DAY, -7, CURRENT_DATE()));
    INSERT INTO User (userName, regDate) VALUES ('thompson', PARSEDATETIME(TO_CHAR(TIMESTAMPADD(DAY, -7, NOW()), 'yyyy-MM-dd'), 'yyyy-MM-dd'));
    

application.properties

# File 모드
# spring.datasource.url=jdbc:h2:file:~/testdb;MODE=MySQL;

# In-Memory 모드
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL;

# 공통 설정
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.platform=h2
spring.datasource.username=sa
spring.datasource.password=

# http://localhost:8080/h2-console로 접속하여 쿼리를 수행해볼 수 있음
spring.h2.console.path=/h2-console
spring.h2.console.enabled=true

TCP 모드 설정

  • 외부 클라이언트로 접속 가능하도록 설정
  • 외부 클라이언트 접속이 불필요하면 해당 단계를 건너뛸 수 있다.
H2ServerConfig
@Configuration
public class H2ServerConfig {
    @Bean(initMethod = "start", destroyMethod = "stop")
    public Server H2DatabaseServer() throws SQLException {
        // 클라이언트에서 jdbc:h2:tcp://localhost:9092/mem:testdb 경로로 접속 가능
        return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092");
    }
}

테스트

@SpringBootTest
public class H2Test {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void testSelect() {
        List<User> users = jdbcTemplate.query("SELECT userSeq, userName, regDate From User", (rs, rowNum) -> new User(
            rs.getLong("userSeq"),
            rs.getString("userName"),
            rs.getTimestamp("regDate").toLocalDateTime()
        ));

        assertEquals(4, users.size());
        assertEquals("john", users.get(0).userName);
        assertEquals("tom", users.get(1).userName);
        assertEquals("jane", users.get(2).userName);
        assertEquals("thompson", users.get(3).userName);
    }

    @AllArgsConstructor
    @Data
    private static class User {
        private long userSeq;
        private String userName;
        private LocalDateTime regDate;
    }
}

참고

반응형

'Development > Spring' 카테고리의 다른 글

[Spring] Testcontainers  (0) 2021.04.15
[Spring] Server Sent Event(SSE)  (0) 2021.03.30
[Spring] Spring Cloud Feign  (0) 2020.12.27
[Spring] Spring Cloud Gateway  (0) 2020.12.27
[Spring] Spring Cloud Hystrix  (0) 2020.12.27

+ Recent posts