Deep Dive into RESTful API - 2

HyoKwangRyu·2020년 5월 1일
2
post-thumbnail

'many to many' 관계를 끊어주는 엔드포인트?

이전 포스팅의 요구사항 중,
'편집모드에서 한번에 여러 채팅방을 삭제할 수 있어야 한다.'
가 있었습니다.

정확히는 '유저의 특정 채팅그룹 내의 채팅방 삭제'입니다.

이번 엔드포인트는
Chat 레코드를 삭제하는것이 아니라, ChatGroup - Chat의 관계를 끊어줘야 해요😅

결국 채팅방을 삭제하는 것이기 때문에 DELETE 메소드를 사용하려 했습니다.
그렇다면 어떤 리소스를 다룰 것이냐? chats가 되겠죠?

DELETE /api/v1/user/chat-groups/:chat_group_id/chats
처음 생각한 엔드포인트 입니다.
괜찮다고 생각했어요.

chat_group.chats.delete(chat)
위 처럼 Association을 해제해 주는 메소드도 이미 존재 하고 있었기 때문에, 잘 어울린다고 생각했어요!

이것으로 결정하고 넘어가도 좋았을것을.. 또 생각에 빠져버립니다..

  1. DELETE메소드를 썼기때문에 레코드가 삭제될 거라고 생각할 수 있지 않을까?
  2. 엔드포인트 사용자가 destroy dependent에 대해 모르고 있다면?
  3. 한번에 여러 채팅방을 삭제해야 하는데?

점점 생각이 많아지기 시작했어요😭

chats가 완전히 chat_groups에 종속된 1 : N 이었다면 DELETE를 사용해도 괜찮았을것 같은데, 다대다 관계이기 때문에 그렇게 하지 못했습니다.
레코드의 업데이트에 관해서는 chats, chat_groups모두를 각자 독립적인 리소스로 다루는게 나중에 더 편할 것 같았어요.

chat_group_chats라는 조인테이블이 있으니 이 리소스로 엔드포인트를 만들어 레코드를 삭제해 관계를 끊어주는것은 어떨까? 생각했지만 바로 접었습니다..

최종적으로 nested한 리소스에 collection으로 새로운 액션을 열어주기로 했어요🤪

namespace :user do
  resources :chat_groups, path: 'chat-groups', only: [:index, :update] do
    resources :chats, only: [], controller: 'chat_groups/chats' do
      post 'remove', on: :collection
      post 'add', on: :collection
    end
  end
end

1. POST /api/v1/user/chat-groups/:chat_group_id/chats/remove
2. POST /api/v1/user/chat-groups/:chat_group_id/chats/add

이런 형태로 채팅그룹에서 채팅들 삭제하기/추가하기 를 완성했습니다 !
(아직도 어떤게 더 좋을지 잘 모르겠어요😂)
이 엔드포인트를 사용하실 다른 클라이언트 개발자 분들이 의미를 잘 파악하실 수 있다면 좋겠네요,,

api/v1/user/chats

위에서 만들었던 '채팅그룹의 채팅 삭제' 엔드포인트와 비슷하면서 다른 기능을 수행하는 엔드포인트 입니다.

카톡이랑 비교하자면,
친구목록 - 채팅 그룹
채팅목록 - 내 채팅 목록
정도로 이해해 주시면 될 것 같아요.

자소설닷컴에서는 채팅방에 참여할 경우 '내 채팅'리스트에 채팅방이 추가 되고, 채팅방에서 '나가기'를 하면 리스트에서 사라집니다.

이젠 에디팅 모드에서 한번에 여러 채팅방을 나갈 수 있도록 해야해요!

namespace :user do
  resources :chats, only: [:index] do
    post 'leave', on: :collection
  end
end

POST /api/v1/user/chats/leave
로 결정했습니다. 첫 부분의 엔드포인트와 유사한 생각으로 만들었어요.
다만 chat-groups가 빠지게 되었습니다.

remove가 아니라 leave인 이유는 채팅그룹에서는 채팅방이 삭제되는 느낌이고, 여기서는 '나가기'의 느낌이 좀 더 강해서 입니다.
너무 느낌으로 만들었을까요.,😅

정리

이전 포스팅 부터 지금까지 RESTful API를 좀더 깊게? 생각해보면서 만들어 봤는데, 다른분들은 어떻게 생각하실지 궁금하네요ㅎㅎ
갑자기 힘이 빠져서 글을 대충 마무리하고 있네요..
다음에는 이 엔드포인트들을 이용해 iOS 클라이언트를 개발하면서 겪었던 이슈들을 공유해 볼게요🏃🏻‍♂️

profile
Backend Developer

0개의 댓글