개발 Q&A

제목 RESTful API 재귀트리형 리소스 질문입니다.
글쓴이 지훈임돠 작성시각 2014/09/05 17:27:10
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 14866   RSS

가급적 Restful 하게 API 를 만들려고 하고 있습니다. 재귀트리형 리소스(용어가 적당한지 모르겠네요@@ 깊이있는 메뉴같은걸 생각하시면 편할 듯싶습니다.)는 보통 어떤식으로 구현하는지 궁금해서 여쭤봅니다. 제가 구현하려는 상태는 다음과 같습니다.

목록형 리소스는 
GET items - 목록(query 로 페이징)
GET items/ID - 디테일
POST items - 새 노드 생성
PUT items/ID - 특정 노드 업데이트
DELETE items/ID - 특정 노드 삭제

재귀트리형 리소스는
GET items - 목록(query 로 깊이조절)
GET items/ID - 디테일
GET items/ID/items - 특정 노드 후손 아이템(query 로 깊이조절)
POST items - 새 노드 생성(부모값 없으면 최상단)
PUT items/ID - 특정 노드 업데이트
DELETE items/ID - 특정 노드 및 자식 노드 삭제

특히 궁금한 부분은 GET items 의 역할을 이런식으로 나눠도 될지가 궁금하고, 혹시 다른방법도 있는지 궁금합니다.

 다음글 나눔고딕 사용하시는 분들은 사용 중 이상 없으신가요?
 이전글 jqGrid 셀렉트 박스 질문 입니다!!! (1)

댓글

darkninja / 2014/09/05 22:22:18 / 추천 0
https://github.com/olimortimer/ci-nested-sets
유일하게 ci 에서 참고할수 있는 자료인데
이건 다 아실것이고...

json 데이타를 트리에 뿌려주는건 js tree 가 여러종류 있어서 문제가 안되는데
db 입출력에서 문제가 생기더군요!
검색을 해봐도 그놈이 그놈이고
자료가 많아지면 db 입출력에 상당한 부하가 걸릴것인데

입출력을 우선 할것인지
검색을 우선 할것인지에 따라 자신만의 알고리즘을 개발하여
...초보가 뭔 말을 하는것인지...

상당히 흥미있는 주제인데 항상 시간이 충분치 않으니
어떤 답변이 달릴지 기대됩니다 ㅋ
 
앤드그리고 / 2014/09/08 11:39:02 / 추천 0
저도 비슷한 구조로 서비스를 만들고 있습니다.
(api 는 node.js, 웹사이트는 php 로 구현 중인데, endpoint만 보자면 질문하신님과 거의 비슷한 구조로 하고 있습니다.)

GET items/ID/items - 특정 노드 후손 아이템(query 로 깊이조절)

다만, 이 부분에서 부모/자식 노드가 같은 타입(?) 일 경우에는
GET items/ID
이렇게 하나로 사용하고 있고,

부모/자식 노드가 다른 타입 일 경우에는
GET item/ID/item2/ID
형태로 사용하고 있습니다.

 
지훈임돠 / 2014/09/11 09:15:30 / 추천 0
@조영운

저도 조영운님과 비슷하게 사용하고 있습니다.
제가 GET items/ID/items 는 후손 목록임을 누락하여 적었네요.

URI 유일성을 유지하는게 좋다고 생각해서
GET items/ID  나 GET items/ID/items/ID 둘중 하나만 사용합니다 ㅎㅎ

재귀트리형 리소스는 GET items 를 어떻게 디자인 하시나요?
지훈임돠 / 2014/09/11 09:18:37 / 추천 0
@다크닌자

DB 구조 부분이 고민이 되신다면 아래의 링크를 한번 참조하시는 것도 좋을꺼같습니다^^
http://blog.insightbook.co.kr/wp-content/uploads/1/cfile1.uf.14665F334E3A4EC10D9C25.pdf
앤드그리고 / 2014/09/11 12:51:34 / 추천 0
작업중인 서비스에 재귀트리형(? 부모-자식 댓글 정도로 생각하면 맞을까요?) 구조가 없기 때문에 깊이 생각해보지 않았지만,
아마 현재 서비스에 적용을 해야 한다면

URI 는 위에 적은대로
GET items/ID
로만 사용하고,
부모-자식 관계는 서버에서 처리하되,
클라이언트에서 부모자식 관계 정보가 필요하다면,
API 결과에 부모 정보를 포함 시킬 듯 합니다.

=====

"댓글" 라는 리소스를 예로 들면
댓글 A
  댓글 A-a
  댓글 A-b
댓글 B
이렇게 있다면

API example
/post/1/comments
{
  id: 1,
  comment: "댓글 A"
},
{
  id: 2,
  comment: "댓글 B"
},
{
  id: 3,
  parent_id: 1,
  comment: "댓글 A-a",
},
{
  id: 4,
  parent_id: 1,
  comment: "댓글 A-b",
}


이런식으로 응답 데이터를 구성하고,
데이터를 화면에 뿌리는 작업은 별도로 처리 하도록 할 듯 합니다.

 
지훈임돠 / 2014/09/11 14:52:48 / 추천 0
답변 감사드립니다. 일단은 http://jimliu.github.io/angular-ui-tree/ 여기에 나오는 형식처럼 해두었는데,
목록형과 트리형의 응답데이터 형태가 완전히 달라서 고민인데,
말씀하신 방법으로 하면 API 는 일관성있게 나오겠네요.
감사합니다. 고민좀 해봐야겠네요.

 
darkninja / 2014/09/13 07:49:17 / 추천 0
@ 지훈임돠
감사합니다.
다운받아서 보니 제대로 보이네요.