티스토리 뷰
1. 멱등성이란?
수학에서 사용하는 용어에서 유래한 것으로. 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 뜻한다.
2. HTTP Method 의 멱등성
멱등성의 개념은 HTTP 에서도 동일하게 적용될 수 있다.
동일한 요청을 한 번 보내는 것과 여러번 보내는 것이 서로 동일한 효과를 지니고, 서버의 상태도 동일하게 남을 때 해당 HTTP Method가 멱등성을 갖는다고 이야기한다.
멱등성을 따질 때에는 서버의 상태만 바라보면 되며, HTTP 응답 Status는 신경쓰지 않아도 된다.
올바르게 구현된 REST API 의 GET, HEAD, OPTIONS, PUT, DELETE 메소드는 통계 기록(e.g. 게시물 조회수의 증가 등)을 제외하였을 경우 멱등성이 보장된다
어떤 이유로 GET, HEAD, OPTIONS, PUT, DELETE 메소드는 멱등성이 보장되어야 할까?
1) GET : 서버에 존재하는 리소스를 단순히 읽어오기만 하는 메소드이기 때문에 당연히 여러번 수행되어도 결과값은 변하지 않는다. 마찬가지로 HEAD, OPTIONS 메소드도 조회에 대한 메소드이기 때문에 멱등하다고 할 수 있다.
2) PUT : 서버에 존재하는 리소스를 요청에 담긴 내용대로 통째로 대체해버리므로 올바르게 구현하였다면 여러번 수행되어도 결과 값은 변하지 않을 것 이다.
3) DELETE : 존재하는 데이터를 삭제한 결과와 이미 존재하지 않은 결과를 삭제하려는 시도에 대한 응답 코드는 서로 다르겠지만, (200 OK 또는 404 NOT FOUND) 서버의 상태 자체는 변하지 않으므로 올바르게 구현되었다면 여러번 수행되어도 멱등성이 보장될 것 이다.
하지만 POST는 이야기가 다르다.
POST 메소드가 호출될 때 마다 데이터베이스 등에 요청된 데이터가 추가될 것 이고, 이는 곧 멱등성을 위배함을 알 수 있다. 호출시 마다 서버의 상태가 달라지기 때문이다.
그렇다면 PATCH 메소드는 어떨까?
결론부터 말하자면 PATCH 메소드는 항상 멱등성을 보장한다고 이야기할 수 없다. 정확히는 PATCH는 멱등성을 보장하도록 설계할 수 있지만, 멱등성을 보장하지 않도록 설계할 수도 있다.
PUT은 요청에 대하여 리소스를 통째로 바꿔버리기 때문에 멱등성이 보장되지만, PATCH는 리소스의 일부에 대하여 변화를 명령할 수 있기 때문이다
{
"operation": "add",
"age": 10
}
위 요청을 PATCH 메소드로 실어 보낸다면, 해당하는 리소스의 age 라는 필드는 요청마다 10씩 증가하게 될 것 이다.
따라서 단일 호출에 대한 응답과 다중 호출에 대한 응답에 대한 서버의 상태가 다를 것이고, 곧 이는 멱등하지 않음을 의미한다.
+) 추가
- 안전한 메소드와 멱등성을 지키는 메소드는 서로 다르다.
안전한 메소드란 서버의 상태를 변경시키지 않는 HTTP 메소드를 의미한다.
GET, OPTIONS, HEAD 와 같이 조회에 사용되는 메소드를 안전하다고 이야기할 수 있다.
모든 안전한 메소드는 멱등성을 갖지만, 그 역은 성립하지 않는다.
앞서 이야기한 PUT과 DELET 메소드는 멱등성을 갖는다고 했다.
하지만 PUT은 리소스를 수정하고, DELETE는 메소드를 제거하므로 안전한 메소드라고는 이야기할 수 없다.
즉, 멱등성을 갖는 메소드가 서버의 상태를 변경하지 않는다고 오해하면 안된다. 멱등성을 갖는 메소드도 서버의 상태를 변경시킬 수 있다. 멱등성의 핵심은 "요청에 대한 서버의 상태가 항상 같은가?" 이다.
'Tips > IT 상식' 카테고리의 다른 글
[IT 상식] 프레임워크와 라이브러리의 차이 (0) | 2024.07.20 |
---|---|
[IT 상식] CORS(Cross Origin Resource Sharing) 개념정리 (0) | 2024.06.17 |
버퍼(Buffer)란? (3) | 2024.04.08 |
하드코딩이란? (0) | 2024.04.02 |
- Total
- Today
- Yesterday
- 중급 프로젝트
- GitHub
- 객체
- html
- Git
- 코드잇스프린트
- CSS
- currentTarget
- Next.js
- rest parameter
- 배열
- 비동기
- 제어 컴포넌트
- js
- react
- 유사배열객체
- arguments
- 코드잇 스프린트
- map
- javascript
- Target
- innerhtml
- tanstackquery
- 비제어 컴포넌트
- 취업까지달린다
- 동기
- hydrationboundary
- 스프린트프론트엔드6기
- 프론트엔드
- 리액트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |