Database

H2 Rule

h2 사용시 지켜야 할 rule 이 있다.

  • column은 모두 소문자로 한다.
  • column 이름은 db keyword 가 아닌 것으로 한다.
  • insert sql 작성시 id가 auto increment 이더라도 명시적으로 적어준다.
  • .sql 파일에서 inline comment 는 모두 -- (hyphen 2개)으로 시작해준다.
  • FILE_READ 함수의 인자로는 파일의 절대경로를 넣는다.
  • 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.");
//        }
//    }

}

results matching ""

    No results matching ""