31
RESTのために用意されている専用コントローラー RestController 分散システムのためのアーキテクチャースタイルネットワーク経由で 外部のサーバーへアクセスし、必要な情報を取得する仕組み クライアントからWebサービスにアクセスし、必要な情報を取得する 基本的なアーキテクチャースタイル 多くはシンプルなテキスト形式の形でデータを送信する このRESTを使用して設計されるシステムをRESTfulと呼ぶ REST こうしたRESTfulなWebサービスを構築する際に利用するコントローラー が、RestControllerである。 RestControllerは、Webアプリケーションの一般的なページ(HTMLのソー スコードを返信するページ)に比べるとシンプル。 大抵はHTMLを使わず、ただのテキストとして情報を送信するだけなの で、HTMLベースのWebページより利用しやすい。 RestController Springの基本 -1 ページ

RestController...Javaでは複雑な情報を扱う場合はクラスを定義し、そのインスタン スで処理を行うのが一般的 RestControllerも、考え方は同じである

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

  • RESTのために用意されている専用コントローラー

    RestController

    分散システムのためのアーキテクチャースタイルネットワーク経由で

    外部のサーバーへアクセスし、必要な情報を取得する仕組み

    クライアントからWebサービスにアクセスし、必要な情報を取得する

    基本的なアーキテクチャースタイル

    多くはシンプルなテキスト形式の形でデータを送信する

    このRESTを使用して設計されるシステムをRESTfulと呼ぶ

    REST

    こうしたRESTfulなWebサービスを構築する際に利用するコントローラー

    が、RestControllerである。

    RestControllerは、Webアプリケーションの一般的なページ(HTMLのソー

    スコードを返信するページ)に比べるとシンプル。

    大抵はHTMLを使わず、ただのテキストとして情報を送信するだけなの

    で、HTMLベースのWebページより利用しやすい。

    RestController

    Springの基本 - 1 ページ

  • RestControllerSampleクラスには、indexというメソッドが1つだけあり、

    @RequestMappingというリクエストマッピングのためのアノテーション

    がある

    @Requestmapping(アドレス)

    サーバーが受け付けるURLと処理を関連付けする(マッピング)するた

    めの仕組み

    用意されるメソッド毎に「これは〜というアドレス用」と関連付けを

    用意する

    サーバーアクセス時に、そのアドレスに割り当てられているメソッド

    が自動的に呼び出され、実行されるようにする

    リクエストマッピング

    このリクエストマッピングの設定を行うのが、@Requestmappingアノ

    テーションである。

    この引数に指定したアドレスにアクセスがあると、アノテーションが付け

    られているメソッドが自動的に実行される。

    例として、@Requestmapping(" / ")と引数が指定すると" / "アドレスにア

    クセス時に、indexメソッドが実行される。

    リクエスト用のメソッドについて

    RestControllerでリクエストにマッピングされるメソッドは、書式が決

    まっている。

    public String メソッド名( ){

    ------処理-----

    return テキスト;

    }

    戻り値はStringを指定し、引数は不要(引数有も可能)。戻り値として

    returnされるテキストが、クライアント側に送信されるテキストになる。

    メソッド内でテキストを作成し、それをreturnすれば、RESTfulなシステ

    ムを構築できる。

    RequestMapping

    Springの基本 - 2 ページ

  • “/”では複数のプロジェクトを識別できないので、コンテキストパスの設

    定を行う

    src/main/resources/application.propertysを編集し、springを再起動す

    server.servlet.context-path=/任意のパス

    サーバー起動後に”http://localhost:8080/任意のパス/“ へブラウザで

    アクセスできれば正しく設定ができている

    STSでプロジェクトを作成した場合、自動設定されないので、新規プ

    ロジェクト作成時に、コンテキストパスの設定も忘れずに行う

    コンテキストパスの追加

    Springの基本 - 3 ページ

  • パラメータ渡しを行うには、URLのパス部分に渡された値を変数とし

    て取り出す機能を利用する

    @RequestMapping(“/{value}”)

    {value}の部分が、パス変数の指定であり、” / ”アドレスの後のパスの

    値をvalueと名付けた変数として受け取ることを示す

    Indexメソッドは次のようになる

    public String index(@PathVariable int value)

    この引数が、パス変数で値を渡されることを明示的に示す。

    /{value}で指定されたvalueが、引数のvalueに渡される

    @PathVariable

    http://localhost:8080/任意のパス/100

    上記アドレスにアクセス時、/100というパスの100が{value}のパス変

    数の値に代入される

    その後、この値がindexメソッドの引数valueに渡される

    パス変数を扱う場合はデータ型に注意する

    パラメータ渡し

    Springの基本 - 4 ページ

    http://localhost:8080/sbootparamsample/200

  • RESTのサービスは、テキストを出力するだけであるが、それだけの

    機能を持ったサービスを提供することは通常ない

    出力される内容はより複雑なものであることが多い

    Javaでは複雑な情報を扱う場合はクラスを定義し、そのインスタン

    スで処理を行うのが一般的

    RestControllerも、考え方は同じである

    RestControllerクラスは、戻り値がStringであったが、クラスを指定

    することも可能

    returnされたインスタンスの内容をJSON形式に変換したテキストが

    出力されるようになる

    主にJavaScriptのオブジェクトをテキストとしてやり取りする

    際のフォーマットとして使用

    RestControllerは、JavaのインスタンスをJSON形式へ変換して

    出力する

    SpringBoot側で自動的に行うので、インスタンスをJSON形式

    に変換するコードを記述する必要はない

    インスタンスをreturnするだけでよい

    JSON

    オブジェクトのJSON出力

    Springの基本 - 5 ページ

  • RestControllerクラスは、RESTのサービス作成に有用であるが、

    実際のWebアプリケーションでは、HTMLのWebページの方が利用頻

    度が高いので、RestControllerクラスの代わりにControllerクラスを使

    用する

    @Controllerをクラスにつける

    通常のWebページを利用する際に、コントローラークラスに

    @Controllerを記述する

    Controllerクラスの場合、予め表示するページをテンプレートとして

    用意し、それを読み込み表示内容を作成する

    テンプレートを利用する際はライブラリも用意する必要がある

    テンプレートを使用し、HTMLと値をやり取りするには、

    @Controllerを使用する

    @RestControllerと違い、必ず表示用の画面が必要になるので注意

    controllerによるwebページ作成-1

    Springの基本 - 6 ページ

  • public String index(Model model)

    indexメソッドには引数を指定可能

    ModelクラスはWebページで利用するデータを管理するためのクラス

    Modelクラスに、テンプレートで利用する値を設定するとデータを渡

    すことが可能

    model.addAttribute(“msg”, “メッセージ内容”);

    addAttributeメソッドで値を設定

    第1引数には値の名前を、第2引数には保管する値を設定

    第2引数には、オブジェクトを渡すことも可能

    例では、msgという名前で、メッセージ内容を値としてテンプレート

    側へ渡している

    xmlns宣言について

    index.html

    最初にThymeleafを使う宣言をする

    foobar

    上記のような形でタグに属性を埋め込む

    このとき使うth:hogeという属性の宣言が必須

    上記のxmlns宣言により、以降th:hogeという属性が使用可能になる

    controllerによるwebページ作成-2

    Springの基本 - 7 ページ

  • th:text属性について

    hoge

    th:text属性はThymeleaf独自の属性

    Thymeleafによりページのレンダリング時に、th:hogeの値がタグの

    値に置き換えられてレンダリングされる

    独自属性のため、レンダリングされなければ、表示には全く影響を与

    えない

    index.htmlが直接表示された場合でも、

    タグの内容が表示される

    だけになる。Thymeleaf用に記述した情報が表示に悪影響を及ぼすこ

    とはない

    このth:textには、${msg}という値が設定されている

    これは予め用意されたmsgをここに埋め込むことを示す

    コントローラー側で用意した値をここに使用

    埋め込む値は、Thymeleafの属性の値として用意することに注意

    ${msg}

    上記の場合は、実行時に${msg}という文字列が表示される

    ${msg}はThymeleaf用の値とは認識されないので、コントロー

    ラーで用意した値に変換されない

    必ず、th:〇〇という属性の値に埋め込む必要がある

    ${値の名前}

    controllerによるwebページ作成-3

    Springの基本 - 8 ページ

  • indexの引数にModelクラスを指定する以外にもModelAndViewク

    ラスを指定することも可能

    @RequestMapping("/")

    mav.addObject("msg", "メッセージ内容");

    mav.setViewName("index");

    return mav;

    public ModelAndView index(ModelAndView mav){

    }

    Modelクラスの場合は、テンプレートに渡す値の設定のみを扱

    い、戻り値でView名を返却するが、ModelAndViewクラスの場合

    は、値の設定とView名をまとめて設定することが可能

    戻り値にはView名設定済みのModelAndViewクラスを返却する

    Modelクラスとはメソッド名が変わるので注意

    mav.addObject("msg", "メッセージ内容");

    第1引数には値の名前を、第2引数には保管する値を設定

    第2引数には、オブジェクトを渡すことも可能

    mav.setViewName("index");

    View名を設定します。

    Modexlクラス、ModelAndViewクラスどちらを使用しても結果は

    変わりませんので、使いやすい方を使って問題ありません。

    ModelAndView

    Springの基本 - 9 ページ

  • RequestMappingに属性追加

    @RequestMapping(value="/", method=RequestMethod.GET)

    @RequestMappingの引数を、value=”/”と記述するのは必須

    valueしか値がない場合は、省略して値だけの記述可能

    引数が複数ある場合は、引数名を指定して書く必要がある

    value=”/”にマッピングするメソッドはGETとPOSTの2つがある

    どちらも同じアドレスのため、メソッドを指定してGET用、POST用と

    区別する必要がある

    フォームから送信された値は、sendメソッドで処理する

    @RequestParam(value="hoge", required=false)boolean hoge

    フォーム送信された値を指定するためのアノテーション

    フォームにあるname=”hoge” で選択された値が、この引数hogeへ

    渡される

    @RequestParam

    Formの送信-1

    Springの基本 - 10 ページ

  • フォームコントロール

    checkbox 選択状態をbooleanで取得可能

    radiobutton 選択した項目のvalueをStringで取得可能。未選択はnull

    select 単一項目の場合はStringで取得可能

    複数項目が選択できる場合は、選択された各項目を1つにまとめたString配列

    で取得可能。未選択はnull

    index.html

    @{/}で、コンテキストパスを含めた送信先を指定

    action=”/”ではコンテキストパスが含まれないので

    http://localhost:8080/へアクセスするためエラーになる

    コンテキストパスを指定している場合には必ず記載する

    th:action

    Formの送信-2

    Springの基本 - 11 ページ

  • Spring Bootでは、画面の表示はテンプレートを使用する

    代表的なものには次の通り

    th:hogeなどの属性をHTMLタグに追加し、各種の値や処理などを組

    み込むことが可能。

    Spring Bootでは、Thymeleafを選択する人が一番多い

    Thymeleaf (タイムリーフ)

    Spring Bootでアプリケーションは組み込み用のJavaサーバーととも

    にJARファイルにまとめて実行する形でデプロイされた場合にはJSP

    が動かない

    Javaサーバーが動作しておりWARファイルをアップロードした場合

    は動作する

    JSP

    クラウドを利用してデプロイした際はJARファイルを選択するた

    め、JSPを使用できない機会が増える

    ${hoge}と値を埋め込むテンプレート

    Thymeleafが特殊な属性で値を設定するのに対し、FreeMarkerはテ

    キストを表示する場所に直接${}を埋め込んで表示可能

    FreeMarker

    制御のための機能にはHTMLのタグと同様のなどのタグを

    使うため、HTMLのビジュアルエディターなどでHTMLの構造に悪

    影響を与える可能性がある

    Thymeleaf-1

    Springの基本 - 12 ページ

  • GroovyはHTMLとは異なるコード体系のため、HTMLのタグ

    とは異なる

    Groovy

    $や#などの特殊記号を使い変数等をHTMLコード内に直接記

    述可能Velocityは直接書き込めるため、ビジュアルエディター

    などへの影響は少ない

    Velocity

    幅広い言語に対応するテンプレートエンジン

    Java、PHP、Ruby、Python、JavaScriptなどを使用可能

    {{}}記号を使い、変数等をHTMLコード内に埋め込む

    Mustache

    Thymeleafの基本は、値を出力することである

    これは、${{hoge}}という形で記述される。

    ${{}}を変数式と呼ぶ

    変数式の中に記述するのは、OGNL

    Javaの値にアクセスするための式言語

    Thymeleafに限らず、各種のライブラリやフレームワークな

    どで使われる。

    Javaに似た書き方であり、基本的にJavaで式を書けば、シン

    プルなものなら大抵はOGNLの式になると考えて良い

    OGNL

    Thymeleaf-2

    Springの基本 - 13 ページ

  • th:text="${new java.util.Date().toString()}">

    変数式には、単に変数や値などを書くだけでなく、インスタンスを

    生成、メソッド呼び出し等のOGNL式の記述可能

    変数式は、変数を記述してそのまま出力可能

    この変数は、コントローラーで値を用意しておき、それをテンプ

    レート側に出力するのが基本

    Javaのクラスでは、テンプレートでよく利用されるクラスがある

    Thymeleafでは、よく使われるクラスを#nameという定数として変

    数式の中に直接記述して利用可能

    これをユーティリティオブジェクトと呼び、次に一例を示す

    #strings Stringクラスの定数

    #numbers Numberクラスの定数

    #bools Booleanクラスの定数

    #dates Dateクラスの定数

    #objects Objectクラスの定数

    #arrays Arrayクラスの定数

    #lists Listクラスの定数

    #sets Setクラスの定数

    #maps Mapクラスの定数

    これらはクラス定数なので直接クラスメソッドなどを呼び出し可能

    ただし、new #datesなどのようにDateインスタンスを生成するよう

    な記述の仕方は不可

    #dates.hogeといったクラスフィールドやクラスメソッドの呼び出

    しに利用する

    Thymeleaf-3

    Springの基本 - 14 ページ

  • Webアプリケーションでは、クエリ文字列にパラメータをつけて送信

    することができる

    その場合、コントローラーを通さず、直接テンプレート内でパラメー

    タを利用することも可能である

    このような場合にはparam変数を利用する

    変数式の中で直接利用できる変数

    この変数の中から、パラメータ名を指定して値を取り出す

    ${param.id}でid=hogeの値を取得可能

    通常は値は配列になっているので、ここから更に値を取り出す

    param内のidやnameの配列の最初の要素を指定することで、値の

    取り出しが可能

    param

    テキストリテラルの記述

    th:text="'from parameter... id=' + ${param.id[0] + ',name=' +

    param.name[0]}"

    th:textの値では””の中に、’’で値が記述されており、これはOGNLでテ

    キストリテラルを記述する際の書式である

    1つのテキストを表示する場合は、””内に直接テキストを記述するが、

    複数リテラル利用時には、””内に’’でテキストリテラルの記述可能

    パラメータへのアクセス-1

    Springの基本 - 15 ページ

  • Thymeleafには、リンク指定に専用の式が存在する

    URLを指定する属性 (タグのhrefなど)で利用

    @{/hoge}と記述すれば、/hogeへのリンクを指定可能

    @{アドレス}

    変数式は、基本的にコントローラー側に用意した値をそのまま出力

    するだけのものであるが、オブジェクトを使用する場合は扱いが難

    しくなる

    ${object.name}のようにオブジェクトのプロパティやメソッドを指

    定可能であるが、オブジェクト内に多数の値がある場合や、おぶ

    じぇくとがリネームされた際にすべての名前をリネームするには時

    間がかかるので、オブジェクトを指定し、選択されたオブジェクト

    内の値を取り出すための変数式を使用する。以下に書式を示す

    オブジェクトを扱う変数式の内部で利用

    *{}

    th:object属性でオブジェクトを設定することで、タグの内部で、*{}

    による変数式を使用可能

    この変数式では、オブジェクト内のプロパティなどを名前だけで指

    定可能

    パラメータへのアクセス-2

    Springの基本 - 16 ページ

  • 変数式の中に複数の値を組み合わせてテキストを出力する場

    合、” ‘A ‘ + ‘ B’ ”のように””内にテキストリテラルを連結して記

    述可能だが、それ以外にもリテラル置換が利用できる

    以下のように記述する

    “| something else |”

    テキストの前後に|記号を記述する

    ||で囲まれた中には変数式を直接書き込み可能

    リテラル置換

    Springの基本 - 17 ページ

  • Thymeleafは変数式でテキストを出力する際、安全のために

    HTMLタグをすべてエスケープ処理するため、th:textはHTMLの

    タグもそのままテキストとして表示されてしまう

    この場合は、th:utextを使用する

    アンエスケープテキストをそのまま出力するための属性

    設定されたテキストをそのままの状態で出力可能

    値にHTMLタグが含まれていると、それがそのまま機能して

    しまい、出力される値の内容に問題があればトラブルの原因

    になる可能性もある

    一例として、ユーザーから送信された情報を元にテキストを

    作成する場合、XSS などの攻撃に対して無力になる

    このような危険性を踏まえたうえで使用する

    th:utext

    HTML出力

    Springの基本 - 18 ページ

  • 変数式の値が真のとき値1を表示、偽なら値2を表示

    Javaの三項演算子と同じ動き

    変数式 ? 値1:値2

    2つの値の切り替えだけでなく、表示そのものをON/OFFする

    ことも可能。次の制御用の属性を使用する

    th:if

    値として設定したものがtrueのとき、このタグ及びその内部に

    あるタグを表示する

    th:if=”条件”

    値として設定したものがfalseの場合に、このタグ及びその内部

    にあるタグを表示する

    th:unless=”条件”

    これらの属性は、true/false判定をする際に有効なものが真偽値だ

    けでなく、次のような値を判定する

    true

    ・true値

    ・ゼロ以外の数値

    ・”0”、”off”、“no”といった値以外のテキスト

    false

    ・false値

    ・数値のゼロ

    ・”0”、”off”、“no”といったテキスト

    条件式-1

    Springの基本 - 19 ページ

  • th:ifなどは真偽値を使った条件分岐以外に、3つ以上に分岐さ

    せたい場合に使用する

    次のように記述します。

    ・・・

    ・・・

    th:switch

    th:switchは条件式の値をチェックし、その内側にあるth:caseから同

    じ値のものを探してそのタグだけを出力する

    条件式-2

    Springの基本 - 20 ページ

  • JDBCのAPIを直接使用した従来の開発方法ではデータベースを扱う場合、

    通常は以下のような煩雑な作業が発生し、バグを埋め込んでしまう可能性

    があった

    • 接続に関する情報を設定ファイルなどから読み込みコネク

    ションを確立

    • 接続時のコスト軽減でコネクションをプーリング

    接続処理

    • 検索条件を指定してSELECT文を組み立て

    • ResultSetからデータを取り出し、オブジェクトにデータを

    セットし直す 結果件数分繰り返し、配列等に格納し呼び出し

    元に返す

    検索系処理

    • オブジェクトの各プロパティからデータを取りし、VALUES

    句やSET句に取り出したデータを指定

    更新系処理

    また、SQL文などを直接ソースコードに埋め込むことが多く、テーブル構

    造の変更などがあると、アプリケーション内のソースコードを修正しなけ

    ればならない

    そのため、SQL文が複数のソースコードに記述されていると修正漏れや修

    正間違いなどを常に意識しなければならない

    これら問題を解決するのが、O/Rマッピングである

    ORマッピング-1

    Springの基本 - 21 ページ

  • オブジェクトとRDBをマッピングすること

    O/Rマッピングは実装時のデータベース操作にかかわる煩雑な作

    業を軽減し、インピーダンスミスマッチを解決する

    O/Rマッピング

    Javaのようなオブジェクト指向の言語でRDBを利用すると、オ

    ブジェクトとRDBのマッピングに時間を多く消費する

    これは両者の設計思想の違いから生じており、この問題をイン

    ピーダンスミスマッチと呼ぶ

    インピーダンスミスマッチ

    Javaは、プログラムをオブジェクトとして設計し、現実世界のモデ

    ルに即したものとしてデータモデルを定義するが、

    データベースは、正規化により、データの検索/登録/更新処理に

    最適なモデルを定義する

    データベース設計では、現実世界のモデルの構造は無関係であり、

    正規化に基づいてモデルが考えられている

    インピーダンスミスマッチを解決するために、表形式のデータをオ

    ブジェクト形式のデータに対応付けるマッピングコードを作成する

    必要がある

    これはデータ構造が複雑であると作業量が膨大になり、単調な繰り

    返しが多く、バグを埋め込む危険性が高くなる

    ORマッピング-2

    Springの基本 - 22 ページ

  • O/Rマッピングは、オブジェクトとRDBを対応付けし、オブジェクトと

    データベース間の橋渡しを行う

    O/Rマッピングの機能は基本的には次の機能を提供する

    データベースとの接続やコネクションプーリングの管理

    コネクション管理機能

    外部ファイルにオブジェクトの属性名とテーブルの列名に関す

    るマッピング定義を設定すると自動的にマッピング処理を行う

    自動マッピング機能

    自動生成ツールによりマッピングファイル、DTO、DAOなど

    のファイルの自動生成

    自動生成機能

    JDBCドライバやデータベースの接続情報を、O/Rマッピング

    ツール側で管理

    接続情報の管理機能

    一度取得した検索結果をメモリ上に記憶し、同じ検索処理が行

    われた場合は、メモリ上にある検索結果を返す

    データベースへのアクセスを減らし、パフォーマンスの向上

    キャッシュ機能

    ORマッピング-3

    Springの基本 - 23 ページ

  • O/Rマッピングの処理の流れは以下の通り

    1. データベースの接続情報をXMLファイルに定義(データベース設定

    ファイル)

    2. クラスのフィールドとテーブルカラムの対応付けをXMLファイルに

    定義(マッピング・ファイル)

    3. O/Rマッピングツールがデータベース設定ファイルとマッピングファ

    イルを読み込み自動的にマッピング処理を行う

    4. アプリケーションからO/RマッピングツールのAPIを介してデータ

    ベースへアクセス

    O/Rマッピングのメリット

    ソースコードからデータベースにアクセスする処理の部分を切

    り離すので、変更に柔軟に対応可能

    変更に強い

    オブジェクトとRDBとの構造的な違いを意識せずに開発可能

    インピーダンスミスマッチの解決

    自動生成機能でソースファイルなどを作成しなくてもよい

    開発効率の向上

    データベースの差(SQLの記述の違い)を吸収

    データベースの差を吸収

    ORマッピング-4

    Springの基本 - 24 ページ

  • O/Rマッピングツールにより記述の仕方が異なる

    一例として、SQL文を明示的に記述する必要があるものや、SQL文

    を記述する必要がないものもある

    SQL文を明示的に記述するものは、マッピングファイルなどにSQL

    文を直接記述する

    自身でSQL文を記述できるので、SQLの機能を十分に引き出すこと

    ができ、SQL文を記述しないタイプと比較して柔軟な対応が可能

    このタイプのO/RマッピングツールにはMyBatisがある

    MyBatisには、SQLを記述せずにJavaで条件式を作成する機能もあ

    SQLを記述しないものは、永続化オブジェクトの属性を変更するだ

    けでレコードのカラム値が変更される

    このとき、O/Rマッピングツール自身がSQL文を自動的に生成して

    実行する

    永続化オブジェクトを操作することでSQLが自動実行されるで、

    SQLを意識しないでデータベースを操作することが可能

    このタイプのO/RマッピングツールにはTorqueやHibernateなどが

    ある

    ORマッピングツールの種類

    Springの基本 - 25 ページ

  • このアノテーションをつけたクラスを設定クラスに指定し、Spring起動時に

    読み込まれる

    @Configuration

    MyBatisの設定ファイルの配置場所を@MapperScanで指定する。Mybatisを

    使用する際は必ず記述

    @MapperScan(basePackages="hoge")

    @Bean

    public SqlSessionFactory sqlSessionFactory(DataSource ds) throws Exception {

    上記によりDB接続のセッション情報やコネクション情報を作成

    @BeanはSpring起動時に自動的にインスタンス化をする仕組み

    Springを使用する際はnewでインスタンス化をせず、@Bean、

    @Autowired、@Serviceなどの作成されているオブジェクトを使い回すケー

    スが多い

    }

    実務ではControllerクラスでリクエストを受け、ServiceクラスでDB接続等の

    ビジネスロジックを実行するケースが多い

    @Service

    public class DBOperationService { }

    @serviceで、このクラスがServiceクラスであることを明示的にSpringへ宣言

    している

    @Autowired

    public hogeMapper hoge;

    上記で、hogeテーブルの操作クラスであるhogeMappeクラスを使用可能な

    状態にしている

    各テーブルの操作クラスのことをマッパークラスと呼ぶ

    @Autowiredをフィールドの変数に付加するとspring起動時にインスタンスを

    生成するため使用できる状態になる

    アノテーション

    Springの基本 - 26 ページ

  • MyBatisが自動的生成するメソッド

    プライマリーキーの設定がないテーブルからは作成されない

    プライマリーキーをもとにテーブルを検索し1レコード分を

    hogeオブジェクトに格納し、返却する

    DBのテーブルに対応したクラスをエンティティクラスと呼ぶ

    DBからエンティティクラスへの詰め替えも自動的にMyBatisが行

    hoge.selectByPrimaryKey(id);

    このメソッドは引数にエンティティクラスを受け取る

    値が未設定のフィールドは無視してinsertを実行する

    似たメソッドにinsertメソッドが存在するが、insert時に指定して

    いないフィールドにはnullが挿入される

    hoge.insertSelective(obj);

    このメソッドは条件に一致したレコードを削除する

    条件の指定の仕方は検索時と同じ

    objクラスをインスタンス化し、createCriteria後に条件を指定す

    deleteByPrimaryKeyメソッドも存在するが、これはプライマリー

    キーをもとに削除するメソッド

    更新処理も削除と変わらず、updateByExample、

    updateByPrimaryKeyで処理が可能

    使い方はdeleteと同じ

    hoge.deleteByExample(obj)

    CRUD

    Springの基本 - 27 ページ

  • 検索エンジンは、ユーザーが発行する検索クエリに対して高速に結果

    を返す必要があり、様々な手法がある

    最も単純な手法は、クエリ発行後、検索対象の文書1つ1つがクエリ単

    語を含むかを検査するもの

    この手法は容易に実装できるが、クエリ発行後に対象文書集合を走査

    するため、対象の文書の数の増加とともに、検索時間が増大する問題

    がある

    これに対し、インデックスを利用すると、大量の文書集合を高速に検

    索可能

    どの文書が、どの単語を含むのかという情報を保存するテーブル

    のこと

    クエリを発行した際、インデックスを持つ検索エンジンは自身の

    インデックスを調べてクエリ単語を含む文書集合を返却する

    インデックス

    インデックスの利用で、クエリを含む文書を収集する時間を短縮可能

    インデックスを利用した検索システムと全文書のコンテンツを走査す

    る検索システムを比較すると、大抵インデックスを利用した検索シス

    テムの方が高速である

    さらに、検索対象となる文書数(量)が増加しても、検索性能には殆

    ど影響がないため、大規模データを扱う高負荷な環境では、インデッ

    クスの利用は必須

    検索エンジン(インデックス)

    Solr - 28 ページ

  • 転置インデックスは各単語と単語を含む文書IDからなるテーブル

    転置インデックス

    例として、2つの英語の文書(Doc1,Doc2)があり、

    I have a pen, I have to go の2つであった場合、以下の表のような転

    置インデックスを生成する

    I 1, 2

    have 1,2

    a 1

    pen 1

    to 2

    go 2

    転置インデックスは連想配列を利用でき、単語をキーにして文書

    ID のリストを返す

    表の転置インデックス完成後に、ユーザーがpenというクエリを発行

    すると、検索エンジンはpenを含む文書IDリストを返す

    表では文書IDの1を返す

    インデックス

    Solr - 29 ページ

  • 検索エンジンに文書をインデックスするには、入力文書内の文を

    単語に分割する必要があり、この作業を行うのがトークナイザと

    呼ばれるコンポーネントである

    トークナイザには、入力文書を単語(形態素)に区切る単語単位

    とN-gramの2種類がある

    トークナイザ

    単語単位のトークナイザを利用したインデックスには、検索クエ

    リにヒットしない場合がある

    研究室を研究としてクエリを発行した場合ヒットしないなど

    単語単位のトークナイザ

    N-gram では文をn文字単位に分割して(オーバーラップを含む)

    インデックスする

    N-gram トークナイザ

    例えば2文字単位で研究室を分割すると研究、究室となる

    研究室を含む文書は研究という部分文字列をインデックスするた

    め、ユーザーがクエリ研究で検索した際、ヒットする

    欠点として、N-gramインデックスはトークナイザインデックスよ

    りもインデックスのサイズが大きくなる傾向がある

    結果、同一の文書集合で単語ベースのトークナイザとN-gramでイ

    ンデックスを生成した場合には、単語ベースの方が、検索性能が

    高い場合がある

    検索エンジンによっては両者を組み合わせることも可能

    単語ベースと文字N-gramの両方のインデックスを生成する機能を使う

    とN-gramインデックスでクエリ単語を含む文書集合を集め、トークナ

    イザインデックスでヒットした検索結果にランキングを行うことがで

    きる

    トークンナイザ

    Solr - 30 ページ

  • 入力文書が、PDF、Power Point のスライドのような場合、文書データか

    らテキストデータを抜き出す処理が必要になる

    実現するためのツールとしてApache TikaというツールはPDFやWordを含

    む多数の形式のデータからテキストコンテンツを抽出する機能を提供する

    また、コンテンツをMySQLなどのデータベースに保存している場合、デー

    タをコピーして直接インデックスを生成する機構をサポートする検索エン

    ジンも存在する

    検索対象の文書が手元にすべてある場合は、検索エンジンに手元にあ

    る文書すべてを入力として渡すことが可能

    インデックスの対象となる文書が手元に存在しない場合もある

    クローラ

    GoogleのようにWeb文書全体を対象とする検索エンジンを構築する場合

    は、検索対象とする文書は手元にないため、収集する必要がある

    クローラというコンポーネントはURLを巡回して未インデックスの文書や

    前回の取得時から変更のあった文書を取得し順次、インデックスする

    コンテンツ抽出(クローラ)

    Solr - 31 ページ