5. DTO와 AutoMapper 그리고 Repository

5-1. 생성 및 업데이트를 위한 DTO

이 섹션에서는 Plant API에 대해 DTO(Data Transfer Object)를 사용하는 방법에 대해 배웁니다.

특히, 생성(Create)과 업데이트(Update) 작업을 위한 별도의 DTO를 사용하는 방법을 다룹니다.

  1. DTO의 필요성: 하나의 DTO를 모든 작업(Create, Read, Update)에 사용하는 것은 실제 상황에서는 적합하지 않을 수 있습니다. 예를 들어, 생성 시에는 ID가 필요 없고, 업데이트 시에는 이미지 URL이 필수일 수 있습니다.
  2. 별도의 DTO 생성:
    • PlantCreateDTO: 생성 작업에 사용됩니다. ID 필드가 없으며, 생성 시 특정 필드에 대한 검증이 다를 수 있습니다.PlantUpdateDTO: 업데이트 작업에 사용됩니다. ID 필드가 필요하며, 업데이트 시 추가적인 필드 검증이 요구될 수 있습니다.
  3. API 컨트롤러 수정:
    • 생성(Create) 작업에서는 PlantCreateDTO를 사용합니다. ID를 제외한 나머지 필드를 처리하며, Entity Framework Core가 자동으로 ID를 할당합니다.업데이트(Update) 작업에서는 PlantUpdateDTO를 사용합니다. ID를 포함한 모든 필드를 처리하며, 필요한 경우 추가적인 필드 검증을 수행합니다.Comment패치(Patch) 작업에서도 PlantUpdateDTO를 사용하여 특정 필드만 업데이트합니다.
  4. 실습: 생성, 업데이트, 패치 작업을 위한 별도의 DTO를 사용하여 API를 수정하고, 이를 테스트하여 각 작업이 올바르게 수행되는지 확인합니다.
// PlantCreateDTO.cs
public class PlantCreateDTO
{
    [Required]
    [MaxLength(30)]
    public string Name { get; set; }
    public string Details { get; set; }
    [Required]
    public double Rate { get; set; }
    public int Occupancy { get; set; }
    public int Size { get; set; }
    public string ImageUrl { get; set; }
}
​
// PlantUpdateDTO.cs
public class PlantUpdateDTO
{
    [Required]
    public int Id { get; set; }
    [Required]
    [MaxLength(30)]
    public string Name { get; set; }
    public string Details { get; set; }
    [Required]
    public double Rate { get; set; }
    [Required]
    public int Occupancy { get; set; }
    [Required]
    public int Size { get; set; }
    [Required]
    public string ImageUrl { get; set; }
}
​
// PlantAPIController.cs
public ActionResult<PlantDTO> CreatePlant([FromBody] PlantCreateDTO plantDTO)
{
    //...
}
​
public IActionResult UpdatePlant(int id, [FromBody] PlantUpdateDTO plantDTO)
{
    //...
}
​
public IActionResult UpdatePartialPlant(int id, JsonPatchDocument<PlantUpdateDTO> patchDTO)
{
    //...
}

이 섹션을 통해 생성 및 업데이트 작업에 별도의 DTO를 사용하는 방법을 배웠습니다. 이는 API의 유연성을 높이고, 작업에 따라 다른 검증 로직을 적용할 수 있게 해줍니다. DTO를 분리함으로써 API의 가독성과 유지보수성이 향상되며, 클라이언트에 더 명확한 API 사용법을 제공할 수 있습니다.