Collection Pattern

Collection Pattern

-> 통상적으로 RESTFUL 이라는 기준이 된다. -> Collection : 서버가 관리하는 리소스 디렉토리

대부분의 경우, 여러 리소스를 하나의 그룹으로 묶을 수 있다. 예를 들어 게시물의 경우, 100개의 게시물을 하나의 게시물 그룹으로 묶어서 표현하는 게 훨씬 유용하다.

Collection Pattern을 쓰지 않는 경우:

  • /the-first-post

  • /test-post

Collection Pattern을 쓰는 경우:

  • /posts ⇒ 모든 게시물을 하나의 URI로 표현(게시물 목록으로도 활용 가능). 일반적으로 복수형을 사용한다.

  • /posts/the-first

  • /posts/test

  • /posts/{id} 또는 /posts/:id 등으로 일반적인 형태로 쓸 수 있다. 여기서 {id}를 {post_id}나 {postId} 등으로 표기할 수도 있다. 여기서는 그냥 Post ID라고 부를 예정.

리소스의 ID 는 URI 전체가 되는 것이다. -> Post ID{id}가 리소스의 ID 가 될 수는 없다..!

  • Resource ID = URI = URL

  • Post ID = Resource ID를 구성하는 요소 중 하나. posts 그룹 내 식별자(ID).

그룹명은 복수형으로 사용!!

  • /posts/1 ⇒ 복수형으로 그룹명을 지정하고, 그 아래에서 개별 아이템을 지정.

  • /post/1 ⇒ 흔히 하는 실수.

특정 게시물에 댓글이 달리는 상황이라면, 디렉터리처럼 구성할 수 있다.

  • [/posts/{post_id}][/comments] ⇒ Collection

    • [/comments][?post_id={post_id}] 형태로 써줘도 된다. 이렇게 쓰면 Post ID를 이용해 필터링한다는 의미가 됨. URI에서 드러나는 의미는 미묘하게 다르지만, 구현하는 코드나 결과는 사실상 동일하다.

  • [/posts/{post_id}][/comments/{id}] ⇒ Element. 여기서 {id}는 {comment_id}를 의미함.

    • [/comments/{id}] 형태로 간단히 구성해도 된다. 이렇게 할 경우, URI만 봐서는 어떤 게시물에 대한 댓글인지 알 수 없다. => 댓글 삭제 등 간단한 작업 요청 상황이라면 오히려 좋을 수도 있다.

특정 게시물을 고치는 페이지를 표현하고 싶다면, 마찬가지로 구성할 수 있다.

  • [/posts/{id}][/edit] ⇒ “Edit Page”라는 리소스.

    • 마찬가지로 /edit?post_id={post_id} 형태로 써줄 수도 있다. 다만, /comments/{id}/edit 같은 게 도입될 경우 /edit?comment_id={comment_id} 같이 구분해서 처리하는 것이 더 복잡할 수 있다.

    • REST API(B/E)의 경우, 페이지만 표현할 일은 거의 없다. 이런 표현은 F/E에 맡기고, 그냥 /items, /items/{id} 같은 URL만 쓰도록 제약해도 무방하다. -> REST API 서버를 만드는데, 컬렉션/엘리먼트 이상의 구조를 만들게 된다면 뭔가 RESTFUL 하지 못하다는 반증일 수 있다!!

그룹이 아닌 경우라면 그냥 단수형을 써도 된다.

  • /session ⇒ 세션은 하나만 유지된다. 다른 세션을 참고할 일도 없다. /sessions/1 같은 접속이 있으면 안 된다.

  • /edit?blahblah ⇒ 위에서 언급한 케이스.

    • 만약 편집 페이지의 유형을 Edit ID 따위로 표현하고 싶다면, /edits/post, /edits/comment 같이 컬렉션 패턴과 복수형을 사용할 수 있다.

    • 하지만 이렇게 하고 싶다면 edit보다는 그냥 page란 리소스를 사용하는 걸 추천. Page란 리소스, 그리고 Page ID란 모양이 훨씬 명확하다. 이렇게 하면 /pages/edit-post, /pages/edit-comment 같이 훨씬 자연스럽게 표현할 수 있게 된다.

Last updated