주소에는 명사, 요청 방식에는 동사를 사용함으로써 의도를 명확히 드러냄.
생성(post)
조회(get)
수정(put)
삭제(delete)
/account/edit 말고 /account/put 처럼.
주소에 동사는 가급적 사용하지 않음.
ex) www.naver.com 을 검색하면 반드시 네이버가 나와야 하며 다른 사이트가 나오면 안됨.
또, www.naver.com/movies/181 을 검색하면 181번 영화가 나와야지 7번 영화가 나오면 안됨.
클라이언트와 - 서버 간의 약속 (클라이언트와 서버가 서로 상호작용하는 창구)
각각 용도에 맞게 정해진 요구를 날리면 정해준 웹을 돌려주는 그 약속의 창구를 API라고 함.
클라이언트가 정한대로 서버에게 요청(Request)을 보내면,
서버가 요구사항을 처리하여 응답(Response)을 반환.
요청의 종류의 따라 여러가지 API가 있음.
"REpresentational State Transfer" 의 약자로,
자원을 이름(자원의 표현)으로 구분해 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미.
즉, 자원(resource)의 표현(representation)에 의한 상태 전달.
REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에,
웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일임.
즉, REST는 네트워크 상에서 Client와 Server 사이의 통신 방식 중 하나임.
어떤 자원에 대해 CRUD(Create, Read, Update, Delete) 연산을 수행하기 위해 URI(Resource)로
GET, POST 등의 방식(Method)을 사용하여 요청을 보내며, 요청을 위한 자원은 특정한 형태(Representation of Resource)로 표현됨.
1. 자원(Resource) - URI
2. 행위(Verb) - Method
3. 표현 ( Representation of Resource )
1. Server-Client (서버-클라이언트 구조)
2. Stateless (무상태)
3. Cacheable (캐시 처리 기능)
4. Layered System (계층 구조)
5. Uniform Interface (인터페이스 일관성)
6. Self-Descriptiveness (자체 표현)
REST API 설계 시 가장 중요한 항목은 다음의 2가지로 요약.
1. URI는 명사를 사용한다.(리소스명은 동사가 아닌 명사를 사용.)
1-1. 아래와 같은 동사를 사용하지 말 것
2. 슬래시( / )로 계층 관계를 표현한다.
3. URI 마지막 문자로 슬래시 ( / )를 포함하지 않는다.
4. 밑줄( _ )을 사용하지 않고, 하이픈( - )을 사용한다.
5. URI는 소문자로만 구성한다.
6. HTTP 응답 상태 코드 사용
7. 파일확장자는 URI에 포함하지 않는다.
Ex) http://dev-coco.tistory.com/restapi/220/photo.jpg (X)
RESTful은 REST의 설계 규칙을 잘 지켜서 설계된 API를 RESTful한 API라고 함.
즉, REST의 원리를 잘 따르는 시스템을 RESTful이란 용어로 지칭.
RESTful하게 만든 API는 요청을 보내는 주소만으로도 어떤 것을 요청 하는지 파악이 가능.
예를들어, https://school.com/grade 의 주소는 학교의 학년들을 목록으로 받는 요청이라 추론 가능.
{"results" : [ {"idx": 1, "name": "1학년"}, {"idx": 2, "name": "2학년"}, {"idx": 3, "name": "3학년"} ]}
https://school.com/grade/2 이렇게 idx, 고유번호가 붙는다면, idx가 2인 학년의 정보가 올거고,
https://school.com/grade/2/students 의 students가 붙으면 2반 학생들의 정보를 받아올 수 있음.
{"results" : [ {"idx": 1, "name": "홍길동", "gender": "male"}, {"idx": 2, "name": "성춘향", "gender": "female"}, {"idx": 3, "name": "전우치", "gender": "male"}, {"idx": 4, "name": "나기백", "gender": "male"}, ... ]}
또, https://school.com/grade/2/students/15 라는 idx를 붙이면 그 학생들 중 15의 idx를 가진 학생의 정보가 오겠지?
혹은 https://school.com/grade/2/students?gender=male 와 같이 조건을 붙여서 남학생들의 정보만 받아올 수도 있어~
한 페이지당 10명의 데이터를 받아오는 거라면 이런식으로도 표현이 가능하겠네?
https://school.com/grade/2/students?page=2&count=10
{"results" : [ {"idx": 11, "name": "신짱구", "gender": "male"}, {"idx": 12, "name": "김지우", "gender": "female"}, {"idx": 13, "name": "김화석", "gender": "male"}, {"idx": 14, "name": "박수쳐", "gender": "male"}, ... ]}
이렇게 RESTful API는 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것을 목적으로.
만약, 성능이 중요한 상황이라면 굳이 RESTful 한 API를 구현할 필요는 없음!!!
어제 처음 스프링 공부를 시작했는데 전 날 잠을 못자서 그런지
집중도 안되고 이해도 전~~혀 안됐다.
그래서 오늘 다시 마음 잡고 어제 강의까지 돌려보며 복습했다.
흐름을 아는게 중요하다고 했는데 나느 그 흐름을 너무 몰라서 개념을 이해하려고
알 때 까지 찾아보고 정리했다.
역시 정리다.
정리가 답이었다.
정리를 하니까 머릿속이 정리가 됐다.
정리를 잘 하자.