[HTTP] HTTP API를 설계하는 방법

woply·2022년 1월 26일
0

TIL(Today I Learn)

목록 보기
31/31

📖 ✏️

  1. TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.
  2. 그 외 시리즈에 작성된 공유 목적의 포스팅은 시간이 날 때마다 별도로 작성하고 있습니다. 주로, TIL 시리즈에 작성된 내용에서 특정 주제를 선정하고, 더 깊이 공부한 후 정리하여 작성합니다.

HTTP API를 설계하는 방법

회원 조회 / 등록 / 수정 / 삭제 기능을 API로 구현할 때, 많은 사람이 아래와 같은 방식으로 URI를 설계한다.

  • 조회: /read-member/{id}
  • 등록: /create-member/{id}
  • 수정: /update-member/{id}
  • 삭제: /delete-member/{id}

결론적으로 이와 같은 API는 바람직하지 못하다. HTTP API 설계에 핵심은 리소스 식별이다.
URI(Uniform Resource Identifier)의 본래 의미가 리소스 식별이라는 것을 잊지 말아야 한다.

리소스는 read, create, update, delete와 같이 기능적 행위를 의미하지 않는다. member(회원)라는 기능의 개념적 주체가 리소스다. 따라서, 올바른 API 설계라면 리소스 식별을 기본 전제로 한다.

리소스에 초점을 맞춰 위 API를 수정해보자. 아래와 같이 설계할 수 있다.

  • 조회: /members/{id}
  • 등록: /members/{id}
  • 수정: /members/{id}
  • 삭제: /members/{id}

리소스가 직관적으로 API 설계를 변경했지만, 한 가지 문제점이 보인다. 조회 / 등록 / 수정 / 삭제라는 기능이 구분되지 않는다는 점이다. API의 리소스를 처리하는 기능적 의미는 HTTP 메서드를 통해 구분할 수 있다.

HTTP 메서드를 이용하여 리소스 중심의 바람직한 설계 예시를 살펴보자.


1. HTTP API의 3가지 종류

HTTP API 설계는 크게 3가지 경우로 나눠진다. POST를 기반으로 등록하는 컬렉션, PUT을 기반으로 등록하는 스토어, 그리고 GET, POST만 지원하는 HTML FORM 사용하는 경우다.

  • HTTP API - 컬렉션

    • POST 기반 등록
    • 예) 회원 관리 API 제공
  • HTTP API - 스토어

    • PUT 기반 등록
    • 예) 정적 컨텐츠 관리, 원격 파일 관리
  • HTML FORM 사용

    • 웹 페이지 회원 관리
    • GET, POST만 지원

회원 관리 시스템과 파일 관리 시스템을 예시로 각각의 방식이 어떻게 사용되며, 차이는 무엇인지 알아보자.


2. HTTP API 설계 예시 - 회원 관리 시스템

POST 기반으로 회원 데이터가 등록되는 경우다. POST 등록 방식의 특징은 클라이언트가 등록될 리소스의 URI를 모른다는 점이다. 따라서, 서버가 새로 등록된 리소스 URI를 생성해줘야 한다. 이러한 방식을 컬렉션(Collection)이라고 한다.

  • 회원 목록: /members -> GET

    • members의 데이터를 조회한다.
    • 회원의 검색어, 정렬 조건 등은 쿼리 파라미터를 사용하여 설계한다.
  • 회원 등록: /members -> POST

    • 컬렉션(/members)에 POST 방식으로 데이터를 전송하면, 회원 등록 로직이 처리된다.
  • 회원 조회: /members/{id} -> GET

    • 컬렉션 하위에 회원 id를 넣는 방식으로 GET 메서드를 이용한다.
  • 회원 수정: /members/{id} -> PATCH, PUT, POST

    • 일반적인 경우 부분 수정을 의미하기 때문에 PATCH를 주로 사용한다.
    • 클라이언트에서 서버로 보내는 내용이 완전히 덮어 써도 무관하다면 PUT을 사용할 수 있다. 그러나 이러한 경우는 드물다.
    • 회원 정보가 아닌, 게시글 수정의 경우 PUT을 사용하는 경우가 더 많다.
    • PATCH와 PUT 사용이 애매한 경우, POST를 고려한다.
  • 회원 삭제: /members/{id} -> DELETE

    • 컬렉션 하위에 특정 아이디를 넣어 DELETE 메서드를 사용한다.

POST 기반의 컬렉션 특징

참고: 여기서 컬렉션은 /members을 의미한다.

1. 클라이언트는 등록될 리소스의 URI를 모른다.

  • 회원 등록 /members -> POST
  • POST /members

2. 서버가 새로 등록된 리소스 URI를 생성해준다.

  • POST 방식으로 등록할 때는 서버에서 보통 리소스 URI를 결정하고 만들어 준다.
  • HTTP/1.1 201 Created
    Location: /members/100

3. HTTP API 설계 예시 - 파일 관리 시스템

PUT 방식으로 데이터가 등록되는 경우다. PUT 등록 방식의 특징은 클라이언트가 리소스 URI를 직접 지정한다. 따라서, 클라이언트는 리소스 URI를 알고 있어야 한다. 이러한 방식을 스토어(Store)라고 한다.

