REST API
REST (Representational State Transfer) API는 웹 서비스와 클라이언트 간에 정보를 교환하기 위한 아키텍처 스타일 및 접근 방식입니다. REST는 웹의 기본 구조를 활용하여 자원에 대한 CRUD (Create, Read, Update, Delete) 작업을 수행하게 됩니다.
자원(Resource) 지향적: REST는 웹 상의 모든 것을 자원으로 간주합니다. 각 자원은 고유한 URI (Uniform Resource Identifier)를 가지며, 이 URI를 통해 해당 자원에 접근할 수 있습니다.
무상태성(Statelessness): 각 요청은 서버에 모든 필요한 정보를 포함해야 합니다. 서버는 클라이언트의 상태 정보를 저장하지 않으며, 이로 인해 각 요청은 독립적으로 수행됩니다.
표현(Representation): 자원은 여러 형태의 표현을 가질 수 있습니다. 예를 들어, 서버는 데이터를 JSON, XML 등 다양한 형식으로 반환할 수 있습니다.
통신의 비공식성(Stateless Communication): RESTful 서비스는 일반적으로 HTTP 프로토콜을 사용하여 클라이언트와 통신합니다. HTTP 메서드 (GET, POST, PUT, DELETE 등)는 자원에 대한 CRUD 작업을 나타냅니다.
무작정성(Cacheable): 응답은 캐시 가능하거나 캐시 불가능하다는 방식으로 표시될 수 있습니다. 캐시 가능한 응답은 클라이언트 측에서 캐시될 수 있으며, 이로 인해 성능이 향상될 수 있습니다.
계층적 구조(Layered System): REST는 계층화 된 시스템을 지원합니다. 클라이언트는 최종 서버와 직접 통신하는지, 중간 계층을 통해 통신하는지 알 필요가 없습니다.
REST API는 웹 서비스와 클라이언트 간의 통신을 단순화하고, 표준화된 방식으로 자원을 조작할 수 있게 해주며, 이러한 특징 때문에 많은 웹 애플리케이션 및 서비스에서 선호되는 방식으로 사용됩니다.
GraphQL 과의 차이
1. 데이터 요청 방식:
REST API: 각 리소스 혹은 데이터 타입마다 고유한 엔드포인트가 있습니다. 원하는 데이터를 얻기 위해 여러 개의 엔드포인트를 차례대로 호출해야 할 수 있습니다.
예시:
사용자 정보를 가져오는 엔드포인트(/users/{id})와 해당 사용자의 게시물을 가져오는 엔드포인트(/users/{id}/posts)가 있을 때, 특정 사용자와 그의 모든 게시물을 가져오려면 두 개의 별도의 API 호출이 필요합니다.
GraphQL: 단일 엔드포인트에서 쿼리를 사용하여 원하는 모든 데이터를 한 번의 요청으로 가져올 수 있습니다. 클라이언트는 필요한 데이터의 구조를 명시하고, 서버는 그에 따라 응답합니다.
예시:
사용자와 그의 모든 게시물을 가져오려면 다음과 같은 쿼리를 사용할 수 있습니다.
2. 데이터의 오버/언더 페칭:
REST API: 엔드포인트는 고정된 데이터 구조를 반환합니다. 때로는 필요한 정보만을 가져오지 못하거나 (언더 페칭) 또는 필요 이상의 정보를 가져올 수 있습니다 (오버 페칭).
예시:
/users/{id} 엔드포인트는 이름, 이메일, 주소 등 사용자의 모든 정보를 반환할 수 있습니다. 만약 이름만 필요한 경우에도 이 모든 데이터를 받게 됩니다.
GraphQL: 클라이언트는 정확히 필요한 데이터만 요청할 수 있습니다. 이로 인해 오버/언더 페칭 문제를 피할 수 있습니다.
예시:
사용자의 이름만 필요한 경우 다음과 같이 요청할 수 있습니다.
{
user(id: "123") {
name
}
}
3. 버전 관리와 진화:
REST API: API의 변경 사항을 관리하기 위해 버전 관리가 필요할 수 있습니다 (예: /v1/users, /v2/users).
GraphQL: 새로운 필드를 추가하거나 기존 필드를 제거하는 것이 간단합니다. 클라이언트는 사용하지 않는 필드를 요청하지 않기 때문에 이전 클라이언트와의 호환성을 유지하는 것이 쉽습니다.
'Programming' 카테고리의 다른 글
[알고리즘] 프로그래머스 카펫 (0) | 2023.10.13 |
---|---|
[알고리즘] 프로그래머스 다음 큰 숫자 (0) | 2023.10.12 |
[TIL] 프론트엔드 성능 최적화 (0) | 2023.10.01 |
[TIL] useEffect (1) | 2023.09.30 |
[TIL] Event Loop (0) | 2023.09.28 |