Spring Boot お勉強 その3 ~H2DBの永続化~

前回、Spring BootからSpring Data JPAを経由してH2データベースを利用しました。
ただ、前回の内容だとDBがインメモリなので、アプリを停止すると消えてしまい、本来の意味での永続化ができていません。
そこで今回は、このDBをファイルとして保存するように設定してみます。


Spring Bootで自動的に適用される設定値をアプリ側から変更する方法の一つとして、プロパティファイルがあります。
クラスパス(src/main/resources)にapplication.propertiesファイルを作成します。
このファイル名がデフォルトのため、このファイル名で作成するだけで、その中に書いた設定値が適用されます。
ファイル内に以下のように記載します。

spring.datasource.url=jdbc:h2:~/workspace/project/db/db;MODE=PostgreSQL

要するにJDBCの接続文字列を指定しています。


ちなみに、例示した接続文字列の内容を説明すると次の通りです。
jdbc:→JDBC接続する
h2:→H2データベースを利用する
~/workspace/project/db/db→このファイルパスにデータベースファイルを作成する
(~はユーザのホームディレクトリ)
;MODE=PostgreSQL→H2の動作モード
(アプリを最終的にリリースするときに何のDBを使うつもりかによって指定しておくといいかも)


なお、ほかのDBエンジンを使用する場合の接続文字列は、以下が参考になります。
主要なDBのJDBC接続文字列一覧 - Fight the Future


この状態で前回の手順でテストを実行すると、指定したファイルパス(~/workspace/project/db/)にdb.h2.dbというファイルが作成されます。
ファイルの中身をH2のビューアなどを使ってみてみると、TEST_ENTITYテーブルが作成されているはずです。


なお、このままの設定ではアプリの起動の度にDBのデータがクリアされてしまいます。
データを残したい場合は、やはりapplication.propertiesに以下の設定値を追加しましょう。

spring.jpa.hibernate.ddl-auto=update



ちなみにapplication.propertiesには、ほかにも色々な設定値が指定可能です。
指定可能な項目の一覧はここをみてください。


ではまた。

Spring Boot お勉強 その2 ~インメモリDBアクセス~

今回はSpring BootでのDBアクセスについて書きます。
DBはH2データベースを使用します。
まずはGradleの設定から。

<略>
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("com.h2database:h2")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}
<略>

中の2行を追記しました。
これでビルドすると、クラスパスにspring-data-jpa関連のライブラリとH2のjarファイルが追加されます。
spring-bootはクラスパス内のH2のドライバやなんかを読み込んで、それに合ったDB接続の設定を自動的にやってくれるというわけです。


確認のために次のようなクラス・インターフェースを作ります。

@Entity
public class TestEntity {
	
	@Id
	@GeneratedValue
	private Integer id;
	
	public void setId(Integer id) {
		this.id = id;
	}
	
	public Integer getId() {
		return id;
	}
}
@Repository
public interface TestRepository extends JpaRepository<TestEntity, Integer> {
	
}

これらが使用している技術はJPAだったりSpring-Hibernate連携だったりで、Bootと直接は関係ないので詳細は割愛します。


次にテストクラスを書いて、src/test/java配下のどこかに置きます。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class TestRepositoryTests {
	
	@Autowired
	private TestRepository repo;
	
	@Test
	public void testName() throws Exception {
		TestEntity e = new TestEntity();
		repo.save(e);
		
		List<TestEntity> savedEList = repo.findAll();
		Assert.assertEquals(savedEList.size(), 1);
	}
}

この状態でGradleからビルドを実行すると、テストコードが実行されます。
その中で、Repositoryインターフェースを通してEntityがDBに保存され、取り出されます。
これでDBへのinsert、selectが実行できたわけですが、正直DBにアクセスできた実感がないですね。
だってDBがオンメモリで動いて実行後に消えてしまうわけですから。
DBをファイルに書き出して、確認するのはまた次回。
では。

Gradle お勉強 その1 ~EclipseとWrapper~

前回、Spring Bootについて書いた中で出てきたGradleですが、こちらについて追加情報を学んだので書きのこしておきます。


