【マイクロサービス構築実習】部署と職員サービスの実装(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