Database
H2 Rule
h2 사용시 지켜야 할 rule 이 있다.
- column은 모두 소문자로 한다.
- column 이름은 db keyword 가 아닌 것으로 한다.
- insert sql 작성시 id가 auto increment 이더라도 명시적으로 적어준다.
- .sql 파일에서 inline comment 는 모두 -- (hyphen 2개)으로 시작해준다.
- FILE_READ 함수의 인자로는 파일의 절대경로를 넣는다.
- classpath 나 url 도 적을 수 있지만, 현재 시점으로는 issue 가 해결되지 않은 듯 싶다.
- github issue : https://github.com/h2database/h2database/issues/446
- h2 document : http://www.h2database.com/html/functions.html#file_read
- classpath 나 url 도 적을 수 있지만, 현재 시점으로는 issue 가 해결되지 않은 듯 싶다.
- Options on URL (MODE 로 DBMS 결정)
jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=false;MODE=MYSQL
H2 Web Console
기본적으로는 /h2-console
연결시 웹 콘솔이 열리지만, security 와 함께 사용시 invalid 한 csrf token, Http header parsing 문제, IOException 등의 문제가 있어, 따로 h2 server 를 구성한다.
아래 Configuration 설정시, spring boot 구동시 한번 자동으로 default browser를 실행해 http://localhost:8082
를 열게 된다.
조건
runtime('com.h2database:h2')
이 아닌,
compile('com.h2database:h2')
로 dependency 를 설정한다.
package software.mama.furniture.config.development;
import org.h2.tools.Server;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import software.mama.furniture.config.sub.Profiles;
import javax.sql.DataSource;
import java.sql.SQLException;
@Configuration
@Profile(Profiles.DEVELOPMENT)
public class DevConfig {
/**
* runtime('com.h2database:h2') 이 아닌,
* compile('com.h2database:h2') 로 dependency 를 설정한다.
*/
@Bean
org.h2.tools.Server h2Server() {
/**
* default로 8082 포트에서 실행된다.
* 예) browser 를 통해 http://localhost:8082 에 접근한다.
*/
Server server = new Server();
try {
/**
* server.runTool("-web"); 에 대한 설명
*
* : browser에서 spring boot 구동시 한번만 자동으로 열리도록 한다.
* 이 설정을 명시하지 않으면 devtool 이 reload 할 때마다 browser 에서 다시 열린다.
* 그러나 이 설정을 명시하면 devtool로 reload시, connection이 종료된다.
* 이 경우. http://localhost:8082/login.jsp 로 다시 접속하면 된다.
*/
server.runTool("-web");
server.runTool("-tcp");
server.runTool("-tcpAllowOthers");
} catch (Exception e) {
e.printStackTrace();
}
return server;
}
// @Bean
// public Server h2TcpServer() throws SQLException {
// Server h2Server = Server.createTcpServer().start();
// if (h2Server.isRunning(true)) {
// System.out.println("H2 server was started and is running.");
// return h2Server;
// } else {
// throw new RuntimeException("Could not start H2 server.");
// }
// }
}