📎 Spring RestTemplate 시작하기
📎 Android Studio Retrofit2 시작하기
Rest API(Representational State Transfer), Restful은 Method(행위, CRUD), Resource(자원), Representation of Resource(형태, Json/xml) 3가지가 명시된 URI를 통해 웹과 통신하는 방식이다. 📎 API란?
Resource Type
- Document
▶ Collection의 상세적인 내용으로 데이터베이스에서 record와 유사하다. 주로 Collection/Document 와 같이 Collection/ 뒤에 단수 명사로 표현된다.
- Collection
▶ Document들은 모아놓은 것으로, 데이터베이스의 스키마와 유사하다. URI에서 복수 명사로 표현해야한다.
- Store
▶ 클라이언트가 만든 컬렉션같은 느낌으로 장바구니, 좋아요 목록 등 서버가 아닌 클라이언트에 저장되어 있는 정보이다. Collection과 마찬가지로 복수 명사로 표현한다.
- Controller
▶ CRUD 이외의 클라이언트가 요청하는 내용으로 URI에서 유일하게 동사 사용이 가능하다.
URI? URL?
▶ URL(Uniform Resource Locator)란 인터넷 상에서 자원이 어디있는지 표현하는 방식이다.
▶ URI(Uniform Resource Identifier)는 인터넷 상에서 자원의 고유 식별자, URL을 포함하는 개념이다.
https://velog.io/write?id=61ba21f6-46e5-4b32-a5c3-45429541a297
여기서velog.io/write
까지는 자원이 어디있는지에 대한 정보(URL)이고,id=61ba21f6-46e5-4b32-a5c3-45429541a297
까지 포함하면 자원의 식별자(URI)이다(id를 통해 자원을 식별한다).
Rest API는 위처럼 5가지 태그로 CRUD가 구성되어있다.
처음 Rest API를 접했을 때, Post만으로 모든 기능을 구현할 수 있었기에 각 태그의 차이가 무엇인지 궁금했었다. 하지만 Get, Post, Put, Patch, Delete 5가지 태그는 차이가 없다.
-> Get에서는 Body를 쓸 수 없다고 하지만 직접 해보면 쓸수있다.
그렇다면 왜 나뉘어 있을까?
▶ 이유는 Restful한 구조를 위해서이다.Rest API는 URI를 통해 CRUD를 요청하는데 이때 요청이 모두 POST라면 삭제를 원하는지, 게시를 원하는지 모르기에 의미가 모호해진다. 그렇기 때문에 어떤 CRUD인지 명시하여 모호하지 않은 요청을 해야한다.
Rest API의 CRUD 중 Post는 유일하게 idempotent하지 않다.
idempotent(멱등성)
1 x 1 처럼 몇번을 반복해도 같은 결과를 나타내는 것
id가 1인 고객 정보를 GET 하는 것은 항상 같은 결과지만, POST하는 것은 한번 실행했을 때와 여러 번 실행했을 때 결과가 다르다.
PUT은 자원의 전체를, Patch는 자원의 일부를 수정한다.
"id가 1인 유저의 이름을 안덕찬으로 바꿔줘!" 요청을 Patch로 하면 id가 1인 유저의 이름을 안덕찬으로 변경한다. 하지만 요청을 PUT으로 하면 id - 1, name - 안덕찬으로 변경하고 다른 값(성별, 나이 등)을 모두 null(or 초기값)으로 처리한다. 때문에 PUT으로 Update를 요청할 땐 모든 필드를 전해주어야한다.
Get에서는 보통 클라이언트가 요청한 내용을 Json 형식으로 return해준다. 그렇다면 Post, Put, Patch, Delete에서는 무엇을 return할까?
이곳저곳 찾아본 결과 회사마다 각자의 방식으로 return 값을 정한다. 요청한 데이터의 id를 return하는 곳도 있고 개인 프로젝트에서는 boolean을 return 분도 계셨다. 즉 원하는 내용을 통일성 있게 return해주면 된다.
/customerName/{name} X
/customername/{name} O
/getcustomername/{name} X
GET /customername/{name} O
GET /customer/{id}/name -> {id}를 가진 고객의 이름
GET /customer/name/ X
GET /customer/name O
GET /customer_name/ X
GET /customer-name O
파일 확장자(.xml, .txt)는 URL에 포함하지 않는다.
Controller가 아닐 경우 명사를 사용한다.
Document는 단수 명사를, Collection / Store는 복수 명사를 사용한다.
최종 수정 : 2021-03-23