본문 바로가기
Web

[Web] REST API와 GraphQL

by DuncanKim 2022. 7. 5.
728x90

[Web] REST API와 GraphQL

 

~목차~

  1. RESTful API
  2. GraphQL
  3. REST API와 GraphQL의 비교

 

1. RESTful API

 

RESTful API

 

1) REST API 간단 요약

 

RESTful API는 HTTP 요청을 사용하여 데이터에 액세스하고 사용하는 애플리케이션 프로그램 인터페이스(API)의 아키텍처 스타일이다.  GET, PUT, POST 및 DELETE 등의 메소드를 활용하여 서버에 있는 리소스에 접근하고, 그것을 json 등의 파일 형태로 받아오는 방식인 것이다. 하는 데 데이터를 사용할 수 있다.

 

쉽게 설명하면 다음과 같다.

 

 

소프트웨어가 다른 소프트웨어로부터 지정된 형식으로 요청, 명령을 받을 수 있는 수단을 API(Application Programming Interface)라고 한다. 기상청의 서버에서 온도를 받아오는 것과 같은 것이 그것이다.

 

서버에 무엇인가를 요청할 때, 그 데이터에 대한 정보가 어디에 저장이 되어 있는지, 그것을 어떻게 뭐 값을 가져올 것인지, 새로 쓸 것인지 아니면 지울지를 항상 쳐야 한다면 '불편함'이 생길 것이다. 그것을 방지하기 위해 'REST'라는 개념을 덧붙인 것이다.

 

우리는 '도메인'에 대해 알고 있다. 

 

2022.06.24 - [IT 지식/Web] - [Web] DNS가 뭘까? 도메인, A Record, CName

 

[Web] DNS가 뭘까? 도메인, A Record, CName

[Web] DNS가 뭘까? 도메인, A Record, CName (Domain Name System) www.naver.com naver.com이 도메인이다. www는 호스트네임이라고 한다. 호스트 네임은 mail, blog 등 다양하게 있을 수 있다. 도메인은 IP 주소..

masterpiece-programming.tistory.com

그 도메인 뒤에 /map/post/~~~~~ 이런 식으로 붙어있는 것이 있지 않은가. 그것 처럼 거기에 메소드(GET, POST 등)를 붙이고 서버에 저장된 자원의 이름을 붙여주면, 서버에서 알아서 그 정보에 대해 전달하고, 우리는 받을 수 있는 것이다.

 

 

 

2) REST의 특징

 

(1) Uniform(유니폼 인터페이스)

유니폼 인터페이스는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍쳐 스타일이다.

 

** URI(Uniform Resource Identifier) : 통합 자원 식별자. 인터넷에 있는 자원을 나타내는 유일한 주소. 하위 개념으로 URL과 URN이 있다.

 

(2) Stateless(무상태성)

API 서버가 들어오는 요청만을 단순히 처리한다. 이렇게 되어 서비스의 자유도가 높고, 서버에서 불필요한 정보를 관리하지 않아 구현이 단순해 진다.

 

(3) Cacheable(캐시가 가능)

HTTP라는 기존 웹표준을 그대로 사용하기 때문에, 웹에서 사용하는 기존 인프라를 그대로 활용할 수 있다. 그래서 HTTP가 가진 캐싱 기능을 적용할 수 있다. HTTP 프로토콜 표준에서 사용하는 Last-Modified 태그나 E-Tag를 이용하면 캐싱 구현이 가능하다.

 

(4) Self-descriptiveness(자체 표현 구조)

REST API 메시지만 보고도 이를 쉽게 이해할 수 있는 자체 표현 구조로 되어 있다.

 

(5) Client - Server 구조

REST 서버는 API를 제공하고 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보) 등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 상호 간 의존성이 줄어드는 장점이 생긴다.

 

(6) 계층형 구조

REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, Gateway 같은 네트워크 기반의 중간 매체를 사용할 수 있게 한다.

 

 

3) 핵심 규칙

 

URI는 정보의 자원을 표현해야 한다.

자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)로 표현한다.

 

(1) 정보의 자원을 표현하지 않은 사례

GET /members/delete/1

delete는 행위이다. 리소스의 이름은 동사보다는 명사를 활용해야 한다. members면 그 안에 vip인지, 아니면 골드, 실버 회원인지, 탈퇴회원인지 명시적으로 네이밍을 해야 한다.

 

(2) 제대로 표현한 사례

 

GET /members/1            // /members/show/1 (x)
POST /members/2           // /members/delete/2 (x)

 

(3) 각각의 메소드의 역할

 

네 가지의 메소드를 가지고 CRUD를 할 수 있다.

Method 역할
POST POST를 통해 해당 URI를 요청하면 리소스를 생성한다.
GET GET을 통해 해당 리소소를 조회한다. 리소스를 조회하고 해당 문서에 대한 자세한 정보를 가져온다.
PUT PUT을 통해 해당 리소스를 수정한다.
DELETE DELETE를 통해 리소스를 삭제한다.

 

