Spring frameworkについて

こんにちは。ITSS事業部の豊田です。
今回はITSS事業部ブログの当番ということでいつもよりは真面目にブログを書かせていただこうと思います。
と言っても昨年4月からこの業界に入ったペーペーの私には本格的な技術ブログは書けないので、個人ブログの方で時々書かせていただいている技術ネタのような初心者向けの内容になります。
これを読んでいるベテランの方達はこんな当たり前のこと書いてどーするの!?と思っても口に出さずにどうかご容赦していただければと思います。
ちなみに間違っている箇所がありましたらこっそりご指摘ください。

今回書かせていただくのは現在の業務でも使用しているjavaのフレームワークであるSpringframework(大体は単にSpringと呼ばれる)についてです。
Springは全く触ったことない…という方向けに、自分の勉強も兼ねてほんの触りの部分ですが、書いてみたいと思います。

・そもそもフレームワークって何?
とりあえず『フレームワーク なに』で検索ボタンを押してみます。

困った時のウィキペディアさんの記事によると

プログラミングにおいて、一般的な機能をもつ共通コードをユーザーが選択的に上書きしたり特化させたりすることで、ある特定の機能をもたせようとする抽象概念のことである。

なんだか分かりづらい…抽象概念…????

つまり要するに…プログラムとかのひな型ってことですよね?
すげー便利な機能がいっぱい使えるこれを使えばプログラムを作るのが楽になるよ的なやつ。それがフレームワーク。だと私は理解しました。

そんなフレームワークですが、種類もたくさんあります。
私が知っているのはjavaのフレームワークだけですが、聞いたことがあるだけでstruts、javaEE、playframeworkとか色々あります。
私がjavaを勉強したポリテクセンターでは以前はフレームワークについても教えていたそうですが、フレームワークによって機能がかなり異なるため、勉強したフレームワークを使用しない現場の場合逆に混乱を招くので
最近は教えていないと先生がおっしゃっていましたが分かる気がします。
数あるフレームワークの中でも人気だったのはstrutsだったらしいのですが、strutsの脆弱性が判明してからは他のフレームワークに乗り換えを検討する企業も多い…というのが最近の傾向らしいです。
というわけでSpringはStrutsからの乗り換えの候補にされることも多いHOTなフレームワーク…らしいです。

Springを使う環境構築は簡単で、Spring用のIDE(統合開発環境)のSpring Tool Suiteがあります。
既存のeclipseにプラグインとして入れる方法と、eclipseを内蔵した単体パッケージがありますが、後者の方が機能が充実しているということで、単体パッケージを使いことが多いようです。
単体パッケージの方も操作画面はeclipseと殆ど変わらないので安心です。

じゃあとりあえずプロジェクトを作ってみよ~とSpringを勉強し始めた当時の私はここで最初の疑問にぶち当たります。
え?スプリングスタータープロジェクトとレガシープロジェクトってなに?一体何の違いが…?

結論としてはレガシープロジェクトはSpringBoot登場以前のSpringを使ったプロジェクト、スタータープロジェクトはSpringBootを使用したプロジェクトである、という違いがあります。
今度はSpringBootってなんやねん…という疑問がわいてきますが、Springは色んなフレームワークが集まってできているフレームワークの総称的なやつなので、Springの仲間達の一人という感じです。
そしてこのSpringBootはWEBアプリ制作に関してはSpringの最終進化形だよ的なイカすフレームワークらしいので、とりあえずまあこれ使っとけば楽なのではないか?レガシー(遺産)よりもナウい感じだし…そもそも今までのSpringの機能も基本何でも使えるらしいし…という印象です。
新規プロジェクトを作成する際自分で指定しなくてもSpringの膨大な仲間達の中からいい感じにチョイスして使ってくれるのでどの機能を使おう?と悩むこともなく楽ちんです。
ただそこらへんのSpringの複雑な事情をなんとなくよきにはからってくれてしまうので、私のような初心者が扱うとどこまでがSpringでどこからがSpringBootの機能なの…?と混乱してしまうデメリットがあります。

ではスプリングスタータープロジェクトを作ってみます。
型はMavenかGradleを選べます。今回はmavenを選びます。(Mavenしか使ったことがない)

・ていうかMavenってなに?
プロジェクト管理ツール。ソースやライブラリの管理をしてくれる。複数人で開発するプロジェクトに向いている。
特に依存関係のライブラリをpom.xmlに書いておけば自動的にもってきてくれるのが便利。
という感じ。

SpringBootは従来のSpringでネックになっていた煩雑なxmlへの記載を可能な限り減らしたらしいので、より便利にmavenプロジェクトが作れるフレームワーク、ということらしいです。

・じゃあGradleってなに?
Mavenより便利って説もあるみたいだけど今回は割愛します。Gradleに詳しい方解説お願いします!

スタータープロジェクトの作成画面

ここでpom.xmlに書く基本的なことは選択することができます。
パッケージングをwarにしたい場合などはここの画面でwarを選べばOK。

依存関係の選択

例えばpostgreSQLを使いたいなーと思ったらここから選択すれば依存関係に組み込んでくれます。

そんな感じでできたプロジェクトのpom.xmlを開いてみます。

	4.0.0

	com.example
	demo-1
	0.0.1-SNAPSHOT
	jar

	demo-1
	Demo project for Spring Boot

	<!--親POM-->
	
		org.springframework.boot
		spring-boot-starter-parent
		1.5.10.RELEASE
		 <!-- lookup parent from repository -->
	

	<!--プロパティ情報-->
	
		UTF-8
		UTF-8
		1.8
	

	<!--依存関係-->
	
		
			org.springframework.boot
			spring-boot-starter
				
			org.postgresql
			postgresql
			runtime
		
	
			org.springframework.boot
			spring-boot-starter-test
			test
		
			
      org.springframework.boot
      spring-boot-starter-web
    
    
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	

依存関係の選択でpostgreSQLを追加したので組み込んでくれています。
これでライブラリをダウンロードして配置してビルドパスを通して~という作業からは解放されます。

ここまで長々と書いてきましたがお気づきでしょうか…
そう、まだプロジェクトを作成しただけなんですね!
このままではまずいのでせめてHelloworldだけでもやっておかないと…

HelloWorldのためにpom.xmlの依存関係にこちらを追加します。

org.springframework.boot
spring-boot-starter-web

そしてApplicationクラス、controllerクラス、Helloworldのためのクラスを作ります。
Applicationクラスはmainクラス、controllerはMVCのCの部分ですね。
Model,View,Controllerで作るMVCモデルですが、Springの場合Controllerの各メソッドがそれぞれViewと簡単にやりとりすることができます。今回はとにかく早急にハロワりたいのでView部分は省略します。

Applicationクラス

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Demo1Application {

public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}

controller

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class DemoController {

	@Autowired
	private HelloWorld HelloWorld;
	
	@RequestMapping("/HelloWorld")
	@ResponseBody
	public String test() {
	    return HelloWord.MassageView();
	}
}

Model…的な

package com.example.demo;

import org.springframework.stereotype.Component;

@Component
public class HelloWorld {
	
	private String message;
	
	public String MassageView(){
		message = "HelloWorld";
		return message;
	}
		
}

これでhttp://localhost:8080/HelloWordにアクセスするとハロワることができます。
ちなみにSpringBootには組み込みTomcatの機能が備わっているのでTomcatをセットアップしたりしなくて済むのでとても楽です。
ハロワるにあたって無理やりAutowiredを使ったりしています。
controllerクラスで使う便利な機能なども書きたかったところなのですが、続きは個人ブログの方で書かせていただきたいと思います。
それでは今回はここらへんで…!