Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Spring Boot
- MySQL
- gradle
- jenkins maven
- grpc
- REACT
- jenkins 설치
- vue.js
- MongoDB
- grafana
- jpa
- Jenkins
- jenkins github 연동
- nginx
- java
- IntelliJ
- jenkins github
- Linux
- jenkins install
- subnetmask
- docker network
- Jenkins Pipeline
- error
- 리눅스
- Docker
- spring
- jenkins jdk
- CI/CD
- JavaScript
- 리액트
Archives
- Today
- Total
뭐든 즐기면서 ;)
[이론] REST API / GraphQL 본문
728x90
API(Application Programming Interface)
API는 다른 애플리케이션에서 접근하여 정보 또는 기능에 접근할 수 있도록 하는 인터페이스이다.
API Architecture style로는 RPC, SOAP, REST, GraphQL 등이 있다.
각 Architecture는 표준화된 데이터 교환 절차와 규격을 가지고 있다.
필자는 여러 API Architecture 중 REST와 GraphQL을 기준으로 포스팅 작성을 할 것이다.
REST와 GraphQL탄생 이유를 알기 위해, 이전에 사용되던 RPC, SOAP의 사용법과 단점을 간단하게 알아보자.
RPC
사용법
서버의 함수를 클라이언트 로컬의 함수처럼 호출하여 사용할 수 있음.
# 서버 코드 (Python)
def add(a, b):
return a + b
# 클라이언트 코드
result = remote_call("add", [5, 10])
print(result) # 서버의 add 함수가 호출되어 15를 반환
위와 같이 서버/클라이언트가 구성되어 지면, 네트워크 요청/응답은 아래와 같다.
* 아래는, http 기반 통신을 할 때의 예제이고, rpc는 http외의 프로토콜을 이용해 통신할 수도 있다.
# 요청
POST /rpc HTTP/1.1
Host: example.com
Content-Type: application/json
{
"method": "add",
"params": [5, 10]
}
# 응답
HTTP/1.1 200 OK
Content-Type: application/json
{
"result": 15
}
단점
- 플랫폼 종속적 : 클라이언트와 서버가 같은 언어를 사용해야 함. 서로 다른 언어일 경우, 추가 작업이 필요함.
- 유연성 부족 : 서버의 함수명이 바뀌면 클라이언트 코드도 바꾸어줘야 함.
- 방화벽 문제 : http 기반 통신이 아니라 다른 프로토콜을 이용할 경우, 특정 포트에 대한 방화벽 작업을 한 후에 이용 가능.
SOAP
사용법.은 따로 검색해 보시길.. 걍 복잡함..
단점
- 복잡성 : xml기반으로, 데이터 형식 복잡. 데이터량이 큼.
- 표준 요구: WSDL(Web Services Description Language)이라는 별도의 인터페이스 정의 언어를 사용해야 하며, 구현이 복잡.
- 성능 문제: 데이터 처리 속도가 느리고, 리소스를 많이 소비함.
- HTTP의 장점을 활용하지 못함: SOAP는 단순히 HTTP를 전송 프로토콜로 사용할 뿐, HTTP 메서드(GET, POST 등)나 상태 코드와 같은 특징을 사용하지 않음.
REST API
RPC와 SOAP의 단점들을 보완하여 탄생한 API Architecture Style 중 하나.
특징
- 리소스(데이터) 별 엔드 포인트 존재. /users/{id}/posts , /users/{id}/products
- 클라이언트는 서버에서 응답해주는 데이터를 그대로 가져가야 함. 즉, 주고받는 데이터 중 불필요 데이터가 포함되어 있을 수 있음.
- http 이용. http를 이용하게 됨으로써 아래와 같은 특징들을 가지게 됨.
- 요청 header 설정을 통해 캐싱 가능.
- Stateless함. 각 요청은 독립적이며, 요청마다 필요한 모든 정보를 넘겨야 함. 클라이언트 측의 상태를 유지하고 있을 필요 없음.
- 서버의 부하 줄임.
- CRUD 작업 구분은 http method를 이용함.
- GET 조회
- PUT 전체 수정
- PATCH 일부 수정
- POST 생성
- DELETE 삭제
- ...
- 실시간 데이터 적용 불가. 실시간 적용을 위해서는 별도 기술 적용 필요. websocket 등..
단점
- Over-fetching : 위에 특징에 적어둠. 불필요한 데이터를 주고받게 될 수 있음.
- Under-fetching : 필요한 데이터를 가져오기 위해 여러번 요청을 해야 함. '/users', '/users/{id}/posts'
- 과도한 네트워크 요청으로 이어질 수 있음.
- API 스키마 유연성 부족 : 새로운 데이터 요구 사항이 추가되면, 엔드포인트 수정 또는 추가가 되어야 함.
GraphQL
REST의 단점들을 보완하여 탄생한 API Architecture Style 중 하나.
특징
- 엔드포인트는 '/' 하나만 존재.
- 필요 데이터는 클라이언트에서 지정 요청 가능. 즉, 불필요 데이터에 대해서 주고받을 필요 없음.
- http method는 POST만 이용.
- body에 GraphQL 쿼리를 입력해야 하기 때문임.
- http를 이용하기 때문에 rest api와 같이 stateless한 상태를 가지지만, 요청마다 다른 동적인 형태의 데이터 요청을 할 수 있음.
- GraphQL은 데이터가 동적일 수 있다는 점에서, http를 이용함에도 불구하고 캐싱 작업은 제한적일 수 있음.
- GraphQL 쿼리 이용하여 CRUD 작업 요청.
- R(조회) - body에 'query' 작성
- 그 외 - body에 'mutation' 작성
- 실시간 데이터 처리 가능.
- GraphQL 쿼리 중 body에 subscription을 작성하여 가능.
GraphQL은 REST와 HTTP의 철학에서 벗어나 클라이언트 중심의 데이터 페칭에 초점을 맞춘 아키텍처 스타일이다. HTTP의 기능을 잘 활용하지 못한다는 점이 단점이 될 수 있지만, 이를 통해 얻는 데이터 페칭의 유연성과 효율성이 더 큰 장점으로 작용할 수 있다.
- 한계: HTTP의 메서드와 상태 코드 활용 부족, 캐싱 제약.
- 장점: 필요한 데이터만 요청, 단일 엔드포인트, 유연한 쿼리 작성.
728x90
'IT정리' 카테고리의 다른 글
Gradle 로컬 저장소 라이브러리 추가 (0) | 2023.11.13 |
---|---|
Thread / Java Thread (0) | 2023.01.02 |
Error : org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean (default-clean) (0) | 2022.12.22 |
일급 객체(First Class Object) (0) | 2022.12.16 |
LRU(Least Recently Used) (0) | 2022.04.30 |
Comments