とても重要な概念なので、まとめてみたいと思います。
全体ロジック
controller --> service --> serviceImpl --> dao --> daoImpl --> databaseでは各レイヤの役割についてまとめます。
Dao(Data Access Object)
どんなフレームワークを使っても、データベースとやりとりすることは多いです。直接SQLを書くと、ソースコードが読みづらくなることは多いです。そこで、データベースをラップして、データベースとのやりとりを一つの対象、Objectとやりとりすることにすればソースコードの可読性や保守性が大幅向上できます。このObjectはDaoと呼ばれています。Dao層は自動的にSQLを生成し、データベースにアクセスします。PGはDao層のみを制御すればOKです。
制御する方法としては、通常Dao層の中にInterfaceを作成します。Interface内にデータを取得するなどのメソッドを定義します。実際データを取得するのSQL分は通常mapperファイルの中に記載します。またxmlファイルの中にSQL文が書かれている場合が多いです。
また、DaoはMapper、Respositoryと呼ばれることもあります。
Service
業務ロジックを実現する層です。Service層もDao層と同じように、まずはInterfaceを設計します。そこからImplクラスを定義します。これでPGはService層のInterfaceをcallすれば、業務ロジックを実現することはできます。service層の業務ロジックを実現するために、Dao層で定義したInterfaceを使ってデータベースとやりとります。
service層をラップ化することによって、業務ロジックが利用性が上がります。
Controller
service層に指示を出して、業務ロジックをコントロールする役割です。また処理した結果をビューに指示します。ここで覚えてほしいこととしては、Controller層はただ指示を出す側であって、実際に業務ロジックそのものを実現する機能は持っていません.
Model
Model層は通常View層と一緒に話します。view層は直接Userとやりとります。私たちは画面が見えるのはView層のおかげです。画面に表示されたデータはModel層です。View層は直接Controller層からの指示を受けます。