이 섹션에서는 Plant API에 대해 DTO(Data Transfer Object)를 사용하는 방법에 대해 배웁니다.
특히, 생성(Create)과 업데이트(Update) 작업을 위한 별도의 DTO를 사용하는 방법을 다룹니다.
- DTO의 필요성: 하나의 DTO를 모든 작업(Create, Read, Update)에 사용하는 것은 실제 상황에서는 적합하지 않을 수 있습니다. 예를 들어, 생성 시에는 ID가 필요 없고, 업데이트 시에는 이미지 URL이 필수일 수 있습니다.
- 별도의 DTO 생성:
- PlantCreateDTO: 생성 작업에 사용됩니다. ID 필드가 없으며, 생성 시 특정 필드에 대한 검증이 다를 수 있습니다.PlantUpdateDTO: 업데이트 작업에 사용됩니다. ID 필드가 필요하며, 업데이트 시 추가적인 필드 검증이 요구될 수 있습니다.
- API 컨트롤러 수정:
- 생성(Create) 작업에서는
PlantCreateDTO
를 사용합니다. ID를 제외한 나머지 필드를 처리하며, Entity Framework Core가 자동으로 ID를 할당합니다.업데이트(Update) 작업에서는PlantUpdateDTO
를 사용합니다. ID를 포함한 모든 필드를 처리하며, 필요한 경우 추가적인 필드 검증을 수행합니다.Comment패치(Patch) 작업에서도PlantUpdateDTO
를 사용하여 특정 필드만 업데이트합니다.
- 생성(Create) 작업에서는
- 실습: 생성, 업데이트, 패치 작업을 위한 별도의 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 사용법을 제공할 수 있습니다.