API Server란?
API Server는 요청에 대한 응답을, Endpoint를 통해 해주기 위해서 규격화 되어있는 서버라고 이해하면 쉽다. 예를 들어, 클라이언트 측에서 로그인을 하게되면 API서버를 통해서 DB와의 통신을 할 수 있는 것이라고 생각하면 된다.
REST API란?
API를 만들기 위한 하나의 방법이 REST인 것이며, 그렇게 만들어진 API가 REST API인 것이다.
- REST API의 디자인 가이드
- URI는 정보의 자원을 표현해야 한다. ( * 행위를 표현하는 것이 아님.)
- 자원에 대한 행위는 HTTP 메소드를 이용하여 표현해야 한다.
GET /members/delete/1
URI는 자원을 표현해야하지만, 지금 delete라는 행위를 표현을 하였다.
따라서, 위와 같은 표현은 올바르게 REST를 적용하지 않은 것이다.
위의 예시에서 원하는 URI(특정 자원의 위치를 나타내는 것)는 member 중에 1번 회원을 삭제하는 것이다.
그렇다면, 위 URI에서 GET이라는 행위 대신 delete라는 HTTP 메소드를 이용하여 URI를 표현해야한다.
DELETE /members/1
위와 같이 DELETE라는 HTTP 메소드를 사용하여 올바르게 표현할 수 있다.
[HTTP method의 역할]
- GET: GET을 통해 URI를 요청하면 리소스를 조회한다.
- POST: POST를 통해 URI를 요청하면 리소스를 생성한다.
- PUT: PUT을 통해 URI를 요청하면 리소스를 수정한다.
- DELETE: DELETE를 통해 URI를 요청하면 리소스를 삭제한다.
위와 같이 REST의 조건을 만족하여 API를 작성하게 되면, RESTful한 API라고 하는 것이다.
GraphQL이란?
GraphQL(Graph Query Language)는 우리가 흔히 하는 쿼리언어이며, API Server를 통해서 정보를 주고받기 위한 쿼리언어라고 생각하면 된다.
- 클라이언트 측에서 원하는대로 정보를 가져올 수 있다.
- 클라이언트 측에서 편하게 정보를 수정할 수 있도록 표준화된 Query Language이다.
REST와의 차이점
- REST에서는 리소스에 대한 형태정의와 리소스를 가져오는 방식이 연결되어있지만, GraphQL에서는 리소스에 대한 형태 정의와 리소스를 가져오는 방식이 완전히 분리된다.
- REST에서는 리소스의 크기와 형태를 서버사이드에서 결정하지만, GraphQL에서는 리소스에 대한 정보만 서버 사이드에서 정의하고, 필요한 크기와 형태는 클라이언트 측에서 요청 시에 결정한다.
- REST에서는 URI가 리소스를 나타내고, METHOD가 작업의 행위(유형)를 나타내지만, GraphQL에서는 Schema스키마가 리소스를 나타내고, Query/ Mutation 타입이 작업의 유형을 나타낸다.
- REST에서는 여러 리소스에 접근할 때 여러번의 요청이 필요하지만, GraphQL에서는 여러 리소스에 한번의 요청으로 접근할 수 있다.
- REST에서 각 요청은 해당 엔드포인트에 정의된 핸들링 함수를 호출하여 작업을 처리하지만, GraphQL에서는 요청 받은 각 필드에 대한 resolver를 호출하여 작업을 처리한다,
위의 차이점에서 1,2번 차이점에 대해 상세적으로 정리를 해보려고 한다.
- GET /books/1
{
"title": "Romance of the Three Kingdoms",
"author": {
"firstName": "Luo",
"lastName": "Guanzhong"
}
}
여기서 리소스의 타입 또는 형태와 리소스를 가져오는 방식이 연결되어 있다는 것이 REST의 특징이다.
/books 라는 리소스를 요청 하면 위의 JSON 파일의 형태의 데이터가 주어지게 된다.
위의 books 예시를 GraphQL로 옮기면 아래와 같다. 일단, Book과 Author라는 타입을 정의해야 합니다.
type Book {
id: ID
title: String
author: Author
}
type Author {
id: ID
firstName: String
lastName: String
books: [Book]
}
여기서 GraphQL 과의 큰 차이점은, GraphQL에서는 리소스의 유형과 리소스를 가져오는 방식이 완전하게 분리되어 있는 것이다. 지금 Book과 Author의 형태만을 정의했지, client에서 데이터를 어떻게 요청할 수 있는 지에 대해서는 아무런 정보가 없다.
Book과 Author에 접근할 수 있도록, Query라는 타입이 필요하다.
type Query {
book(id: ID!): Book
author(id: ID!): Author
}
- REST와 비슷한 방식으로 요청할 수 있다.
- /graphql?query={ book(id: "1") { title, author { firstName } } }
{
"title": "Black Hole Blues",
"author": {
"firstName": "Janna"
}
}
REST와는 다르게 /books등과 같이 각 Resource에 대한 엔드포인트가 따로 존재하지 않고, 하나의 엔드포인트만 존재합니다. 또한 해당 엔드포인트로 요청 시, 원하는 리소스와 해당 리소스에서 원하는 필드를 특정하는 GraphQL query를 함께 보냅니다. 위의 gql을 통해, id = 1 인 book의 title과 author의 firstName 만 가져올 수 있었습니다.
'backend > API Server' 카테고리의 다른 글
REST API (0) | 2022.09.02 |
---|