REST(Representational State Transfer)는 HTTP 프로토콜을 기반으로 클라이언트가 서버의 리소스(HTML, CSS, 이미지, 폰트 등)에 접근하는 방식을 규정한 소프트웨어 아키텍처
REST의 원칙을 지킨 서비스 디자인을 RESTful하다고 표현하며 REST를 기반으로 서비스 API를 구현한 것을 REST API라고 한다.
RESTful하지 않은 API? (여러 가지 有)
POST
메서드를 사용하는 방식은 RESTful하지 않다.소프트웨어 아키텍처란?
HTTP란?
API란?
REST API를 사용하고 있지만 RESTful하게 사용하는 개발자는 많지 않다
→ 서버가 각 클라이언트 종류 별로 통신 방식에 대응하지 않아도 된다. HTTP 통신을 기반으로 한 REST API를 사용하면 다른 모듈이나 애플리케이션이라 해도 상호 간 통신이 가능하기 때문이다.
→ 과거에는 서버로부터 데이터를 전달 받는 클라이언트가 PC 브라우저로 명확했지만 현재 다양한 클라이언트가 등장하며 일일이 대응하는 server를 만드는 것은 비효율적이다.
app.js
const handleReadTodo = (isMain) => {
$.ajax({
type: 'GET',
url: '/todolist',
data: {},
success: (res) => {
// ...
});
};
const handleAddTodo = () => {
// ...
$.ajax({
type: 'POST',
url: '/todolist',
data: {
todo_give: todoItem,
isDone: false,
timestamp: timestamp,
},
success: (res) => {
alert(res['message']);
// ...
},
});
};
app.py
@app.route('/todolist', methods=['GET'])
def read_todo():
todo_list = list(db.todolist.find({}, {'_id': False}))
return jsonify({'todolist': todo_list})
@app.route('/todolist', methods=['POST'])
def add_todo():
todo_receive = request.form['todo_give']
todo_isDone = request.form['isDone']
todo_timestamp = request.form['timestamp']
doc = {
'todo': todo_receive,
'isDone': todo_isDone,
'timestamp': todo_timestamp,
}
db.todolist.insert_one(doc)
return jsonify({'message': 'SUCCESS: UPDATE TODO'})
RESTful API를 설계하는 중심 규칙
리소스를 식별할 수 있는 이름은 동사보다 명사 사용 권장 (행위에 대한 표현 지양)
// BAD
GET /getTodos/1
GET /todos/read/1
// GOOD
GET /todos/1
HTTP 요청 메서드
GET/DELETE는 파라미터를 통해 요청을 보낸다.
GET
- 데이터 조회 목적으로 사용하는 방법
- URL에 데이터가 그대로 노출되기 때문에 보안 상 중요한 데이터를 포함하면 안 된다.
POST
- 데이터 추가, 수정 목적으로 사용하는 방식 (GET보다 상대적으로 안전함)
HTTP 요청/응답 메세지엔 HTTP Header와 HTTP Body로 구성되어 있다.
Header : 요청한 URL, methods, 요청 관련 기타 정보
Body : resource(실제 데이터 본문)
POST
요청을 사용한 이유는?POST
요청을 사용해야 하는 이유가 있는 것인지, 아니면 강의 진행 편의 상 POST
요청으로 진행한 것인지?⇒ 데이터의 일부를 수정하는 경우 PUT 요청은 바뀌지 않는 속성도 모두 보내야 한다. (전달된 데이터 이외의 필드는 모두 null or default값으로 처리된다.)
⇒ 데이터의 일부를 수정하는 경우 PATCH 요청은 바뀌는 속성만 보내면 해당 부분만 수정된다.
PATCH /users/1
{
'age': 20
}
HTTP/1.1 200 OK
{
'name': 'John',
'age': 15
}
PUT /users/1
{
'age': 20
}
HTTP/1.1 200 OK
{
'name': null,
'age': 20
}
멱등성 : 여러 번 수행해도 결과가 같음
https://ko.wikipedia.org/wiki/소프트웨어_구조
https://ko.wikipedia.org/wiki/REST
https://wnsgml972.github.io/platform/2021/03/06/importance-software-architecture/
https://ko.wikipedia.org/wiki/HTTP
https://code-lab1.tistory.com/194
https://www.redhat.com/ko/topics/api/what-is-a-rest-api
https://velog.io/@kjh03160/그런-REST-API로-괜찮은가
https://seunghyun90.tistory.com/42
https://appmaster.io/ko/blog/rest-apiran-mueosimyeo-dareun-yuhyeonggwa-eoddeohge-dareungayo
https://velog.io/@somday/RESTful-API-이란
https://velog.io/@modsiw/REST와-REST-API란
https://khj93.tistory.com/entry/네트워크-REST-API란-REST-RESTful이란
https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm