見出し画像

【マイクロサービス構築実習】部署と職員サービスの実装(DB設定からコントローラーまで)Springboot3 第4回





はじめに


こんにちは、今日は前回に引き続きマイクロサービスを実際に構築してみようと思います。 まず、部署と職員の2つのサービスを別々に作って、それぞれ異なるプロジェクト構造、DB、ビジネスロジックを実現したいと思います。重要なことはやはり部署と職員サービスが異なるポートを持つようにすることです。 今後、他のサービスをもう一つ追加して3つの異なるサービスを作ってマイクロサービスを実現してみようと思います。


二つのプロジェクト作成(department-service、employee-service)


Spring Initializerでweb、mysql、jpa、lombokの依存性を見つけて追加する。

プロジェクト名を適当に入力し、generateボタンを押す。


二つのアプリケーションを読み込む


InteliJからプロジェクト2つを読み込むと、異なるプロジェクト構造が生成される。

部署サービスの実装


部署DB作成



エンティティ生成

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="department")
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String departmentName;
    private String departmentDescription;
    private String departmentCode;

}

レポジトリ生成

public interface DepartmentRepository extends JpaRepository<Department, Long> {

}


アプリを実行すると、テーブルとカラムが新たに生成された。



部署追加API作成

<DepartmentDto>

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class DepartmentDto {
    private Long id;
    private String departmentName;
    private String departmentDescription;
    private String  departmentCode;

}

<DepartmentService>

public interface DepartmentService {
    DepartmentDto saveDepartment(DepartmentDto departmentDto);

}

<DepartmentServiceImpl>

@Service
@AllArgsConstructor
public class DepartmentServiceImpl implements DepartmentService {

    private DepartmentRepository departmentRepository;
    @Override
    public DepartmentDto saveDepartment(DepartmentDto departmentDto) {

        // convert department dto to department jpa entity
        Department department = new Department(
                departmentDto.getId(),
                departmentDto.getDepartmentName(),
                departmentDto.getDepartmentDescription(),
                departmentDto.getDepartmentCode()
        );

        Department savedDepartment = departmentRepository.save(department);

        DepartmentDto savedDepartmentDto = new DepartmentDto(
                savedDepartment.getId(),
                savedDepartment.getDepartmentName(),
                savedDepartment.getDepartmentDescription(),
                savedDepartment.getDepartmentCode()
        );

        return savedDepartmentDto;

    }
}

<DepartmentController>

@RestController
@RequestMapping("api/departments")
@AllArgsConstructor
public class DepartmentController {

    private DepartmentService departmentService;

    @PostMapping
    // Build save department REST API
    public ResponseEntity<DepartmentDto> saveDepartment(@RequestBody DepartmentDto departmentDto) {
        DepartmentDto savedDepartment = departmentService.saveDepartment(departmentDto);
        return new ResponseEntity<>(savedDepartment, HttpStatus.CREATED);
    }
}

Postmanで部署作成APIテスト

データベースにデータが正常に入った。



部署照会API生成

<DepartmentRepository>

    Department findByDepartmentCode(String departmentCode);

<DepartmentService>

    DepartmentDto getDepartmentByCode(String departmentCode);

<DepartmentServiceImpl>

    @Override
        public DepartmentDto getDepartmentByCode(String departmentCode) {

        Department department = departmentRepository.findByDepartmentCode(departmentCode);

        DepartmentDto departmentDto = new DepartmentDto(
                department.getId(),
                department.getDepartmentName(),
                department.getDepartmentDescription(),
                department.getDepartmentCode()
        );

        return departmentDto;
    }

<DepartmentController>

    @GetMapping("{department-code}")
    public ResponseEntity<DepartmentDto> getDepartment(@PathVariable("department-code") String DepartmentCode) {
        DepartmentDto departmentDto = departmentService.getDepartmentByCode(DepartmentCode);

        return new ResponseEntity<>(departmentDto, HttpStatus.OK);
    }

PostmanでURLに部署コードを入れて部署を照会する。


職員サービスの実装



職員DB生成

employeeサービスとMySqlを連結する。

部署は8080だから、職員ポートは8081に設定する。


職員生成API作成

<EmployeeDto>

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class EmployeeDto{
    private Long id;
    private String firstName;
    private String lastName;
    private String email;
}

<EmployeeService>

    EmployeeDto saveEmployee(EmployeeDto employeeDto);

<EmployeeServiceImpl>

@Service
@AllArgsConstructor
public class EmployeeServiceImpl implements EmployeeService {

    private EmployeeRepository employeeRepository;
    @Override
    public EmployeeDto saveEmployee(EmployeeDto employeeDto) {

        Employee employee = new Employee(
                employeeDto.getId(),
                employeeDto.getFirstName(),
                employeeDto.getLastName(),
                employeeDto.getEmail()
        );
        Employee savedEmployee = employeeRepository.save(employee);

        EmployeeDto savedEmployeeDto = new EmployeeDto(
                savedEmployee.getId(),
                savedEmployee.getFirstName(),
                savedEmployee.getLastName(),
                savedEmployee.getEmail()
        );
        return savedEmployeeDto;
    }
}

<EmployeeController>

@RestController
@RequestMapping("api/employees")
@AllArgsConstructor
public class EmployeeController {

    private EmployeeService employeeService;

    // Build Save Employee REST API
    @PostMapping
    public ResponseEntity<EmployeeDto> saveEmployee(@RequestBody EmployeeDto employeeDto) {
        EmployeeDto savedEmployeeDto = employeeService.saveEmployee(employeeDto);
        return new ResponseEntity<>(savedEmployeeDto, HttpStatus.CREATED);
    }
}

Postmanで職員生成リクエストを飛ばしてくれる。

DBに職員の情報が成功的に生成された。

職員照会API作成

<EmployeeService>

    EmployeeDto getEmployeeById(Long employeeId);

<EmployeeServiceImpl>

    @Override
    public EmployeeDto getEmployeeById(Long employeeId) {

        Employee employee = employeeRepository.findById(employeeId).get();

        EmployeeDto employeeDto = new EmployeeDto(
                employee.getId(),
                employee.getFirstName(),
                employee.getLastName(),
                employee.getEmail()
        );
        return employeeDto;
    }

<EmployeeController>

    //Build Get Employee REST API
    @GetMapping("{id}")
    public ResponseEntity<EmployeeDto> getEmployee(@PathVariable("id") Long employeeId) {
        EmployeeDto employeeDto = employeeService.getEmployeeById(employeeId);
        return new ResponseEntity<>(employeeDto, HttpStatus.OK);
    }

Postmanと職員の朝会テストに成功



最後に


今日は部署と職員サービスを異なるDBとプロジェクト構造を持たせて作成してみました。 基本的に生成と照会APIだけを実装してみましたが、やはり異なるサービスだと感じることができるのは、異なるポート番号設定を通じてDBに別々に戻るという点でそう感じました。 次回は、2 つの異なるサービスの間でどのようにコミュニケーションをとるかを見ていきましょう!


エンジニアファーストの会社 株式会社CRE-CO
ソンさん



【参考】


  • [Udemy] Building Microservices with Spring Boot & Spring Cloud


いいなと思ったら応援しよう!