PlnatDTO
실제 프로덕션 환경에서 API를 구현할 때 모델 대신 DTO(Data Transfer Object)를 사용하는 방법을 다룹니다.
- DTO의 역할:
- DTO는 데이터베이스 모델(엔티티)과 API를 통해 외부에 노출되는 데이터 사이의 중간자 역할을 합니다. 이를 통해 클라이언트에게 필요한 데이터만 선택적으로 전달할 수 있으며, 데이터베이스 구조의 변경이 API 사용자에게 직접적인 영향을 미치지 않도록 합니다.
- PlantDTO 구현:
Models
폴더 내에DTO
폴더를 추가하고, 이 폴더 내에PlantDTO
클래스를 생성합니다.PlantDTO
클래스에는Plant
모델과 동일한ID
와Name
속성을 추가합니다. 추가적으로, 데이터베이스에는 존재하지만 DTO를 통해 클라이언트에게 노출하지 않을CreatedDate
속성을 예로 들 수 있습니다.
- API 컨트롤러에서 DTO 사용:
- API 컨트롤러에서는 이제
Plant
모델 대신PlantDTO
를 반환하도록 수정합니다. 이를 통해 클라이언트에게ID
와Name
정보만 제공하고,CreatedDate
와 같은 내부 정보는 숨깁니다.
- API 컨트롤러에서는 이제
- 실습 예시:
public class PlantDTO
{
public int Id { get; set; }
public string Name { get; set; }
}
[HttpGet]
public IEnumerable<PlantDTO> GetPlants()
{
return new List<PlantDTO>
{
new PlantDTO { Id = 1, Name = "여인초" },
new PlantDTO { Id = 2, Name = "뱅갈고무나무" }
};
}
DTO를 사용함으로써 API의 유연성을 높이고, 클라이언트에게 노출되는 데이터를 세밀하게 제어할 수 있습니다. 이는 애플리케이션의 보안과 유지보수성을 향상시키는 중요한 방법입니다.
Plant 데이터 스토어
이 섹션에서는 API 내에서 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 수행하기 위한 데이터 저장소를 구현하는 방법을 다룹니다.
- 데이터 저장소의 필요성:
- 실제 애플리케이션에서는 데이터베이스를 사용하여 데이터를 저장합니다. 하지만, 본 강의에서는 데이터베이스 설정을 단순화하기 위해 임시 데이터 저장소를 사용합니다.
- PlantStore 클래스 구현:
Data
폴더를 생성하고, 이 폴더 내에PlantStore
라는 정적 클래스를 추가합니다.PlantStore
클래스 내에PlantDTO
객체의 리스트를 정적 멤버로 선언하여, 애플리케이션 전반에서 사용할 수 있는 공통 데이터 저장소를 제공합니다.
- PlantStore 사용 예시:
- 코드는
PlantDTO
객체의 리스트를 초기화하고, 두 개의 식물 정보를 저장합니다.
- 코드는
- API 컨트롤러에서 PlantStore 사용:
PlantAPIController
에서PlantStore
의PlantList
를 사용하여 클라이언트에게 식물 정보를 반환합니다.Comment- 이를 통해 데이터베이스 대신 임시 데이터 저장소를 사용하여 데이터를 관리할 수 있습니다.Comment
- 테스트 및 검증:
- 애플리케이션을 실행하고 Swagger UI를 통해
GetPlants
엔드포인트를 테스트합니다.PlantStore
에 저장된 식물 정보가 성공적으로 반환되는지 확인합니다.
- 애플리케이션을 실행하고 Swagger UI를 통해
public static class PlantStore
{
public static List<PlantDTO> PlantList = new List<PlantDTO>
{
new PlantDTO { Id = 1, Name = "여인초" },
new PlantDTO { Id = 2, Name = "뱅갈고무나무" }
};
}
이 방법은 개발 초기 단계에서 데이터베이스 구성 없이 데이터 관리를 단순화하고, API 개발 및 테스트를 용이하게 합니다. 추후 데이터베이스를 도입하면, PlantStore
를 실제 데이터베이스 연동 로직으로 대체할 수 있습니다.
// PlantsAPIController 내에서 PlantStore 사용
[HttpGet]
public IEnumerable<PlantDTO> GetPlants()
{
return PlantStore.PlantList;
}
프로젝트 리소스
https://github.com/kimdaewoong2022/MorePlants_WebAPI/tree/a3b48795ba3c792a8d4f3d27780c24c8efccc74d