Representational State Transfer(REST)는 API 작동 방식에 대한 조건을 부여하는 소프트웨어 아키텍처. 즉 클라이언트와 서버가 데이터를 주고받는 방식을 설계하는 하나의 원칙이자 스타일이에요.
RESTful API는 이 REST 원칙을 잘 따르는 API를 말해요.
REST의 가장 중요한 개념은 모든 데이터(자원, Resource)를 URL로 표현하고, 그 자원에 대한 행동(조회/생성/수정/삭제)은 HTTP 메서드로 표현한다는 점이에요.

클라이언트 / 서버 구조 :
클라이언트(화면을 보여주는 쪽)와 서버(데이터를 관리하는 쪽)가 명확히 분리되어 있어야 해요. 그래야만 프론트엔드가 React에서 Next.js로 바뀌어도 익스프레스 백엔드는 그대로 둘 수 있고, 반대로 백엔드 로직이 바뀌어도 프론트엔드는 API 응답 형태만 똑같다면 아무런 영향도 받지 않기 때문이에요.
무상태성 (Stateless) :
서버는 클라이언트의 이전 요청 상태를 기억하지 않아야 하고, 매 요청마다 그 요청 자체에 필요한 모든 정보가 담겨 있어야 해요. 이 조건은 서버가 매번 요청을 완전히 이해해서 이행할 수 있음을 의미해요. 무상태성이 중요한 이유는 서버 입장에서 보면, 누가 어떤 상태였는지? 계속 기억해야할 경우 서버를 여러대로 늘릴 때 스케일링이 복잡해지는 문제가 생기기 때문이에요.
캐시처리 가능성 (Cacheable) :
서버의 응답에는 이 응답을 캐시해도 되는지에 대한 정보가 명시되어 있어야 해요. 우리가 배운 revalidate 개념도 결국 이 데이터를 얼마나 오래 캐시해도 되는지에 대한 정보를 정하고 있어요.
일관된 인터페이스 (Uniform Interface) :
이게 REST의 정체성이라고 할 만큼 중요해요. 다음의 몇가지 세부 규칙으로 나뉘어요.
계층화 시스템 (Layered System) :
클라이언트는 자신이 서버와 직접 통신하는지, 아니면 중간에 프록시 / 로드밸런서 같은 게 껴있는지 알 필요가 없어야 해요. 우리가 이번에 Next.js에서 배운 프록시(API Route) 라는 개념도 이 원칙과 연결돼요.
온디맨드 코드 (Code on Demand) :
REST 아키텍처 스타일에서 서버는 클라이언트에게 실행 가능한 코드를 보내서, 클라이언트의 기능을 일시적으로 확장하거나 사용자가 지정할 수 있다는 원칙이에요. 이건 유일하게 선택적인 제약이라서, 지키지 않아도 REST를 위반하는 게 아니에요.
확장성 : REST API를 구현하는 시스템은 REST가 클라이언트와 서버 상호 작용을 최적화하기 때문에 효율적으로 크기를 조정할 수 있어요. 무상태는 서버가 과거 클라이언트 요청 정보를 유지할 필요가 없기 때문에 서버 로드를 제거할 수 있어요. 그리고 잘 관리된 캐싱은 일부 클라이언트와 서버간의 상호작용을 부분적으로 또는 완전히 제거할 수도 있죠. 이러한 모든 기능은 성능을 저하시키는 통신 병목 현상을 일으키지 않으면서도 확장성을 유지하게 할 수 있다는 장점이 있어요.
유연성 : RESTful 웹 서비스는 완전하게 클라이언트와 서버 분리를 지원해요. 각 부분이 독립적으로 발전할 수 있도록 다양한 서버 구성 요소를 단순화하고 분리할 수 있어요. 서버 애플리에키션의 플랫폼과 기술 변경은 클라이언트 애플리케이션에 영향을 주지 않아요. 애플리케이션 함수를 계층화하는 기능은 유연성을 더욱 향상시키는데, 예를 들면, 개발자는 애플리케이션 로직을 다시 작성하지 않고도 데이터베이스 계층을 변경할 수도 있죠.
독립성 : REST API는 사용되는 기술과 독립적으로 작용해요. API 설계에 영향을 주지 않고 다양한 프로그래밍 언어로 클라이언트 및 서버 애플리케이션을 모두 작성할 수 있어요. 또한 통신에 영향을 주지 않고 양쪽의 기본 기술을 변경할 수도 있습니다.
참고자료 : https://aws.amazon.com/ko/what-is/restful-api/
https://velog.io/@somday/RESTful-API-%EC%9D%B4%EB%9E%80