サービスについて

今回のお題

今回のお題は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>