- HTTP API
- HTTP 메서드 - GET, POST
- HTTP 메서드 - PUT, PATCH, DELETE
- HTTP 메서드의 속성
만약 위와같은 요구사항이 있다고 가정하자.
회원 정보 관리 API를 만들어라.
• 회원 목록 조회
• 회원 조회
• 회원 등록
• 회원 수정
• 회원 삭제
URI를 이름에 맞춰서 설계한다.
API URI 설계
• 회원 목록 조회 /read-member-list
• 회원 조회 /read-member-by-id
• 회원 등록 /create-member
• 회원 수정 /update-member
• 회원 삭제 /delete-member
API URI고민
"리소스의 의미"
회원을 조회하다 -> 리소스가 아님
"회원" -> 자체가 리소스임.
• 회원 목록 조회
• 회원 조회
• 회원 등록
• 회원 수정
• 회원 삭제
↓
리소스 식별, URI 계층 구조 활용
• 회원 목록 조회 /members
• 회원 조회 /members/{id}
• 회원 등록 /members/{id}
• 회원 수정 /members/{id}
• 회원 삭제 /members/{id}
• 참고: 계층 구조상 상위를 컬렉션으로 보고 복수단어 사용 권장(member -> members)
↓
• 회원 목록 조회 /members
• 회원 조회 /members/{id} -> 어떻게 구분하지?
• 회원 등록 /members/{id} -> 어떻게 구분하지?
• 회원 수정 /members/{id} -> 어떻게 구분하지?
• 회원 삭제 /members/{id} -> 어떻게 구분하지?
회원을 등록,조회,수정하는것은 모두 배제
회원이라는 리소스만 식별하면된다.
리소스와 행위를 분리한다.
리소스는 명사, 행위는 동사가 된다.
행위(메서드)는 어떻게 구분하지?
클라이언트가 서버에 요청을할때 기대하는 행동.
요새는 리소스말고 리프레젠테이션이라는 표현을 쓴다.
//이 둘은 거의 안씀.
/100번의 유저 정보를 주세요!
서버에서 답을 보냅니다.
HTTP/1.1버전, 200 OK(오류없이 ok라는뜻)
타입은 application/json
length 길이는 34
신규 등록, 변경에 쓰인다.
username "young"이고 age"20"인 메세지를 /members에 전달한다.
전달받은 메세지는 /100 (신규리소스)가 생성된다.
등록이 완료 된 경우엔 201 Created를 보낸다. (200도 가능)
201번을 보내는 경우는 Location(등록된 신규 리소스)를 적어준다.
스펙: POST 메서드는 대상 리소스가 리소스의 고유 한 의미 체계에 따라 요청에 포함 된 표현을 처리하도록 요청합니다. (구글 번역)
HTML 양식에 입력 된 필드와 같은 데이터 블록을 데이터 처리 프로세스에 제공
예) HTML FORM에 입력한 정보로 회원 가입, 주문 등에서 사용
게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시
예) 게시판 글쓰기, 댓글 달기
서버가 아직 식별하지 않은 새 리소스 생성
예) 신규 주문 생성
기존 자원에 데이터 추가
예) 한 문서 끝에 내용 추가하기
정리: 이 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 함 -> 정해진 것이 없음
post와 put의 차이점은 클라이언트가 리소스의 위치를 알고, uri를 지정한다는 뜻이다.
리소스를 대체할때, 완전히 대체함으로 기존 리소스를 없애버리고 완전히 날려버림. "완전히 대체함."
username 필드가 없는데 age만 "50"으로 바꾸면 어떻게 될까?
username필드가 완전히 삭제되며, put으로 보낸 리소스를 담은 age "50" 으로 덮어씌워지게된다.
리소스를 완전히 대체하게된다.
* 부분만 변경하려면 PATCH를 사용한다.
username 필드가 없는 경우에 age만 변경하려고한다.
PATCH를 이용하면 기존리소스에 추가로 age만 변경된다.
members/100을 삭제한다.
• 안전(Safe Methods)
• 멱등(Idempotent Methods)
• 캐시가능(Cacheable Methods)
변경해도 변경이 일어나지않는걸 안전하다고 한다.
GET, HEAD 외에는 모두 안전하지 않음.
• GET: 한 번 조회하든, 두 번 조회하든 같은 결과가 조회된다.
• PUT: 결과를 대체한다. 따라서 같은 요청을 여러번 해도 최종 결과는 같다.
• DELETE: 결과를 삭제한다. 같은 요청을 여러번 해도 삭제된 결과는 똑같다.
• POST: 멱등이 아니다! 두 번 호출하면 같은 결제가 중복해서 발생할 수 있다.
• 자동 복구 메커니즘
(여러번 요청해서 복구)
• 서버가 TIMEOUT 등으로 정상 응답을 못주었을 때, 클라이언트가 같은 요청을 다시 해도 되는가?의 판단, 근거
• 사용자1: GET -> username:A, age:20
• 사용자2: PUT -> username:A, age:30
• 사용자1: GET -> username:A, age:30 -> 사용자2의 영향으로 바뀐 데이터 조회
• A: 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지는 고려하지는 않는다.