HTTP API 설계 예시

     

    회원 관리 시스템의 API 설계 → POST 기반으로 설계한다면? 

    • 회원 목록 /members → GET
    • 회원 등록 /members →  POST
    • 회원 조회 /members/{id} → GET
    • 회원 수정 /members/{id} → PATCH, PUT, POST
    • 회원 삭제 /members/{id} → DELETE

    앞서 이야기 한 것처럼 URI는 '리소스'만 식별하도록 한다. 행위를 식별하는 것은 최대한 메서드로 구현한다. 

    • 회원 목록 : 조회했을 때 필터나 정렬은 쿼리 파라미터로 해주면 됨 → GET 사용
    • 회원 등록 : /members에 POST로 넣으면 회원이 등록되는 것으로 설계한다. → POST 사용
    • 회원 조회 : URI를 계층 구조로 만들고, 조회 시 /members + 식별자를 쓴다 → GET
    • 회원 삭제 : /members + 식별자를 쓴다 → DELTE
    • 회원 수정 : 고민이 필요함(Put / Patch / Post)
      → Put은 덮어쓰기다.Patch는 부분수정이다. 기본적으로 데이터 수정은 Patch를 쓰는 것이 좋다. Put으로 데이터를 수정하려면, 회원의 모든 정보를 넣어서 보내야하는데 그러면 낭비기 때문이다. 만약에 Patch가 애매하다면, Post로 수정하는게 좋다.

     

    POST - 신규 자원 등록 특징

    • 클라이언트는 등록될 리소스의 URI를 모름
      • 회원 등록 /members → POST로 구현. 식별자 넣지 않음. 
      • POST /members 하고 만다. 
    • POST로 등록하면, 서버가 새로 등록될 리소스의 URI를 결정한다. 
      • HTTP/1.1 201 Created
      • Location: /members/100
    • 컬렉션(Collection) 
      • 컬렉션은 서버가 관리하는 리소스 디렉토리.
      • 컬렉션은 서버가 리소스의 URI를 생성하고 관리한다.
      • 여기서 컬렉션은 /members 임. 

     

    파일 관리 시스템의 API 설계, PUT 기반 등록으로 설계한다면? 

    • 파일 목록 /files → GET
    • 파일 조회 /files/{filename} → GET
    • 파일 등록 /files/{filename} → PUT
    • 파일 삭제 /files/{filename} → DELETE
    • 파일 대량 등록 /files → POST

    파일 등록을 할 때는 PUT을 쓴다. PUT을 쓰는 이유는 크게 두 가지가 있다.

    • 클라이언트가 업로드 할 파일 이름(URI)를 알고 있기 때문이다.
    • 파일은 항상 덮어쓴다. 이와 비슷한 성질은 PUT 메서드다.

     

    PUT - 신규 자원 등록할 때 특징

    • 클라이언트가 리소스 URI를 결정한다.
      • 파일 등록 /files/{filename} → PUT
      • PUT /files/star.jpg
    • 스토어(Store)
      • 클라이언트가 업로드 할 파일의 URI를 관리하는 리소스 저장소
      • 클라이언트가 리소스의 URI을 알고 관리한다.
      • /files는 스토어다.

     

    Collection은 POST 메서드로 자료를 관리하는 리소스 저장소며, 이 때 URI는 서버에서 지정을 해준다. 반면 Store는 PUT 메서드로 자료를 관리하는 리소스 저장소이며, URI는 클라이언트가 직접 지정한다. 대부분 Collection 타입의 저장소를 많이 쓴다고 한다. 

     

    HTML FORM 사용 (HTTP API 설계)

    • HTML FORM은 GET, POST 메서드만 지원함. 
    • 이 외의 메서드가 필요할 경우 AJX 같은 기술 사용으로 해결 가능 → 회원 API 참고
    • 순수 HTML FORM은 GET, POST만 지원한다. 
    • 회원 목록 /members → GET
    • 회원 등록 폼 /members/new → GET
    • 회원 등록 /members/new , /members → POST
    • 회원 조회 /members/{id} → POST
    • 회원 수정 폼 /members/{id}/edit → GET
    • 회원 수정 /members/{id}/edit, /members/{id} → POST
    • 회원 삭제 /members/{id}/delete → POST

    위의 정보를 바탕으로 HTTP FORM의 HTTP API 설계를 다시 한번 정리해보겠다.

    • 회원 등록 버튼을 누르면 URI 링크를 타고 /members/new로 들어감. 이 링크로 들어가면 회원등록폼이 나옴. 여기 링크로 들어가면 '회원등록폼'이 나옴.
    • 회원등록폼에는 '폼태그'가 나오는데, 이곳에 회원 정보가 등록된다. 
    • '회원 등록 버튼'을 누르면 '폼태그'에 적힌 정보가 POST로 넘어간다. 이 때는 /member/new, /members 두 개의 URI에서 회원 등록을 선택할 수 있음. 
    • /members/new로 하면 회원 등록 폼과 동일한 URI를 사용한다. 메서드 GET, POST를 사용해서 회원 등록폼 조회, 회원 등록을 나누는 것이 가능함. 또 다른 방법으로는 Collection  관리처럼 /members URI에 POST를 넘기는 방법도 가능함.
    • 회원 수정 폼 자체를 조회하는 것은 GET이다. 따라서 edit로 들어가더라도 GET으로 회원 수정 폼을 가지고 와야하고, 실제로 회원 수정폼을 가지고 와서 거기에 적힌 데이터를 보내는 시점에 POST를 보내야한다. 
    • 회원 삭제는 현재 상태에서는 Delete 라는 메서드를 못 쓰기 때문에 /delete라고 컨트롤 URI를 하나 만들어줘야한다. 

    HTTP를 이용한 API를 설계할 때는 가장 기본적으로 1. 리소스 식별을 하기 위해서 API의 URI를 잘 짜둔 후, 2. 행위를 메서드로 식별하는 방법으로 접근한다. 그렇지만 특정한 경우에는 그렇게 대응이 안될 수 있다. 이럴 때는 Control URI라는 것을 만들어 해결한다. Control URI는 URI에 이 객체가 어떤 행위를 할 것인지 잘 알려주는 것을 작성하도록 한다. 

     

    • 참고하면 좋은 URI 설계 개념
    • 문서(document)
      • 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 row)
      • 예) /members/100, /files/star.jpg
    • 컬렉션(collection)
      • 서버가 관리하는 리소스 디렉터리
      • 서버가 리소스의 URI를 생성하고 관리
      • 예) /members
    • 스토어(store)
      • 클라이언트가 관리하는 자원 저장소
      • 클라이언트가 리소스의 URI를 알고 관리한다.
      • 예) /files
    • 컨트롤러(controller), 컨트롤 URI
      • 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행한다.
      • URI명에 동사를 직접 사용한다.
      • 예) /members/{id}/delete 형식으로 사용. 

     

    좋은 예시

    https://restfulapi.net/resource-naming

    'CS > 네트워크' 카테고리의 다른 글

    멀티미디어 네트워크  (0) 2022.05.15
    링크 계층 : 무선 영역  (0) 2022.05.15
    HTTP 메서드 활용  (0) 2021.12.06
    HTTP 상태 코드 정리  (0) 2021.12.04
    HTTP 메서드 관련 정리  (0) 2021.12.04

    댓글

    Designed by JB FACTORY