サービスについて
今回のお題
今回のお題はSpring BootのServiceです。
Serviceは、Repositoryクラスに定義したDB操作関数を用いて実際にレコード取得をするための処理を記述するクラスです。
個人的にはあまり違いが分かっていないのですが、RailsでいうところのfindなどのActiveRecordメソッドを1から定義しているのがRepositoryクラスで、それらをもとに新しいメソッドを定義しているのがServiceクラスでしょうか。
ファイル作成
例によって、ControllerやModelと同じディレクトリにファイルを作ります。
ファイル名は、HelloService.javaとします。
package指定やimportなど
package com.example.demo.hello;
import org.springframework.beans.factory.annotaion.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
クラスの定義
@Service
public class HelloService{
@Autowired
private Hellorepository helloRepository;
public Employee getEmployee(String id){
Map<String, object> map = helloRepository.findById(id);
String EmployeeId = (String) map.get("id");
String name = (String) map.get("name");
int age = (int) get("age");
Employee employee = new Employee();
employee.setEmployeeId(EmployeeId);
employee.setEmployeeName(name);
employee.setEmployeeAge(age);
return employee;
}
}
解説
上記のgetEmployeeメソッドは、基本的にコントローラで呼び出されます。
何をしているのかというと、ビューに渡すためのインスタンスを作成しているんですね。
例えば、employeeテーブルに(id, name, age) がそれぞれ("1", "Tom", 30)であるレコードがあったとします。
これを表示するために、まずは空のEmployeeインスタンスを作ってemployeeという変数に代入します。
そして、findByIdメソッドで取得したid, name, ageをそれぞれセッターで埋め込むことによって、employeeというインスタンスが完成します。
補足1〜コントローラからのサービスの呼び出し
上記のサービスを用いてコントローラ内でインスタンスを取得する方法を解説します。
public class HelloController{
......中略.......
@Autowired
private HelloService service;
@PostMapping
public String PostDbRequest(@RequestParam("text2") String id, Model model){
Employee employee = service.getEmployee(id);
model.addAttribute("employee", employee);
return "hello/db";
}
補足2〜ビューでの表示
上記の手順でコントローラで作成したインスタンスは、modelからemployeeというキーで取り出すことができます。
これを、以下のようにしてビューで表示します。
例)employeeのnameを表示する場合。
<td th:text="${employee.name}"></td>