마지막으로...

RESTful API는 형식(아키텍쳐)이기 때문에 기술에 구애받지 않는다. 앱을 만들든, 웹사이트를 만들든 자바스크립트든 파이썬이든 자바든 어떤 것을 쓰던지 간에 거기에 소프트웨어간에 HTTP로 정보를 주고 받는 부분이 있다면, 이 규칙을 준수해서 RESTful한 서비스를 만들 수 있다. 

 

 

 

2. GraphQL

 

한편, GraphQL은 무엇일까?

 

1) GraphQL 간단 요약

 

페이스북에서 만든 쿼리 언어이다. 풀 네임이 Graph Query Language이다. SQL과 마찬가지로 쿼리 언어인 것이다.

하지만, sql과 언어적 구조 차이는 매우 크다. sql은 데이터베이스 시스템이 저장된 데이터를 효율적으로 가져오는 것이 목적이고, GraphQL(이하 gql)은 웹 클라이언트가 데이터를 서버로부터 효율적으로 가져오는 것이 목적이다. sql의 문장은 주로 백엔드 시스탬에서 작성하고 호출하는 반면, gql의 문장은 주로 클라이언트 시스템에서 작성하고 호출한다.

 

2) sql과의 차이점

 

(1) sql의 query 예시

SELECT plot_id, species_id, sex, weight, ROUND(weight / 1000.0, 2) FROM surveys;

 

(2) gql의 query 예시

{
  hero {
    name
    friends {
      name
    }
  }
}

 

GraphQL Pipeline

 

3) 사용방법

GraphQL은 쿼리와 뮤테이션 두 가지 타입으로 API 요청을 보낸다.

 

(1) Query Type : RESTful에서 get에 해당하는 쿼리

 

query {
	book(id: "1"){
    	title
        author{
        	firstName
            lastName
        }
    }
}

resolver에 정의된 book 함수를 호출해서 id가 1인 데이터를 검색해오는데, 응답 column은 title과 author를 받겠다는 의미의 쿼리이다.

이렇듯 함수 호출 후, 중괄호 안에 응답받을 특정 컬럼을 입력해서 보내주면 알아서 척척 '특정' 컬럼만 받아온다.

 

cf. RESTful API는 '모두' 받아와버린다.

 

(2) mutation Type : RESTful에서 DELETE, POST, UPDATE에 해당하는 쿼리

 

mutation {
	postTeam(input: {
    	manager : "John"
        office : "102B"
        extension_number : "#1111"
        mascot : "G-Dragon"
    }) {
        manager
        office
        extension_number
       	}
}

resolver에서 정의된 postTeam 함수를 호출하여 Team 데이터를 입력하는 쿼리이다. 입력후 응답은 manager, office, extension_number 컬럼만을 받는다. 중괄호 안에 응답받을 컬럼을 입력하여 선택적으로 응답을 받아오는 것이다.

쿼리 타입과 차이점은 RESTful에서 post 형식으로 데이터를 보내는 것 같이 input을 통해 데이터를 전송한다.

 

 

3. REST API와 GraphQL의 비교

출처 : https://blog.apollographql.com/graphql-vs-rest-5d425123e34b

REST API의 경우, 사용자가 각각의 데이터를 받아오기 위해 리소스와 메소드를 입력하면 그것에 대해서만 가져온다. 반면 GraphQL의 경우, 사용자가 원하는 것을 Resolver가 수집하고 해석을 해서 API로 접근하여 필요한 소스들을 긁어보아서 다시 사용자에게 전송을 한다.

 

GraphQL은 API를 위한 쿼리 언어이자 서버측 런타임으로 클라이언트에게 요청한 만큼의 데이터를 제공하는 것을 우선 순위로 한다. REST API와는 다르게, 클라이언트가 가져올 데이터를 설정하여 그 값만 받아올 수 있는 장점이 있지만, 그만큼 세부적으로 받아올 데이터를 명시해주어야 하는 번거로움이 단점으로 작용한다.

 

REST API의 경우 사용자가 필요로 하지 않는 데이터도 모두 받아올 수 있다. 하지만, 세부적으로 어떤 데이터를 필요로 하는지 명시해줄 필요가 없어서 요청시에 간단하게 할 수 있다는 점이 장점이다.

 

한편, REST API와 GraphQL은 동시에 사용을 할 수 있다. 각각의 장점을 살려서 어떤 부분에서는 REST API를 사용하고, 어떤 부분에서는 GraphQL을 사용하는 것이 가능하다.

 

 

 

 

 

 

 

 

 

<reference>

https://meetup.toast.com/posts/92

ttps://www.techtarget.com/searchapparchitecture/definition/RESTful-API

https://tech.kakao.com/2019/08/01/graphql-basic/

https://vnvn31.tistory.com/entry/GraphQL-사용법

728x90

댓글