私はjavaの開発はEclipseでやることがほとんどなんですが、前回の方法でプロジェクトを作成した場合、クラスパス指定もされていないし、.projectファイルもないしで、そのままEclipseワークスペースに取り込むことができません。
その解決に使えるのがGradleのeclipseプラグイン
プロジェクトルートのbuild.gradleに以下のように追記します。

<略>
apply plugin: 'java'
apply plugin: 'spring-boot'
apply plugin: 'eclipse'
<略>

そんで、コンソールから次のコマンドを実行します。

gradle eclipse

するとフォルダ内に、.classpathファイルと.projectファイルが作成されることが見て取れると思います。
これで、Eclipseでプロジェクトとして認識してくれるようになります。
Gradleで指定した依存関係も、ちゃんとクラスパスに追加してくれます。


逆に、EclipseのGradleプラグインを使うというパターンもあります。


続いてWrapperのお話。
チームで開発する場合、build.gradleとプロジェクトのソースを配布して、各開発者の端末でGradleを動かすことになります。
ただその場合、全員の端末にGradleをインストールする必要があり、ちょいとめんどいですよね。
その解決に使えるのがGradleWrapperです。
またもbuild.gradleに以下の行を追加します。

task wrapper(type: Wrapper) {
    gradleVersion = '1.12'
}

そんで、コンソールから次のコマンドを実行します。

gradle wrapper