원격 저장소의 파일을 관리하는 시스템을 가정해 보자. 클라이언트는 원격 저장소에 파일을 전송하거나 조회할 수 있다.

  • 파일 목록: /files -> GET
    • 전체 파일 목록을 조회한다.
  • 파일 조회: /files/{filename} -> GET
    • 특정 파일 조회 한다.
    • 클라이언트가 파일명이 들어간 URI를 직접 지정한다.
  • 파일 등록: /files/{filename} -> PUT
    • 클라이언트가 파일 이름을 알고 있기 때문에 하위 컬렉션을 생성한다.
    • 파일은 없으면 생성하고 있으면 덮어쓴다.
  • 파일 삭제: /files/{filename} -> DELETE
    • 특정 파일을 삭제한다.
  • 파일 대량 등록: /files -> POST
    • 파일 등록은 PUT으로 충분하다. 따라서, /files에 있는 POST의 의미를 임의로 변경하여 사용할 수 있다.
    • Ex) 대량 파일 등록

PUT 기반의 스토어 특징

참고: 여기서 스토어는 /files를 의미한다.

1. 클라이언트가 리소스 URI를 알고 있어야 한다.

  • 파일 등록 /files/{filename} -> PUT
  • Ex) PUT /files/star.jpg

2. 클라이언트가 직접 리소스의 URI를 지정한다.

  • 클라이언트가 리소스를 알고 있어야 한다.

POST와 PUT의 근본적인 차이
POST는 클라이언트가 서버에 요청하면, 서버가 리소스를 만든다. 반대로 PUT은 클라이언트가 리소스를 알고 있다. 서버는 요청 내용대로 처리만 한다.

참고: 대부분 POST 기반을 많이 사용한다. PUT은 사용 비중은 낮다.


4. HTML FORM을 사용하는 경우

HTML FORM은 GET, POST만 지원한다. 물론, AJAX 같은 기술을 사용해서 제약을 해결할 수 있다. 순수 HTML과 HTML FORM 사용을 전제할 경우 GET, POST만 지원하므로 제약이 있다. 이런 상황에서 어떻게 설계할 수 있는지 살펴보자.

  • 회원 목록

    • /members -> GET
  • 회원 등록 폼

    • /members/new -> GET
  • 회원 등록

    • /members/new, /members -> POST
    • 등록 폼과 URI를 맞춰주는 방법을 쓰거나, /members만 사용하기도 한다.

      참고: 등록 폼과 URI를 맞춰주는 방법을 권장한다. 그래야저장 과정에서 에러가 발생했을 때 경로 변경이 발생하지 않는다.

  • 회원 조회

    • /members/{id} -> GET
  • 회원 수정 폼

    • /members/{id}/edit -> GET
    • 수정 폼 자체는 변경이 발생하지 않는다. 조회 목적의 GET을 사용한다.
  • 회원 수정

    • /members/{id}/edit, /members/{id} -> POST
    • 등록과 마찬가지로 수정과 동일한 URI를 사용하거나, 아이디만 추가하여 POST를 사용한다. 마찬가지로 URI를 맞춰주는 것을 권장한다.
  • 회원 삭제

    • /members/{id}/delete -> POST
    • POST만 사용할 수 있는 상황에서는 /delete 컨트롤 URI를 붙여줘야 한다.

컨트롤 URI란?
HTML FORM은 GET, POST만 지원하므로 제약이 발생한다. 이를 해결하기 위해 동사로 된 리소스 경로를 추가하여 사용한다. 리소스를 조작한다는 의도를 담을 수 있다. POST의 /new, /edit, /delete가 대표적인 컨트롤 URI다.

컨트롤 URI는 PUT DELETE PETCH 등을 사용할 수 없는 제약에 의해 생겨났다. HTTP 메서드로 해결하기 애매한 경우 사용(HTTP API 포함)하면 좋다. 리소스라는 개념으로 최대한 URI 설계를 하되, 제한되는 상황이 발생할 경우 대체제로 사용한다.

참고하면 좋은 URI 설계 개념

  • 문서(document)
    • 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 row)
    • Ex) /members/100, /files/star.jpg
  • 컬렉션(collection)
    • 서버가 관리하는 리소스 디렉터리
    • 서버가 리소스의 URI를 생성하고 관리
    • Ex) /members
  • 스토어(store)
    • 클라이언트가 관리하는 자원 저장소
    • 클라이언트가 리소스의 URI를 알고 관리
    • Ex) /files
  • 컨트롤러(controller), 컨트롤 URI
    • 모든 상황이 이상적으로 딱 맞아 떨어지지 않는다. 그래서 사용한다
    • 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행
    • 동사를 직접 사용
    • Ex) /members/{id}/delete
profile
7년간 마케터로 일했고, 현재는 헤렌에서 백엔드 개발자로 일하고 있습니다. 고객 가치를 설계하는 개발자를 지향하며, 개발, 독서, 글쓰기를 좋아합니다. 업이 심오한 놀이이길 바라는 덕업일치 주의자입니다.

0개의 댓글