HTTP 메서드
수정하기
문서 생성 2021-05-17 00:39:53 최근 수정 2021-05-17 00:40:01
HTTP API 만들기
- 회원 정보 관리 API
- 회원 목록 조회
/members
GET - 회원 조회
/members/{id}
POST - 회원 등록
/members
POST - 회원 수정
/members/{id}
PATCH, PUT, POSTPUT
은 덮는 것이기 때문에 데이터를 전부 다 보내야한다는 단점PATCH
를 쓰는 것이 가장 좋음 (부분 수정)- 애매하면
POST
- 회원 삭제
/members/{id}
DELETE
- 회원 목록 조회
API URI 설계
- 가장 중요한 것은 리소스 식별
- 회원을 등록, 조회하는 게 리소스가 아닌, 회원이란 개념 자체가 리소스
- 어떻게 식별하는게 좋을지?
- 회원을 등록, 수정, 조회하는 것을 모두 배제한다.
- 회원이라는 리소스만 식별 → 회원 리소스를 URI에 매핑
- 계층 구조상 상위를 컬렉션으로 보고 복수단어 사용을 권장한다.
- 리소스와 행위를 분리하기
- 리소스는 명사, 행위는 동사
- 행위(메서드)는 어떻게 구분하나? → HTTP 메서드를 사용해서!
GET
- 리소스 조회
- 서버에 전달하고픈 데이터는 query를 통해 전달
- 메시지 바디를 사용해 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많다.
POST
- 요청 데이터 처리, 주로 등록, 프로세스 처리에 사용
- 메시지 바디를 통해 서버로 요청 데이터 전달
- 서버는 요청 데이터를 처리한다.
- 대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청
- HTML 양식에 입력된 필드와 같은 데이터 블록을 처리 프로세스에 제공
- 회원가입, 주문
- 게시판, 뉴스 그룹, 블로그 메시지 게시
- 게시판 글, 댓글 작성
- 서버가 아직 식별하지 않은 새 리소스 생성하기
- 신규 주문 생성
- 기존 자원에 데이터 추가
- 한 문서 끝에 내용 추가
- 프로세스 처리
- 주문에서 결제완료 배달시작 배달완료 처럼 상태가 변경되는 것
- 다른 메서드로 처리하기 어려운 경우
- JSON으로 조회 데이터를 넘겨야할 때 GET을 쓰기 어려우면 사용
- HTML 양식에 입력된 필드와 같은 데이터 블록을 처리 프로세스에 제공
- 어떻게 처리해야할지는 리소스마다 따로 정해놔야 한다.
PUT
- 리소스를 대체, 해당 리소스가 없으면 생성, 덮어버린다.
- 클라이언트가 리소스를 식별
- 클라이언트가 리소스 위치를 알고 URI를 지정 (POST와의 차이)
PATCH
- 리소스 부분 변경
DELETE
- 리소스 삭제
기타 메서드
- HEAD: GET과 동일, 메시지 부분을 제외, 상태 줄과 헤더만 반환
- OPTIONS: 대상 리소스에 대한 통신 가능 옵션을 설명(CORS)
- CONNECT, TRACE
HTTP 메서드 속성
안전(Safe)
- 호출해도 리소스를 변경하지 않음
GET
은 안전,POST
안전하지 않음
- 안전은 해당 리소스가 변하냐 변하지 않냐만 고려한다. 그 이후 과정은 고려하지 않는다.
멱등(Idempotent)
- 1번 호출, 2번 호출, 100번 호출...결과는 같은 것
GET
,PUT
,DELETE
POST
는 멱등이 아니다.- 왜 이런 개념이 필요한가?
- 자동 복구 매커니즘 → 서버가 제대로 응답을 못주었을 때, 클라이언트가 다시 요청을 시도해도 되는지에 대한 판단 근거가 된다.
GET
을 보내고 응답이 안왔을 때,GET
은 멱등이기 때문에 다시 요청해도 되는 것!
- 자동 복구 매커니즘 → 서버가 제대로 응답을 못주었을 때, 클라이언트가 다시 요청을 시도해도 되는지에 대한 판단 근거가 된다.
- 외부 요인으로 인해 리소스가 변경되는 것은 고려하지 않는다.
캐시가능(Cacheable)
- 응답 결과 리소스를 캐시해서 사용해도 되는지?
GET
,HEAD
,POST
,PATCH
캐시가능- 실제로는
GET
,HEAD
정도만 캐시로 사용한다.- 이미지 같이 용량이 큰 것...
메서드는 어떻게 활용할까?
데이터 전송
쿼리 파라미터
GET
- 검색어, 정렬 조건
메시지 바디
POST
,PUT
,PATCH
- 회원 가입, 상품 주문, 리소스 등록/변경
데이터 전송 상황들
- 정적 데이터 조회
- 이미지, 정적 문서
- 쿼리 파라미터 없이 리소스 경로로
- 동적 데이터 조회
- 검색, 게시판 목록 정렬
- 쿼리 파라미터 사용
GET
사용
- HTML Form
- 회원가입, 주문, 데이터 변경
POST
사용Content-Type: application/x-www-form-urlencoded
사용- 전송 데이터를 url encoding, 메시지 바디를 통해 key=value (쿼리 파라미터 형식)
Content-Type: multipart/form-data
- 파일 전송시
- HTTP API
- 회원가입, 주문, 데이터 변경
- 서버 to 서버, 앱 클라이언트, Ajax
POST
,PUT
,PATCH
,GET
(조회용, 쿼리파라미터)Content-Type: application/json
을 주로 사용한다.
- 정적 데이터 조회
POST
- 클라이언트는 등록될 리소스의 URI을 모르고 서버에서 리소스 URI을 결정하고 만들어준다.
- 예를 들면 회원 신규 등록을 할 경우, 회원 아이디를 넘겨줌
/members/10
- 예를 들면 회원 신규 등록을 할 경우, 회원 아이디를 넘겨줌
- 위와 같은 형식을 컬렉션이라고 한다.
- 서버가 관리하는 리소스 디렉토리, 서버가 리소스의 URI를 생성하고 관리
- 컬렉션은
/members
- 대부분은 컬렉션 기반을 사용한다.
PUT
- 파일 관리 시스템
- 클라이언트가 새로 업로드할 파일 이름을 알고 있다. 없으면 새로 생성, 있으면 덮어버림
/files/{filename}
PUT
을 사용하는 것이 적절하다.
- 위와 같은 형식은 스토어(Store)
- 클라이언트가 리소스의 URI를 알고 관리
- 스토어는
/files
HTML Form
GET
,POST
만 지원- AJAX 기술 활용할 수 있다.
- 순수한 HTML은
GET
,POST
- 순수한 HTML은
- 사용 예
- 회원 목록
/members
GET - 회원 등록 폼
/members/new
GET - 회원 등록
/members/new
, POST - 회원 조회
/members/{id}
GET - 회원 수정 폼
/members/{id}/edit
GET - 회원 수정
/members/{id}/edit
, POST - 회원 삭제
/members/{id}/delete
POST
- 회원 목록
컨트롤 URI
GET
,POST
만 지원하기에 제약이 있음, 제약을 해결하기 위해 동사로 된 리소스 경로 사용POST
의/new
,/edit
,/delete
가 컨트롤 URI- 최대한 HTTP 메서드로 해결하고 애매한 경우 사용하는 것
같이 보기
- https://restfulapi.net/resource-naming/
- 실제로 복잡해지면 설계가 어렵다.
- 일단 컬렉션과 문서, HTTP 메서드로 해결한다. ("미네랄을 캐라" 이면 "캐라"를 제외하고 미네랄만 )
- 그래도 안된다면 컨트롤 URI