DTO(データ転送オブジェクト)とは?Springでの使い方を徹底解説!【初心者向け】

こんにちは!
今回は、Spring Frameworkを使ったDTO(Data Transfer Object)の基本と使い方について詳しく解説します。
DTOは、データのやり取りを行う際に重要な役割を果たします。この記事では、DTOの役割、実装例、バリデーションの方法、応用的な使い方を紹介します。


DTOとは?

DTO(データ転送オブジェクト)は、

「システム間でデータをやり取りするための データ専用の入れ物

のことです。

複雑な処理はなく、ただデータを持って送ったり受け取ったりするために使います。

たとえば、Webサイトで名前や住所を入力して注文すると、その情報をサーバーに送るためにDTOが使われます。また、サーバーからの返事(確認メールなど)もDTOを使って送られます。

Spring では、システムの中や外とのデータのやり取りで、エンティティ(データベースの情報)をそのまま使うと危険な場合があるので、必要な情報だけをDTOでやり取りすることで、データの安全性を守ります。


SpringでのDTOの基本的な使い方

Springでは、DTOをコントローラーで使うことで、外部からのリクエストデータを受け取り、サーバー内部のデータ構造とは独立した形で処理できます。

サンプルコード:ユーザー登録DTO

public class UserDto {
    private String username;
    private String email;
    
    // Getter and Setter
}

コントローラーでは、@RequestBodyを使ってリクエストからDTOを受け取ります。

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping("/register")
    public ResponseEntity<String> registerUser(@RequestBody UserDto userDto) {
        // 受け取ったDTOを使って処理
        return ResponseEntity.ok("User registered successfully!");
    }
}

このように、DTOを使うことで、クライアントから送られるデータを簡単に受け取り、処理できます。


DTOを使ったバリデーション

DTOは、データのバリデーションにも活用できます。Springのバリデーションアノテーション(@Valid、@NotNullなど)を使って、リクエストデータが正しいかどうかを簡単に検証できます。

サンプルコード:バリデーション付きDTO

public class UserDto {
    @NotNull(message = "Username cannot be null")
    private String username;

    @Email(message = "Email should be valid")
    private String email;
    
    // Getter and Setter
}

コントローラーでバリデーションを適用する場合、@Validアノテーションを使用します。

@PostMapping("/register")
public ResponseEntity<String> registerUser(@Valid @RequestBody UserDto userDto, BindingResult result) {
    if (result.hasErrors()) {
        return ResponseEntity.badRequest().body("Invalid data");
    }
    return ResponseEntity.ok("User registered successfully!");
}

DTOの応用的な使い方

1. ネストされたDTO

複雑なオブジェクト構造の場合、DTOをネストさせて利用できます。

public class AddressDto {
    private String street;
    private String city;
    
    // Getter and Setter
}

public class UserDto {
    private String username;
    private AddressDto address;
    
    // Getter and Setter
}

2. ListやMapを含むDTO

DTOには、リストやマップといったコレクションを含めることも可能です。

public class OrderDto {
    private List<ItemDto> items;
    
    // Getter and Setter
}

3. ModelMapperによる自動変換

エンティティとDTOのマッピングには、手動でフィールドを設定する方法もありますが、ModelMapperなどのライブラリを使うことで、自動的にエンティティとDTOの間を変換できます。

ModelMapper modelMapper = new ModelMapper();
UserDto userDto = modelMapper.map(userEntity, UserDto.class);

@RequestBodyや@ResponseBodyとの関係

Springでは、@RequestBodyを使ってクライアントから送られたJSONデータをDTOに変換し、@ResponseBodyを使ってDTOをJSON形式でクライアントに返すことができます。

@PostMapping("/update")
public ResponseEntity<UserDto> updateUser(@RequestBody UserDto userDto) {
    // 更新処理
    return ResponseEntity.ok(userDto);
}

おわりに

DTOは、Springでのデータ転送やバリデーション、エンティティとのマッピングにおいて非常に重要な役割を果たします。この記事では、DTOの基本から応用的な使い方まで解説しました。実際にプロジェクトでDTOを活用し、柔軟かつ保守性の高いコードを書く際の参考にしてみてください!

もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

他のMappingアノテーションについて知りたい方はこちらもどうぞ!↓↓↓↓

タイトルとURLをコピーしました