読者です 読者をやめる 読者になる 読者になる

mongeezを使ってSpring boot + MongoDB 環境でDBマイグレーション環境を作る

mongodb spring-boot mongeez

Spring-bootでmongodbを使うアプリケーションを時間を見つけて作ったりしているのですが、いわゆるflywayのようにmongodbでもDBマイグレーションが出来るようにしたかった。

mongeez is 何?

mongeezは、mongodb用のマイグレーションツールです。DBの状態にもバージョンを持たせて、ソースコードと一緒に管理することができます。

いつものことですが、こういった類のものは日本語記事がほとんどない。Google翻訳さまさまやでぇ

Spring bootにmongeezを使う。

最初はflywayでmongodbのマイグレーションが出来ないかなぁって探していたのですが、たまたまmongeezというgithubのページを見つけました。

そこで僕は思ったのですね。「Springのことだ、きっと、mongeez-starterみたいな依存関係が容易されているに違いない!」と浅はかな期待を胸に検索してみた結果。

hzpz/mongeez-spring-boot-starter

うふふ、あった。予想通り。

なので、まずはこのページのREADMEに則り、依存関係を追加します。githubのほうではmevenで書かれていますが、gradleではこんな感じ。

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-aop")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile("org.springframework.boot:spring-boot-starter-data-mongodb")
    compile("org.springframework.boot:spring-boot-starter-security")

    // mongeez
    compile("io.github.hzpz.spring.boot:mongeez-spring-boot-starter:1.0.0") // 追加
    compile("org.mongeez:mongeez:0.9.4") // 追加

    testCompile("org.spockframework:spock-spring:1.0-groovy-2.4")
}

次にdb/mongeez.xmlを作りなさいと書いてあったので作ります。

mongeez.xmlには、マイグレーションで利用するxmlファイルもしくは、jsファイルを指定します。折角だから、jsでやってみることにしました。

<changeFiles>
    <file path="v1_1__initial_data.js"/>
</changeFiles>

ちなみにmongeezのおき場所はresources/db/mongeez.xml になります。

mongeezと同じディレクトリにchangeFilesで指定したファイル名でjsファイルを置きます、
jsファイルの中身については、mongodbへのインサート文を書いておきます。

//mongeez formatted javascript
//changeset system:v1_1
db.user.insert({
  "_id":        ObjectId("55c358aa71e7030eec88de0f"),
  "_class":     "jp.co.tads.room.domain.model.User",
  "userName" :  "admin",
  "email" :     "admin",
  "password" :  "$2a$10$8r2ZqDyovFQZiu5qqaTWHeLwo1RJlA2sGMLJJbFV9pCIcjPAOOCSC"
});

はい、あとはapllication.ymlに書いた接続先が利用されてマイグレーションが実行されます。

15:22:55: Executing external task 'bootRun'...
:compileJava
:compileGroovy UP-TO-DATE
:processResources
:classes
:findMainClass
:bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.2.5.RELEASE)

(中略)

initialization completed in 3458 ms
2015-08-07 15:23:18.144  INFO 4912 --- [ost-startStop-1] org.mongeez.reader.FilesetXMLReader      : Num of changefiles 1
2015-08-07 15:23:18.397  INFO 4912 --- [ost-startStop-1] org.mongeez.ChangeSetExecutor            : ChangeSet v1_1 has been executed
2015-08-07 15:23:19.840  INFO 4912 --- [ost-startStop-1] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/mappings],methods=[GET]}" 

簡単!こういった周辺ツールが充実しているのもSpringのいいところですね!!