728x90
API URI 설계
- API URI 설계에 있어서 가장 중요한 것은 리소스 식별이다.
- 리소스는 회원을 등록하고 수정하고 조회하는게 리소스가 아니다.
- 예) '미네랄을 캐라' 명령어에서 미네랄 그 자체가 리소스다.
- 그러므로 회원 가입, 회원 조회 등등 모두 회원 그 자체가 리소스다.
- 리소스를 URI에 매핑해야 한다.
🔍 리소스 식별, URI 계층 구조 활용
- 회원 목록 조회 : /members
- 회원 조회 : /members/{id}
- 회원 등록 : /members/{id}
- 회원 수정 : /members/{id}
- 회원 삭제 : /members/{id}
참고로 계층 구조상 상위를 컬렉션으로 보고 복수단어 사용을 권장한다.
예) member → members
리소스를 식별하고 URI 계층 구조로 나눴으나 조회, 등록, 수정, 삭제에 대해서 구별할 수가 없다.
그럴 때는 리소스를 대상으로 행위를 분리해야 한다.
🔍 리소스와 행위 분리
- 리소스 : 회원
- 행위 : 조회 / 등록 / 삭제 / 변경
- 행위는 HTTP 메서드다.
HTTP 메서드
🔍 HTTP 메서드 종류
💡 주요 메서드
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스 부분 변경
- DELETE : 리소스 삭제
💡 기타 메서드
- HEAD : get과 동일하지만 메시지 부분을 제외하고, 상대 줄과 헤더만 반환
- OPTIONS : 대상 리로스에 대한 통신 가능 옵션(메서드)을 주로 설명 (주로 CORS에서 사용)
- CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
- TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
🔍 GET
- 리소스 조회
- 서버에 전달하고 싶은 데이터를 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달한다.
- 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다.
💡 GET 동작 방식
① 리소스 조회 - 메시지 전달
② 리소스 조회 - 서버 도착
③ 리소스 조회 - 응답 데이터
🔍 POST
- 요청 데이터 처리
- 클라이언트가 서버로 메시지 바디를 통해 요청 데이터를 전달한다.
- 서버는 요청 데이터를 처리한다.
- 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.
- 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용한다.
💡 POST 동작 방식
① 리소스 등록 - 메시지 전달
② 리소스 등록 - 신규 리소스 생성
③ 리소스 등록 - 응답 데이터
💡 POST의 요청 데이터 처리
- 스펙 : POST 메서드는 대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청한다.
- HTML 양식에 입력된 필드와 같은 데이터 블록을 데이터 처리 프로세스에 제공한다.
- 예) HTML FORM에 입력한 정보로 회원 가입, 주문 등에서 사용
- 게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시
- 예) 게시판 글쓰기, 댓글 달기
- 서버가 아직 식별하지 않은 새 리소스 생성
- 예) 신규 주문 생성
- 기존 자원에 데이터 추가
- 예) 한 문서 끝에 내용 추가하기
정리 : 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스 마다 따로 정해줘야 한다.
→ 정해진 것이 없고, 모든 요청을 마음대로 할 수 있다는 뜻!
💡 POST 기능
- 새 리소스 생성(등록)
- 서버가 아직 식별하지 않은 새 리소스 생성
- 요청 데이터 처리
- 단순히 데이터를 생성하거나, 변경하는 것을 넘어서 프로세스를 처리해야 하는 경우
- 예) 주문에서 결제 완료 → 배달 시작 → 배달 완료 처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우
- POST의 결과로 새로운 리소스가 생성되지 않을 수도 있다.
- 예) POST/orders/{orderId}/start-delicery (컨트롤 URI)
- 되도록 URI에는 리소스만 식별하도록 해야하지만, 100퍼센트 그렇게 설계하는 것은 불가능하다.
- 다른 메서드로 처리하기 애매한 경우
- 예) JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우
- 애매하면 POST를 사용할 것
🔍 PUT
- 리소스를 대체한다.
- 리소스가 있으면 대체한다.
- 리소스가 없으면 새로 생성한다.
- 쉽게 이야기해서 기존의 것을 덮어버린다.
- 클라이언트가 리소스를 식별한다.
- 클라이언트가 리소스 위치를 알고 URI를 지정한다.
- POST와 차이점이다. (POST는 클라이언트가 리소스 위치를 알지 못한다.)
💡 PUT 동작 방식 (리소스가 있는 경우)
💡 PUT 동작 방식 (리소스가 없는 경우)
💡 PUT은 리소스를 완전히 대체한다.
🔍 PATCH
- 리소스 부분을 변경한다.
- 한마디로 전체 변경이 아닌 해당하는 부분만 변경이다.
💡 PATCH 동작 방식 - 리소스 부분 변경
🔍 DELETE
- 리소스 제거
💡 DELETE 동작 방식 - 리소스 제거
HTTP 메서드 속성
- 메서드 속성으로 3가지가 있다.
- 안전 (Safe Methods)
- 멱등 (Idempotent Methods)
- 캐시 가능 (Cacheable Methods)
🔍 안전 (Safe)
- 호출해도 리소스가 변경하지 않아야 안전한 것이다.
- 안전 조건은 호출시 해당 리소스가 변하냐 변하지 않냐 이다.
- get 방식이 안전하다.
🔍 멱등 (Idempotent
- 한 번 호출하든 두 번 호출하든 100번 호출 하든 결과가 똑같아야 멱등이다.
- f(f(x)) = f(x)
- 멱등 메서드
- GET : 여러 번 조회해도 같은 결과가 조회된다.
- PUT : 결과를 대체한다. 따라서 같은 요청을 여러번 해도 최종 결과는 같다.
- DELETE : 결과를 삭제한다. 따라서 같은 요청을 여러 번 해도 삭제된 결과는 같다.
POST는 멱등이 아니다. 두 번 호출 하면 같은 결제가 중복해서 발생할 수 있기에 같은 결과가 나오지 않는다.
💡 멱등 활용
- 자동 복구 메커니즘
- 서버가 TIMEOUT 등으로 정상 응답을 못 주었을 때, 클라이언트가 같은 요청을 다시 해도 되는지 판단의 근거를 제공한다.
💡 멱등은 외부 요인을 고려하지 않는다.
- 예시
- 사용자 1 : GET → username : A, age : 20
- 사용자 2 : PUT → username: A, age: 30
- 사용자 1 : GET → username: A, age : 30 (사용자2의 영향으로 바뀐 데이터가 조회된다.)
- 이처럼 멱등은 외부 요인으로 중간에 리소스가 변경되는 것까지 고려하지 않는다. 그러므로 GET은 멱등 메서드다.
🔍 캐시 가능 (Cacheable)
- GET / HEAD / POST / PATCH 는 캐시 가능하다.
- 실제로 GET / HEAD 정도만 캐시로 사용한다.
- POST / PATCH는 본문 내용까지 캐시 키로 고려해야 하기에 구현이 쉽지 않아서 잘 안쓰인다.
💡 캐시란
- 캐싱은 애플리케이션의 처리 속도를 높여준다.
- 이미 가져온 데이터나 계산된 결과값의 복사본을 웹 로컬에 저장함으로 써 똑같은 요청이 있을 경우 저장된 복사본을 불러와서 처리 속도를 높여준다.
- 사용자(클라이언트)가 웹 사이트(서버)에 접속할 때, 정적 컨텐츠(이미지, js, css 등)를 특정 위치(클라이언트, 네트워크 등)에 저장하여 웹 서버에 해당 컨텐츠를 매번 요청하여 받는 것이 아니라, 특정 위치에서 불러옴으로써 사이트 응답 시간을 줄이고, 서버 트래픽 감소 효과를 볼 수 있다.
HTTP 메서드 활용
- 클라이언트에서 서버로 데이터 전송
- HTTP API 설계
🔍 클라이언트에서 서버로 데이터 전송
💡 데이터 전달 방식은 크게 2가지다.
- 쿼리 파라미터를 통한 데이터 전송
- GET 방식
- 주로 필터 정렬 (검색어)
- 메시지 바디를 통한 데이터 전송
- POST / PUT / PATCH 방식
- 회원 가입, 상품 주문, 리소스 등록, 리소스 변경
💡 클라이언트에서 서버로 데이터 전송 4가지 상황
- 정적 데이터 조회
- 이미지, 정적 텍스트 문서
- 동적 데이터 조회
- 주로 검색, 게시판 목록에서 정렬 필터 (검색어)
- HTML Form을 통한 데이터 전송
- 회원 가입, 상품 주문, 데이터 변경
- HTTP API를 통한 데이터 전송
- 회원 가입, 상품 주문, 데이터 변경
- 서버 to 서버 / 앱 클라이언트 / 웹 클라이언트(Ajax)
🔍 정적 데이터 조회
- 쿼리 파라미터를 사용하지 않는다.
- 이미지, 정적 텍스트 문서를 대상으로 사용한다.
- 조회할 때 GET 방식을 사용한다.
- 정적 데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회 가능하다.
🔍 동적 데이터 조회
- 주로 검색, 게시판 목록에서 정렬 필터(검색어)에서 사용한다.
- 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용한다.
- 조회는 GET 방식 사용
- GET은 쿼리 파라미터를 사용해서 데이터를 전달한다.
🔍 HTML Form 데이터 전송
💡 POST 전송 - 저장
- Content-Type은 request에 실어 보내는 데이터(body) 타입의 정보를 표현한 것이다.
- 쿼리 파라미터 형식으로 데이터를 만든 후 HTTP 바디 메시지에 넣는다.
💡 GET 전송 - 저장
- get 방식은 메시지 바디를 사용하지 않는다.
- 헤더 부분의 url 경로에 쿼리파라미터가 들어간다.
- 참고로 get 방식은 회원 가입, 정보 저장등 리소스 변경이 발생하는 곳에서는 사용하면 안된다.
💡 GET 전송 - 조회
💡 multipart/form-data
- 여러 컨텐츠 타입의 데이터를 보낼 때 사용한다.
- 주로 파일 업로드 같은 바이너리 데이터를 보낼 때 사용한다.
✔ 정리
- HTML Form에서 submit시 POST 전송
- 예) 회원 가입, 상품 주문, 데이터 변경 할 때 주로 쓰인다.
- Content-Type : application/x-www-form-urlencoded 이다.
- Form의 내용을 서버로 메시지 바디를 통해서 전송한다.
- 데이터가 key=value 형식으로 쿼리 파라미터 형식이다.
- 전송 데이터를 url encoding으로 처리한다.
- 예) abc김 → abc%EA%B9%80
- HTML Form은 GET 전송으로 가능하다.
- Content-Type : multipart/form-data
- 파일 업로드 같은 바이너리 데이터 전송시 사용한다.
- 다른 종류의 여러 파일과 폼의 내용을 함께 전송 가능하다.
- HTML Form 전송은 GET / POST 만 지원한다.
🔍HTTP API 데이터 전송
- 서버 to 서버
- 백엔드 시스템 통신
- 앱 클라이언트
- 아이폰, 안드로이드
- 웹 클라이언트
- HTML에서 Form 전송 대신 자바 스크립트를 통한 통신에 사용한다. (AJAX)
- 예) React, VueJs 같은 웹 클라이언트와 API 통신
- POST / PUT / PATCH 방식으로 메시지 바디를 통해 데이터를 전송한다.
- 조회할 때는 GET 방식으로 항상 쿼리 파라미터로 데이터를 전달한다.
- Content-Type은 주로 application/json으로 사용한다. (사실상 표준이다.)
HTTP API 설계 예시
- HTTP API - 컬렉션
- POST 기반 등록
- 예) 회원 관리 API 제공
- HTTP API - 스토어
- PUT 기반 등록
- 예) 정적 컨텐츠 관리, 원격 파일 관리
- HTML FORM 사용
- 웹 페이지 회원 관리
- GET / POST 만 지원한다.
🔍 회원 관리 시스템
💡 API 설계 - POST 기반 등록
- (GET) 회원 목록 : /members
- (POST) 회원 등록 : /members
- (GET) 회원 조회 : /members/{id}
- (PATCH / PUT / POST) 회원 수정 : /members/{id}
- (DELETE)회원 삭제 : /members/{id}
💡 POST - 신규 자원 등록 특징
- 클라이언트는 등록될 리소스의 URI를 모른다.
- 예) 회원 등록 : /members
- 서버가 새로 등록된 리소스 URI를 생성해준다.
- 예) Location : /members/100
- 이러한 스타일의 관리를 컬렉션(Collection)이라고 한다.
- 서버가 관리하는 리소스 디렉토리다.
- 서버가 리소스의 URI를 생성하고 관리한다.
- 여기서 컬렉션은 /members 다.
🔍 파일 관리 시스템
💡 API 설계 - PUT 기반 등록
- (GET) 파일 목록 : /files
- (GET) 파일 조회 : /files/{filename}
- (PUT) 파일 등록 : /files/{filename}
- (DELETE) 파일 삭제 : /files/{filename}
- (POST) 파일 대량 등록 : /files
💡 PUT - 신규 자원 등록 특징
- 클라이언트가 리소스 URI를 알고 있어야 한다.
- (PUT) 파일 등록 : /files/{filename}
- 예) /files/star,jpg
- 클라이언트가 직접 리소스의 URI를 지정한다.
- 이러한 스타일의 관리를 스토어(Store)라고 한다.
- 클라이언트가 관리하는 리소스 저장소다.
- 클라이언트가 리소스의 URI를 알고 관리한다.
- 여기서 스토어는 /files 다.
🔍 HTML FORM 사용
- HTML FORM은 GET /POST만 지원한다.
- AJAX 같은 기술을 사용해서 해결 가능하다.
- 컨트롤 URI
- HTML FORM은 GET / POST 만 지원 하므로 제약이 있다.
- 이런 제약을 해결하기 위해 컨트롤 URI를 통해 동사로 된 리소스 경로를 사용한다.
- POST의 /new, /edit/, delete 가 컨트롤 URI다.
- HTTP 메서드로 해결하기 애매한 경우 사용한다. (HTTP API 포함)
- 실무에서 자주 쓰인다.
- 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행할 때 쓰인다.
- 예) /members/{id}/delete
💡 회원 관리 시스템
- (GET) 회원 목록 : /members
- (GET) 회원 등록 폼 : /members/new
- (POST) 회원 등록 : /members/new, /members
- (GET) 회원 조회 : /members/{id}
- (GET) 회원 수정 폼 : /members/{id}/edit
- (POST) 회원 수정 : /members/{id}/edit, /members/{id}
- (POST) 회원 삭제 : /members/{id}/delete
🔍 참고하면 좋은 URI 설계 개념
💡 문서 (documnet)
- 단일 개념(파일 하나, 객체 인스턴스, 데이터 베이스 row)
- 예) /members/100, /files/star.jpg
💡 컬렉션(collection)
- 컬렉션은 서버가 관리하는 리소스 디렉터리다.
- 서버가 리소스의 URI를 생성하고 관리한다.
- 예) /members
💡 스토어(store)
- 스토어는 클라이언트가 관리하는 자원 저장소다.
- 클라이언트가 리소스의 URI를 알고 관리한다.
- 예) /files
💡 컨트롤러(controller), 컨트롤 URI
- 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행할 때 쓰인다.
- 동사를 직접 사용한다.
- 예) /members/{id}/delete
👀 참고 자료
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard
https://hahahoho5915.tistory.com/33
https://gist.github.com/jays1204/703297eb0da1facdc454
728x90
'CS > HTTP' 카테고리의 다른 글
[HTTP] HTTP 헤더2 - 캐시와 조건부 요청 (0) | 2022.03.04 |
---|---|
[HTTP] HTTP 헤더1 - 일반 헤더 (0) | 2022.03.02 |
[HTTP] HTTP 상태코드 (0) | 2022.03.01 |
[HTTP] HTTP 기본 (0) | 2022.02.10 |
[HTTP] 인터넷 네트워크 (0) | 2022.02.09 |