REST api 설계에 대한 저의 견해인데 다른 의견이 있으신지 조언 부탁드립니다. ht

 
Dongmin Kim

REST api 설계에 대한 저의 견해인데 다른 의견이 있으신지 조언 부탁드립니다.

http://programmers.stackexchange.com/questions/270898/designing-a-rest-api-by-uri-vs-query-string

https://developers.google.com/gmail/api/v1/reference/

https://parse.com/docs/rest/guide#queries

두가지 예를 보자.
user/:userId/message/:messageId/attachment/:id
/user/:userId/parents/mother/parents

이런 경우 user/:userId/message/:messageId/attachment/:id 의 경우는 그냥 attachment/:id 로 가져올 수 있지 않은가? 해당 사용자의 메시지의 첨부파일을 가져오는 것과 그냥 첨부파일 중에 가져오는 것이 동일한 결과일 듯 하다. 물론 user/:userId/message/:messageId/attachment 여기까지만 하여 해당 사용자의 메시지의 첨부 파일의 리스트를 가져오는 것은 이런 URI 가 필요할 것이다.
하지만 document 기반의 몽고디비와 같은 것을 생각해보자. attachment 가 따로 컬렉션이 존재하지 않는다면 바로 attachment 의 id 로 가져오기 힘들다. elemeMatch 로 해당 attachement 를 쿼리할 수는 있으나 조금 애매한 면이 있다.
아마도 도큐먼트 디비라면 user 따로 message 따로 하고 attachement 는 message 의 sub document 로 설계했을 것이다. 관계형 디비라면 모두 따로 테이블을 만들었을 것이다. rest 는 resourceful 하기 때문에 위와 같이 hierarchical 을 uri 에 넣어주는 것이 좋은 듯 하다. attachement/:id 로 가져올 수 있다 하여 이것을 따로 만들면 user/:userId/message/:messageId/attachment 이런식으로 해당 사용자의 메시지의 첨부파일 리스트를 가져오는 것을 또 따로 만들어야 한다. 쿼리를 던지면 안되냐고 하겠지만 hierarchical 데이터는 쿼리에 넣지 않는 것이 REST 의 일반 원칙이다. 만약 userId 와 messageId 를 모르는 상태에서 attachment 를 가져오려면 attachment/:id 라는 uri 를 또 만들어야 할 것이다. 필요 이상의 uri 를 많이 만드는 것은 좋지 않다. 만들고자 하면 만들어도 되지만 필요 이상의 것을 만들지 말자.

/user/:userId/parent/mother/parent 이런 경우에는 해당 사용자의 부모 중의 모계의 부모를 찾아가는 식으로 uri 가 구성된다. 이 경우에도 리스트 즉 어떤 곳에 속하는 다수의 데이터의 경우이다. 이 경우에도 parent 에 해당하는 :id 값이 있다면 :id 로만 찾을 수도 있다.

정리해보면 어떤 곳에 속하는 리스트 (다수의 데이터) 를 가져올 때는 hierarchical 하게 되고 hierarchical 한 것은 uri 에 들어가면 된다. ? 뒤에 오는 쿼리에는 limit 이나 skip, 가져올 필드 등의 해당 리소스에 대한 쿼리 옵션들이 들어가는 게 좋다. :id 로 특정 하위 리소스도 가져올 수 있다면 그것만으로 attachment/:id 형식으로 구성해도 가능은 하지만 만약 이것이 필요 이상의 uri 를 만들게 된다면 그냥 user/:userId/message/:messageId/attachment/:id 하나만 두고 사용하는게 좋다. 필요 이상의 uri 는 만들지 말자. 하지만 이럴 경우에는 userId, messageId, attachmentId 모두를 알아야 한다는 조건이 있다.

? 뒤에 오는 쿼리의 경우 자신에게 맞게 하면 된다. 몽고 디비를 사용한다면 몽고 디비 라이브러리 몽구즈를 사용한다면 몽구즈의 find 에 들어갈 쿼리를 {type: ”, category: ”} 이런 식으로 형식을 갖추어 JSON.parse 해도 되며 여러가지 방식들을 사용할 수 있다. 쿼리 옵션은 hierarchical 한 것이 아니라면 구성하기 나름이다. 해당 리소스에 대한 query 임을 생각하면 된다.

Advertisements