본문 바로가기
CS/WEB

API

by I move forward every day. 2024. 5. 11.

출처: https://dev.to/ayushi7rawat/what-is-an-api-api-for-beginners-4mfh

API 란?


API (Application Programming Interface)는 둘 이상의 소프트웨어가 서로 통신하는 방법이자 컴퓨터 사이에 있는 중계 계층을 의미한다. 

API는 프로토콜, 메서드, 데이터타입 등이 정의된 중계계층이다.

Interface

인터페이스는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우 접점이나 경계면이다. 요청과 응답을 사용하여 소프트웨어가 통신하는 방법을 정의하고, API 문서에 개발자가 정의한 요청과 응답을 구성하는 방법을 기술한다. 이를 통해 해당 컴퓨터의 내부서버가 어떻게 구현되어 있는지 상관없이 인터페이스를 통해 통신 등이 가능하다.

 

예를 들어 우리는 네이버웹툰에 서버, DB 등... 어떻게 구성되어 있는지 아는 게 없다 그러나 인터페이스를 통해서 웹툰을 볼 수 있다. 내부서버의 구현은 모르나 서비스를 이용할 수 있다. 예제로 아래 주소를 호출했을 경우 우리는 내부서버의 구현을 모른 체 웹툰을 볼 수 있다.

ex) https://comic.naver.com/webtoon/list?titleId=777767

 

API의 장점


상호 운용성

API는 다른 시스템이나 서비스와 통신할 수 있는 표준화된 방법을 제공하여 다양한 플랫폼 간에 데이터를 교환하고 상호 작용할 수 있다.

확장성

API를 사용하면 시스템이나 서비스를 확장하기가 훨씬 쉬워진다. 새로운 기능을 추가하거나 기존 기능을 업데이트하면서도 API를 통해 외부 애플리케이션과의 호환성을 유지할 수 있다. 예를 들어 내부 프로세스 즉, DB튜닝 또는 성능개선을 진행하여 성능이 좋아졌다는 걸 외부에 알릴 필요가 없는 것이다.

재사용성

API를 사용하면 이미 개발된 기능을 다시 사용하여 시간과 비용을 절약할 수 있다. 다른 애플리케이션에서도 동일한 API를 사용하여 같은 기능을 재사용할 수 있다. 예를 들어 어떠한 기능을 직접 구현하려면 저장방법, 암호화, 보안처리 등.. 을 생각해야 한다. 그러나 OPEN API를 사용한다면 많은 과정을 생략하고 API만을 호출하면 된다.

추상화

API는 서비스의 핵심 기능을 외부에 노출하고, 내부 동작을 숨기는 추상화된 인터페이스를 제공한다. 예를 들어 DB 설계 구조, 서버의 상수값 등 드러내고 싶지 않은 정보를 드러내지 않고 드러내고 싶은 부분만을 드러낼 수 있다. 이를 통해 사용자는 서비스의 핵심 기능에만 집중할 수 있으며, 내부 구현에 대해 신경 쓸 필요가 없다.

캡슐화

API는 서비스의 내부 구현을 외부로부터 은닉하여, 사용자에게 해당 서비스의 구현을 알 필요 없이 오직 인터페이스를 통해서 필요한 정보만을 받을수 있게 한다.

 

API의 종류


private

  • 비공개 API로서, 주로 내부 시스템 또는 조직 내부에서 사용된다.
  • 주로 내부 시스템 간의 통합에 사용되며, 외부 개발자에게 공개되지 않는다.
  • 해시키를 하드코딩해놓고 이를 기반으로 서버와 서버 간의 통신을 한다.
  • 인증 및 권한 부여 메커니즘을 통해 접근을 제한할 수 있다.

public

  • 공개 API로서, 모든 사람이 사용할 수 있다.
  • 주로 문서화 되어있으며, 외부 사용자가 사용하기 쉽게 되어있다.
  • 공개 API를 이용하여 외부 개발자가 애플리케이션을 빠르게 개발할 수 있다.

 

Node.js를 이용해 간단한 API 구현


API 구현을 통해 확장성에 대한 효과를 직접 살펴보자. 아래 코드는 3000번 포트로 API 서버를 실행하고 "/tistory" 엔드포인트에 대한 GET 요청을 처리한다.

// api.js
const express = require("express"); // express framework 모듈
const app = express();
const port = 3000;
const fs = require("fs");

// 엔드포인트 "/tistory" 에 대한 GET 요청을 처리
app.get("/tistory", (req, res) => {
  const f = JSON.parse(
    fs.readFileSync("example.json", {
      encoding: "utf-8",
    })
  );
  const data = {
    name: f.name,
  };
  res.send(data);
});

// 3000 포트로 서버 실행
app.listen(port, () => {
  console.log(`http://127.0.0.1:${port}`);
});
// example.json
{ "name": "tistory", "age": 20 }

엔드포인트 "/tistory"에 대한 응답으로 name 값을 전달해주고 있다. 이때 아래와 같이 age값을 20이 아닌 30,40으로 바꾸거나 새로운 키값이 추가된다고 생각해 보자.

{ "name": "tistory", "age": 30, "weight": 75 }

age값을 변경하고 weight라는 키값을 추가해 보았다. 그러나 클라이언트는 name에 대한 값만 응답받기 때문에 age값의 변경과 weight에 대한 데이터가 추가된 것을 알 수 없다. 이러한 면에서 확장성에 대한 장점이 드러난다. 새로운 기능을 추가하거나 기존 기능을 업데이트하면서도 외부에 알릴 필요가 없다.

 

참조


CS 지식의 정석(큰 돌)

'CS > WEB' 카테고리의 다른 글

가상머신  (0) 2024.05.12
XML  (0) 2024.05.10
JSON  (0) 2024.05.09