API 와 REST API의 개념

API (Application Programming Interface)

- API는 App 끼리 연결시켜주는 매개체이자 약속

API작성

Front-end 에서 원하는 기능을 수행하는 URL과 인터페이스를 제공한다는 의미
API에서 원하는 데이터르 받아 DB에 저장하고, 저장되어 있는 데이터를 읽어서 
Front-end에 제공하는 행위로 사용자가 원하는 목적을 이룰 수 있게 해야 함

REST API (RESTful API)

Repersentational State Trensfer
REST는 www와 같은 HTTP 시스템을 위한 소프트웨어 아키텍쳐의 한 형식
네트워크 표현수단으로 사람이 봐도 이해하기 쉬운 표현으로 정의한다
'자원'을 정의하고, '자원'을 중심으로 표현을 구상하는 원칙을 제시 <img src = 'https://user-images.githubusercontent.com/114923190/209467694-ace52b10-577b-4661-87b9-578a52722fa5.png' width = '800'>

1. 자원 Resource URL
	우리가 만들 소프트웨어가 관리하는 모든것을 자원으로 표현
	쇼핑몰이라면 상품에 대해 정보를 관리할것이고, 장바구니에 담긴 상품들도 관리해야한다.
2. 행위 - HTTP method
	GET은 자원의 조회 / POST는 자원의 생성
	CRUD 
		Create : 생성 (POST)
		Read : 조회 (GET)
		Update : 수정 (PUT / PATCH)
		Delete : 삭제 (DELETE)
3. 표현
	보통 JSON / XML 같은 형식 사용
	HTTP에서는 Content - Type 헤더를 통해 표현 방법을 서술 

REST API 를 사용한 이유

REST API 는 대부분의 Framework에서 사용가능하며, 그 접근이 용이하여 사용하였습니다. 각 특성을 설명하자면

  1. 단순성: 표준 HTTP Method 및 규칙에 의존하기 때문에 설계, 이해 및 구현이 간단합니다.
  2. 확장성: 많은 수의 요청을 처리할 수 있으므로 대량의 클라이언트 또는 데이터 지원이 필요한 프로젝트에 적합합니다.
  3. Stateless: 클라이언트에서 서버로의 각 요청이 독립적인지 확인하여 서버가 상태 정보를 유지하도록 요구하지 않음으로써 성능과 안정성을 향상시킵니다.
  4. 캐시 가능: 응답을 캐시하여 서버 로드를 줄이고 자주 요청되는 리소스에 대한 응답 시간을 개선합니다.
  5. 상호 운용성: JSON 또는 XML과 같은 표준 웹 프로토콜 및 데이터 형식을 준수하므로 웹 애플리케이션, 모바일 앱 및 기타 서버를 포함한 다양한 클라이언트에서 쉽게 사용할 수 있습니다.
  6. 언어 불가지론: 클라이언트는 HTTP를 지원하는 모든 프로그래밍 언어를 사용하여 REST API와 상호 작용할 수 있으므로 광범위한 프로젝트에 적합합니다.
  7. 간편한 디버그 및 테스트: HTTP에 대한 단순성과 의존성 덕분에 웹 브라우저, 명령줄 도구 또는 전용 API 테스트 애플리케이션과 같은 표준 도구를 사용하여 REST API를 쉽게 디버그하고 테스트할 수 있습니다.
  8. 광범위한 채택: REST 아키텍처는 널리 채택되고 잘 지원됩니다. 이는 개발자가 REST API로 작업하는 데 도움이 되는 풍부한 리소스, 라이브러리 및 도구가 있음을 의미합니다.

REST API의 대안

  1. GraphQL : Facebook 개발 / 클라이언트가 필요한 데이터를 정확히 요청할 수 있도록 하는 API용 쿼리 언어 및 런타임
    • REST API 비해서 데이터 검색에서 더 많은 유연성 및 효율성을 제공 사용가능 언어
    • JavaScript: Apollo Client, Relay
    • Python: Graphene, Ariadne
    • Java: GraphQL Java, graphql-java-tools

  1. gRPC: Google 개발 / 효율적인 직렬화를 위해 프로토콜 버퍼를 사용하는 고성능 오픈 소스 RPC(원격 프로시저 호출) 프레임워크입니다.
    • 마이크로 서비스 간의 대기 시간이 짧고 처리량이 많은 통신에 적합합니다.사용가능 언어 사용가능 언어
      • JavaScript: gRPC-Web, gRPC-node
      • Python: gRPC Python
      • Java: gRPC Java

  1. SOAP: Simple Object Access Protocol의 약자로 SOAP는 웹 서비스에서 구조화된 정보를 교환하기 위한 프로토콜입니다.
    • 메시지 형식화를 위해 XML에 의존하고 일반적으로 전송을 위해 HTTP를 사용합니다.
    • SOAP는 REST보다 더 엄격하고 장황하지만 보안 및 트랜잭션 무결성에 대해 더 강력한 보증을 제공할 수 있습니다. 사용가능 언어
      • JavaScript: Node-soap, Strong-soap
      • Python: Zeep, Suds
      • Java: JAX-WS, Apache CXF

  1. Fast API : Open Source 개발 / 최신 Python 웹 프레임워크로 Python의 ASGI(Asynchronous Server Gateway Interface) 표준을 사용하여 고성능 API를 쉽게 구축할 사용가능 언어
    • Python

  1. Websocket: Websocket은 단일 장기 연결을 통해 클라이언트와 서버 간의 양방향 실시간 통신을 가능하게 합니다.
    • 채팅 응용 프로그램, 온라인 게임 또는 금융 거래 플랫폼과 같이 실시간 업데이트 또는 대기 시간이 짧은 통신이 필요한 응용 프로그램에 특히 유용합니다. 사용가능 언어
      • JavaScript: Socket.IO, WebSocket API (built-in)
      • Python: Django Channels, Flask-SocketIO, Websockets
      • Java: Java WebSocket API, Spring WebSocket
  2. SSE(Server-Sent Events): SSE는 서버가 단일 HTTP 연결을 통해 클라이언트에 업데이트를 보낼 수 있도록 하는 기술입니다.
    • Websockets보다 간단하고 서버에서 여러 클라이언트로의 실시간 업데이트와 같은 단방향 통신에 적합합니다. 사용가능 언어
      • JavaScript: EventSource API (built-in)
      • Python: Django Channels, Flask-SSE
      • Java: Spring WebFlux, JAX-RS (Java EE)
  3. 메시지 대기열(예: RabbitMQ, Kafka): 메시지 대기열은 분산 시스템 간의 비동기 통신을 가능하게 하는 미들웨어 솔루션입니다.
    • 생산자와 소비자를 분리하여 복잡한 시스템에서 확장성과 내결함성을 높일 수 있습니다. 사용가능 언어
      • RabbitMQ: Pika (Python), amqp.node (Node.js), Spring AMQP (Java)
      • Kafka: Confluent-kafka-python (Python), node-rdkafka (Node.js), Kafka-clients (Java)