質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    15843questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Spring

    843questions

    Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

  • MVC

    257questions

    MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

【spring】ControllerからEntityの役割について

解決済

回答 2

投稿

  • 評価
  • クリップ 3
  • VIEW 13K+

lupus_dingo

score 265

プロジェクトによって異なる場合もあるかもしれませんが、皆さんの認識を教えてください。
皆さんが開発される際は、Controller、Service、Dao、Dtoの階層(+utilityなど)をそれぞれパッケージに分けて開発するイメージでしょうか?

またそれぞれの階層の担当は以下で合っているでしょうか?
・Controller
urlとマッピングするメソッドを作成する。
プログラマーが主に作る一番上の階層。
ここにはなるべく処理を書かない。
Viewの指定をする。

・Service
Controllerから呼ばれる。
ここにデータアクセス以外のロジックを書く。

・Dao
Serviceから呼ばれる。
データベースやファイルにアクセスするメソッドを書く。
ここでjdbctemplateやDbUtilsなどを呼ぶ。

・Dto=Entity=bean
データベースやファイルから取得したデータを保持するためのオブジェクト。
Daoで取得したデータを保持する。
カラムに対応したフィールドとそれに対するsetter、getterを持つ。
単純なvalidateメソッドなら持たせてもいい。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

役割はあなたの認識で合っていると思います。
しかし、きちんと分けるかどうかはシステムの規模や性質によると思います。小規模システムなら区別しなくてもいいと思います。

大規模システムの場合は意識しなければいけない場合があります。大規模システムの場合、サーバーを数十台とか数百台で運用するわけですが、その場合に1台の時と同じ構成・役割のサーバーを単純に並べる場合もあれば、役割で分割することもあります。大事なのは役割で分割する場合です。

つまり大規模なシステムではControllerとServiceのサーバーが異なっている場合があるのです。Controllerのサーバーではリクエストを受け付け処理結果を返すだけ。ServiceのサーバーはControllerに要求された処理を行いその結果を返す、という感じで。

当然、ControllerとServiceは通信が発生します。ので、何度もServiceを呼び出すとその回数分のネットワーク通信が発生するクソシステムになりますので、そうならないようにServiceで結果をまとめて返すようなコードを書くようになります。

例えば、特定の条件に合うユーザー一覧を表示する際に、まずユーザーリストをとって、その各ユーザの付加情報を別のテーブルからとってきてあわせて出力するとします。もちろん、DBで2つのテーブルをJOINして結果を返すDaoを作ることが最も望ましいのですが、めんどうなので既存のDaoだけを組み合わせて作ることはよくあります。

その際に、Controllerでまずユーザーを取得するServiceを呼び出し、さらに付加情報を取得するServiceをユーザー数分ループして呼び出すとすると、最初にとれたユーザーの件数によっては大変な量のネットワーク通信が発生することになるわけです。

なのでControllerにはServiceを呼び出すループは書いてはダメで、「ユーザーを取得するServiceを呼び出し、さらに付加情報を取得するServiceをユーザー数分ループして呼び出す」Serviceを作り、ControllerからはそのServiceを1回呼ぶようにすべきです。

という感じで大規模システムの場合、必然的にControllerとServiceの役割が明確に区別され、どちらで処理をさせるか悩むことは少なくなります。

一方で

実際に実装してみると、結局ControllerにDB以外の処理を実装してしまい、
Serviceですることがなくなって(Daoを呼び出すだけ)しまいました。
Controllerにどこまで処理を入れるか悩みどころですね。

こんな場合には、Serviceをなくしてしまってもいいと思います。

さらにページ数が20-30ページしかないし、アクセス数も少なくかつ将来も大量のアクセスが発生する心配のないようなシステムだったら、極論言えばJSPにSQLを書いてしまってもいいと思います。ユーティリティクラスはいくつか作ることにはなると思いますが、Controller・Service・Daoはなしで。そうすれば管理するファイルの数も減り、ほとんどの修正でコンパイルのし直しもしなくてよくなりますのでメンテナンスも簡単です。

規模に応じて適切な構成を考える、それが重要ではないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/29 12:40

    詳細な回答ありがとうございます。

    >つまり大規模なシステムではControllerとServiceのサーバーが異なっている場合があるのです。Controllerのサーバーではリクエストを受け付け処理結果を返すだけ。ServiceのサーバーはControllerに要求された処理を行いその結果を返す、という感じで。

    そんなことがあり得るのですね。とても勉強になりました。

    >さらにページ数が20-30ページしかないし、アクセス数も少なくかつ将来も大量のアクセスが発生する心配のないようなシステムだったら、極論言えばJSPにSQLを書いてしまってもいいと思います。

    今実装してるのはかなり小規模ですが、勉強もかねてcontrollerからdao、dtoまで律義に作っています。
    しかもservice、daoに至ってはネットを参考にしてinterface化しているので小規模にしてはファイル数がかなり多いです。
    Controllerからは基本はService
    ひとつのみ呼び出す、
    interfaceはやめてserviceとdaoをまとめる
    を実施して規模に合った実装にしようと思います。

    キャンセル

0

大体の認識としてはそんなものかと。

「Dtoそのものをレスポンスとして返すのではなく、加工した構造体を返したい」
場合は、上げられた分類の他にViewModel(ViewObject,Vo)を作成することもあります。
DaoからEntityを取ってきてService層でViewModelに加工してController経由でViewに返すイメージですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/28 16:34

    回答有り難うございます。
    画面表示用に加工するための層をつくるということですね。

    実際に実装してみると、結局ControllerにDB以外の処理を実装してしまい、
    Serviceですることがなくなって(Daoを呼び出すだけ)しまいました。
    Controllerにどこまで処理を入れるか悩みどころですね。

    キャンセル

  • 2016/04/28 16:41

    Controllerの役割としては、「Serviceで取ってきたmodelをViewに渡すだけ」とするのが理想だと思うので、データベースから取ってきた値をそのまま渡すだけならServiceはDaoを呼び出すだけの薄いクラスになっても大丈夫だと思います。

    キャンセル

  • 2016/04/29 12:41

    回答ありがとうございます。

    「Serviceで取ってきたmodelをViewに渡すだけ」を意識して実装しようと思います。

    キャンセル

同じタグがついた質問を見る

  • Java

    15843questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Spring

    843questions

    Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

  • MVC

    257questions

    MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。