すると、gradlewとgradlew.batというファイルとgradleというフォルダが作成されるはずです。
~.batはwindows用、gradlewはMacLinux用のシェルスクリプトです。
これらをソースやbuild.gradleと一緒にチーム内で共有します。
すると、チームの他の人はGradleをインストールしなくても、batやシェルを実行するだけでGradleを直接使ったのと同じ効果が得られます。
(ちなみに1.12はgradlew経由で使用するGradleのバージョンを指定しています。
他の人の実行イメージはこんな感じ。

gradlew build

やってみてね。

Spring Boot お勉強 その1 ~環境構築など~

今回のテーマはSpring Boot。


まず簡単にどんなものか説明すると。
javaDIコンテナ、Springのプロジェクトの1つ
・Springを簡単に使用開始できるように、依存関係や、設定などをひとまとめにしたもの
・Webアプリケーションの場合Tomcatも内蔵(warとして出力もできます)


つまり、準備や環境構築に労力をかけずに、springを使ったjavaのアプリケーションが作れるのがいいところ。
DB使うアプリでも最初はインメモリのDBで始められるからミドル入れる必要がないし。


ではまずは、環境構築から。

ちなみに以下、()で書かれるパスは、私が今回作ったフォルダ構造を一例として書いているものです。


①依存関係解決ツールとしてgradleを使用するので、gradleのインストールから。

まずはこちらからgradle-x.x.x-all.zipをダウンロードします。

http://www.gradle.org/

zipファイルを任意のパス(C:\gradle-1.12)に展開します。

展開した先\bin(C:\gradle-1.12\bin)を環境変数のパスに追加します。


②続いてプロジェクトのフォルダ(C:\test)を作成して、その直下に

build.gradleというテキストファイルを作成する。

内容は以下の通り

buildscript {
    repositories {
        mavenCentral()
        maven { url "http://repo.spring.io/snapshot" }
        maven { url "http://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.0.BUILD-SNAPSHOT")
    }
}

apply plugin: 'java'
apply plugin: 'spring-boot'

jar {
    baseName = 'myproject'
    version =  '0.0.1-SNAPSHOT'
}

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/snapshot" }
    maven { url "http://repo.spring.io/milestone" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

といってもこれはまんま、以下の公式サイトの9.1.2からパクってきました。

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/

gradleの内容詳細はおいおい勉強したら書くかもしれません。


とりあえずのポイントは、"spring-boot-starter-web"への依存関係を書くだけで、SpringCoreもSpringMvcも組み込みTomcatもログライブラリもなんだかんだクラスパスに追加してくれるということ。
なお、hibernatejpaを使いたければ"spring-boot-starter-data-jpa"を、AOPを使いたければ"spring-boot-starter-aop"を依存関係にどんどん追加していけば、いい感じにビルドしてくれるようになりそうです。


③クラスパスとなるフォルダを作成する。

spring bootのデフォルトでは、プロジェクトフォルダから見て、src/main/javaとsrc/main/resourcesがクラスパスになるので、このフォルダを作成します。

よくあるプロジェクト構成です。

想像はつくかもしれませんが、テストコードのクラスパスは、上記2つに加え、src/test/javaとsrc/test/resourcesになります。


④アプリの最上位となるパッケージを作成し、そこにアプリケーションの起動ポイントとなるクラスを作成する。(c:\test\src\main\java\com\example\test\Application.java

その内容は以下の通りです。

package com.example.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;


@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
	
	public static void main(String[] args) throws Exception {
		
		SpringApplication.run(Application.class, args);
	}

}

要素をざっくり説明していくと


・mainメソッド
言わずもがなですが、アプリの起動ポイント。
設定クラスとして自クラスを指定して、Springを起動しています。


・Configurationアノテーション
設定のBeanである旨を宣言している。


・EnableAutoConfigurationアノテーション
Spring Bootの各種自動設定を有効にしている。
Spring Bootのキモはおそらくこれだと思っています。
これによって、内包してるTomcatが動いたり、ViewResolverが自動で追加されたり、Hibernateがいい感じの設定で動いたりなどしてくれる。
一部設定の変更などももちろん可能(後述の予定)


・ComponentScanアノテーション
ControllerとかServiceとかのクラスにアノテーションをつけておくと自動的にBean定義に追加してくれるというもの。


⑤ターミナルからアプリケーションのルートフォルダ(c:\test)に移動して、以下のコマンドを実行。

gradle build

依存関係の解決とコンパイルが実行され、build\libs以下にjarファイルが作成されます。
私の環境の場合、myproject-0.0.1-SNAPSHOT.jarでした。
これはbuild.gradleに指定したbasenameとversionによって変わってきます。


⑥アプリの起動
コマンドから以下を実行

java -jar c:\test\build\libs\myproject-0.0.1-SNAPSHOT.jar

これでとりあえずtomcatが起動して、アプリがマウントされます。
http://localhost:8080/でアプリにアクセスできるはずですが、まだControllerクラスがないので404になるでしょう。


その辺からは次回以降。

bootstrapお勉強 その1 ~その2はあるのか~

では第1話。

 

以下のサイトを参考に見ながらサンプルコードをポチポチ書いています。

 

Getting started · Bootstrap (本家)

HTML5アプリ作ろうぜ!(11):Webデザイン初心者でもできる、Bootstrapの使い方超入門 (1/4) - @IT

今日からはじめる!Twitter Bootstrap 3入門 〜Webデザイナーのための簡単サイト構築術〜 | Find Job ! Startup

 

コピったサンプルコードをそのまま出してもしょうがないので、自分なりにポイントと思ったところを箇条書きで挙げていきます。

 

  •  HTMLのテンプレは本家からコピれるBasicTemplateを元にする。
  • 基本的に画面は横12のグリッドからなる。(グリッドをうまく配置することでレスポンシブを実現する?)
  • class="container"でくくると横幅があう(12グリッド分の幅がcontainerなのか?)。
  • 共通的なスタイルとしてactive、primary、success、info、warning、dangerなんかがある。
  • class="btn btn-default  btn-lg"みたいに、プロパティをつけたしていく。最初のbtnは必須のようだ。
  • どうやらcssファイルをさしかえればテーマ変更みたいなのができるみたい。

 

う~ん、わかったようなわからんような。

 

bootstrapお勉強 その0 ~能書き~

技術的なことをいろいろ勉強しながら学んだことを少しずつブログとして書きためていきましょう、という趣旨で始めました。

続くのかどうかは知りませんが、まずは第1歩。

 

最初のテーマはbootstrapです。

仕事の中でHTML書く機会もちょびっとだけあるんですが、いまいちうまく使えない。

機能のほうをメインで考えたいからついついUIはおろそかになってしまう。

さくさく画面を開発できる方法ないかな、と思った結果bootstrapの使い方を体系的に学んでみることにしました。

 

頑張ってみます。

ではよろしく。