REST 사양 (원하는 수준)은 데이터베이스 액세스로 설계되지 않았습니다. API 액세스에 표준화를 시도하고 있습니다. 언급 된 SQL 규칙 (사용 여부에 관계없이)은 API 액세스를 염두에두고 설계되지 않았습니다. SQL 쿼리를 작성하기위한 것입니다.
따라서 여기서 풀어야 할 문제는 API가 데이터베이스에 직접 매핑된다는 개념적인 이해입니다. 우리는 이것을 적어도 2009 년까지 반 패턴으로 묘사 할 수 있습니다 .
이것이 나쁜 주요한 이유는 무엇입니까? "이 작업이 데이터에 어떤 영향을 줍니까?"를 설명하는 코드 클라이언트 코드가됩니다 .
이것은 API에 끔찍한 영향을 미칩니다. (전체 목록이 아님)
API와의 통합이 어렵습니다
다음과 같이 문서화 된 새 사용자를 만드는 단계를 상상합니다.
POST /users { .. }
POST /usersettings { .. }
일부 기본값
POST /confirmemails { .. }
그러나 2 단계의 실패를 어떻게 처리합니까? 동일한 처리 로직이 API의 다른 클라이언트에 복사-파스타되는 횟수는 몇 번입니까?
이러한 데이터 작업은 종종 클라이언트에서 단일 작업으로 시작되는 동안 서버 측에서 쉽게 시퀀싱 할 수 있습니다. 예 POST /newusersetup
. DBA는이를 스토어드 프로 시저로 인식 할 수 있지만 API 조작은 데이터베이스 이상의 영향을 미칠 수 있습니다.
API 보안이 절망의 블랙홀이 됨
두 개의 사용자 계정을 병합해야한다고 가정 해 봅시다.
GET /users/1
PUT /users/2 { .. }
DELETE /users/1
사용자 삭제를 허용하지 않고 병합 기능을 허용하도록 사용자 권한을 어떻게 설정 하시겠습니까? 존재 하는 DELETE /users/1
경우 /usersettings
에도 사용자를 삭제하는 것이 공정 합니까?
API 작업은 시스템에서 여러 변경을 유발할 수있는 데이터베이스 수준보다 높은 수준의 작업으로 간주해야합니다.
유지 보수가 어려워 짐
... 클라이언트는 데이터베이스 구조에 의존하기 때문입니다.
이 시나리오에 대한 나의 경험을 바탕으로 :
- 기존 테이블 / 열의 이름을 바꾸거나 제거 할 수 없습니다. 기능 이름이 잘못되었거나 더 이상 사용되지 않는 경우에도 마찬가지입니다. 클라이언트가 고장날 것입니다.
- 새로운 기능은 기존 데이터 구조를 변경할 수 없으므로 데이터와 기능이 기존 기능과 전체적으로 속해있는 경우에도 인위적으로 분리됩니다.
- 코드베이스는 조각화, 혼란스러운 이름 및 안전하게 제거 할 수없는 수하물로 인해 점차 이해하기 어려워집니다.
- 사소한 변경을 제외한 모든 변경은 점점 더 위험하고 시간이 많이 걸립니다.
- 시스템이 정체되어 결국 교체됩니다.
데이터베이스 구조를 클라이언트, 특히 개발 제어 권한이없는 클라이언트에 직접 노출시키지 마십시오. API를 사용하여 클라이언트를 유효한 조작으로 좁히십시오.
따라서 API를 데이터베이스에 직접 인터페이스로 사용하는 경우 복수화는 걱정할 필요가 없습니다. 버리기 실험 이외의 경우 API가 나타내는 높은 수준의 작업을 결정하는 데 시간을 할애하는 것이 좋습니다. 그런 식으로 보면 복수화 된 API 엔티티 이름과 단일 SQL 엔티티 이름간에 충돌이 없습니다. 그들은 다른 이유로 거기에 있습니다.