Grails에서 따로 추가적으로 설정하지 않으면 H2 DB가 embeded 모드로 실행이 되게 됩니다. embeded mode로 실행하게 되면 H2 DB와 함께 실행되는 웹어플리케이션의 접근속도는 빠르지만, 외부의 다른 어플리케이션 혹은 DB Client 어플리케이션에서 접근할 수가 없습니다.
동일한 DB를 여러 어플리케이션에서 공유해서 쓴다거나, DB Client 프로그램을 사용하려면 H2 DB를 embeded mode가 아닌 server mode로 실행을 해야 합니다. server mode는 H2 프로세스가 웹 어플리케이션과 분리되어, 여러어플리케이션에서 동일한 디비를 공유하여 사용할 수 있습니다.
설정방법
1. DataSource.groovy 의 dataSource 부분에 url을 선언합니다.
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:/db/file/path;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;"
//이하 설정 생략...
}
}
URL 부분을 위와 같이 설정합니다. 위의 설정에서 Server mode라고 해서 특별히 달라지거나 할것은 없습니다. 단지 위의 내용에서 /db/file/path 을 각 서버 환경의 디비 파일을 저장할 경로를 지정해 주면 끝납니다. 위의 URL만 설정을 하면 H2 DB는 embeded mode로 실행되기 때문에 추가적으로 설정해야 합니다.
2. grails-app/conf/spring/resources.groovy에 h2Server bean을 생성합니다.
import grails.util.Environment
import org.h2.tools.Server
// Place your Spring DSL code here
beans = {
//서버모드로 실행하기
if(Environment.current == Environment.PRODUCTION) {
h2Server(Server, "-tcp, -tcpAllowOthers, -tcpPort, 8043") { bean ->
bean.factoryMethod = "createTcpServer"
bean.initMethod = "start"
bean.destroyMethod = "stop"
}
}
}
위와 같이 h2Server 라는 이름을 가진 Spring bean을 생성해 주면됩니다. 여기서 눈여겨 봐야 할 부분은 -tcpPort 뒤의 숫자입니다. 해당 숫자는 실제 외부에서 접속할때 사용하는 TCP포트 번호가 됨으로 사용자에 따라 지정해 주면 됩니다.
저는 서버모드는 실제 서비스 환경에서만 필요함으로 Environment.current == Environment.PRODUCTION 이 로직을 추가해 주었습니다.
이렇게 설정하면 H2 DB는 Server Mode로 동작하게 됩니다.
해당 디비를 외부에서 접속하려면
jdbc:h2:tcp://h2ServerDomain:${resources.groovy에서 지정한 TCP 포트번호}/{DataSource.groovy에서 설정한 DB파일 경로}
로 지정하면 됩니다.