공학에서는 최적화(자원이 무한하지 않기 때문에), 복잡성 관리 (지능이 무한하지 않기 때문에)
두 가지가 중요하다.
그 중에서 복잡성 관리의 경우에는, 모듈화를 통해 해결할 수 있다.
일상생활에서 예를 들어보면, 옷을 온 집안에 다 널부러놓는 것 보다는 옷장에만 옷을 넣어놓는다면 복잡하지가 않게 된다.
옷장이라는 모듈화가 되는 것. 옷을 꺼내서 입고, 다시 옷장에 넣는 것.
<모듈과 인터페이스>
기본적으로 역할을 구분해야 한다. 역할 단위를 모듈이라고 보면 된다.
역할을 구분하는 것에서 멈추지 않고, 서로의 역할이 어떻게 작동하는지는 몰라도 된다.
예를 들어서, 월급을 받는 직장인들은 월급이 들어오는 금액과 일시만 알면 되는것이지 어떻게 해서 그 금액이 산출되었고 어떤 과정을 통해서 내 통장으로 월급이 들어오는지는 굳이 몰라도 된다. 월급을 어디서 받고, 어디서 출금할 수 있는지, 돈 관리를 할 수 있는 인터페이스만 있으면 되는 것이다.
그러니, 모듈이라고 하는 것은, 인터페이스와 블랙박스의 조합으로 생각하면 된다.
인터페이스 조작은 알지만, 그 조작이 어떻게 해서 가능하고 어떤 원리에 의해서 이루어지는지는 black box 라서 알 수 없다. 알 필요가 없는 것이라고 보는게 더 맞는 것 같기도 하다. 그러니 굳이 밖에서는 알 필요가 없는 것, 몰라도 되는 것을 black box 라고 표현할 수 있다. 자세하게는 몰라도 밖에서는 소통하는 방법만 알면 되는 것, 그러니 그 소통하는 것을 interface 라고 표현할 수 있다.
<인터페이스 --> specification (input, output)>
인터페이스는 결국, 인풋이 들어오면 아웃풋을 내는 것. 그 인풋이 들어오면, 왜 그 아웃풋이 나오는 건 모른다. 그걸 블랙박스. 아무튼, 인터페이스는 인풋과 아웃풋으로 구성된다고 보면 된다.
예를 들어, 자동차 인터페이스는 핸들을 돌리거나 엑셀, 브레이크, 깜빡이, 등등 그런 건 모두 인터페이스다. 인풋하면 아웃풋이 있다. 근데, 그게 왜 그렇게 작동할 수 있는 것인지는 모르는 것.
API도 복잡성 관리를 위해서 만들어진 것이라고 보면 된다.
우선, API 가 뭔지 공부가 필요하다.
API(응용 프로그램 인터페이스, Application Programming Interface)는 **두 소프트웨어 간에 정보를 주고받기 위해 설계된 인터페이스**입니다. 쉽게 말해, API는 서로 다른 프로그램이 "대화"할 수 있게 해주는 "약속된 규칙"이라고 볼 수 있습니다. 웹에서 흔히 사용하는 API는 주로 **클라이언트(요청을 보내는 쪽)와 서버(요청을 받아 처리하는 쪽)** 사이에서 정보를 주고받을 때 사용됩니다.
### API를 이해하기 위한 비유
API를 식당의 "메뉴"로 생각해 보겠습니다. 식당에서 고객이 음식을 주문하려면 메뉴가 필요하죠. 메뉴에는 주문할 수 있는 음식과 가격이 적혀 있습니다. **고객(API 요청자)**는 메뉴를 보고 주문을 합니다. 그리고 **주방(API 제공자)**은 메뉴에 있는 대로 음식을 만들어 고객에게 제공합니다.
이 과정에서 중요한 점은 고객이 주문한 음식이 어떻게 만들어지는지는 알 필요가 없다는 것입니다. 즉, **API는 요청자가 내부 동작을 몰라도 필요한 서비스를 요청할 수 있게 해주는 역할**을 합니다.
### API의 작동 방식
1. **클라이언트가 요청을 보냄**: 사용자가 정보를 요청하거나 특정 작업을 요청하면 클라이언트는 API 요청을 보냅니다. 예를 들어, "이 사용자의 정보가 필요해"라는 요청을 서버로 보낼 수 있습니다.
2. **서버가 요청을 처리함**: 서버는 클라이언트의 요청을 받아 처리합니다. 데이터베이스에서 정보를 가져오거나 계산을 수행하는 등 다양한 처리를 합니다.
3. **응답을 반환함**: 서버는 요청 처리 결과를 클라이언트에게 응답으로 보내줍니다. 클라이언트는 이 응답을 받아 화면에 표시하거나 다른 작업에 활용할 수 있습니다.
### API의 주요 요소
- **엔드포인트(Endpoint)**: API가 접근할 수 있는 특정 URL입니다. 예를 들어 `https://api.example.com/user/123`와 같은 URL은 사용자 정보를 가져오는 API의 엔드포인트가 될 수 있습니다.
(유료 API의 경우에는 key, API 접근 권한이 있는 key가 필요하다)
★ 근데, 엔드포인트의 경우에는, 사용자가 UI(User Interface)를 통해서 어떤 request를 나(내가 만든 앱이나 서비스나 시스템 등)에게 주면, 그러면 나는 엔드포인트 (API의 URL)로 접근을 하고 거기서 내어준 response를 나는 사용자에게 보여주는 방식이라고 이해하면 된다. 그러니까 endpoint의 경우에는 API URL인데, 만약 개인에게 자동으로 어떤 뉴스 기사 정보를 알려주는 기능을 구현하고 싶으면? 예를 들어서, 어떤 단어가 들어간 기사가 발행되면 그 기사를 나에게 알려줘, 라는 식으로 구현하려면, 그 기사 정보를 나에게 알려줘야 하는데 그럴 때 나의 URL 이 필요하다.
그럴 때, webhook (web에서 나에 뭔가를 보내기 위해 필요한 나의 주소, URL) 이라고 한다. 그러니까 무슨 알림 기능을 받는다는 건, webhook 기능이 필요하다는 것. 엔드포인트의 경우에는 내가 직접 요청을 했기 때문에 돌려받으면 되는것이니까 차이가 있는 것.
1. **API 엔드포인트**: 사용자가 UI를 통해 어떤 요청을 보내면, 그 요청은 특정 API URL(즉, 엔드포인트)을 통해 API 서버로 전달됩니다. 엔드포인트는 API 서버가 요청을 받고 처리하여 응답을 돌려주는 URL입니다. 따라서 엔드포인트는 **내가 요청을 보내고 응답을 받는 위치**라고 이해하시면 됩니다. 예를 들어, "내가 '특정 키워드를 포함한 최신 뉴스 기사'를 요청했을 때, 서버가 해당 기사의 정보를 나에게 반환하는" 시나리오에서, 서버의 특정 URL(엔드포인트)을 통해 요청을 주고받는 방식이죠.
2. **Webhook**: 반대로, 특정 이벤트가 발생했을 때 **내가 서버의 요청을 기다리지 않아도 자동으로 알림을 받는 방식**입니다. 예를 들어, 뉴스 기사와 관련된 특정 이벤트가 발생하면, 서버가 자동으로 나의 URL(즉, 웹훅으로 등록된 URL)로 알림을 전송합니다. **웹훅은 이벤트 발생 시 서버가 나에게 데이터를 보내기 위한 내 URL**이라고 이해하시면 됩니다. 따라서 알림 기능을 원할 때 웹훅이 필요합니다.
요약하면:
- **엔드포인트**: 내가 직접 API 서버에 요청하여 응답을 받는 위치 (API URL)
- **웹훅**: 서버가 나에게 알림을 보내기 위해 설정하는 내 URL
따라서 알림을 자동으로 받기 위해서는 웹훅 설정이 필요하고, 직접 요청하여 정보를 받을 때는 엔드포인트를 사용합니다.
<<HTTP, request, response 등의 개념이 나오는 이유는, API 거의 대부분이 HTTP 프로토콜을 통해서 데이터를 주고 받기 때문임.>>
- **HTTP 메서드**: 요청의 종류를 나타내며, 흔히 사용하는 HTTP 메서드는 다음과 같습니다:
- `GET`: 데이터를 가져올 때 사용합니다. (예: 사용자 정보 가져오기)
- `POST`: 새로운 데이터를 서버에 전송할 때 사용합니다. (예: 사용자 정보 생성)
- `PUT`: 기존 데이터를 수정할 때 사용합니다.
- `DELETE`: 데이터를 삭제할 때 사용합니다.
- **요청(Request)**와 **응답(Response)**: 클라이언트가 서버로 요청을 보내고, 서버는 그에 대한 응답을 클라이언트에 보내는 구조입니다.
- **JSON 형식**: API에서 주로 사용하는 데이터 포맷입니다. 텍스트 기반의 구조화된 데이터 형식으로, 클라이언트와 서버 간의 데이터 교환에 널리 사용됩니다.
### 예시: AI API 사용하기
1. **요청 생성**: 클라이언트가 AI 모델에게 질문을 보내려는 경우, API에 `POST` 요청으로 질문을 보냅니다.
2. **서버 처리**: AI 서버는 질문을 받아 처리하고, 적절한 답변을 생성합니다.
3. **응답 반환**: 서버는 생성된 답변을 JSON 형식으로 클라이언트에 반환합니다.
예를 들어, AI API에 질문을 보내는 경우:
```python
import requests
url = "https://api.ai-provider.com/ask"
data = {
"question": "What is an API?",
"key": "YOUR_API_KEY" # 인증을 위한 API 키
}
response = requests.post(url, json=data)
print(response.json())
```
### API의 장점
- **서버와 클라이언트 분리**: 클라이언트가 서버의 내부 구현을 몰라도 기능을 이용할 수 있어 소프트웨어 개발이 유연해집니다.
- **확장성**: 다른 애플리케이션과의 통합이 쉽고 새로운 기능을 추가할 때마다 API를 확장할 수 있습니다.
- **표준화**: 공통된 규격(REST API, JSON)을 통해 일관성 있는 데이터 통신을 할 수 있습니다.
### 결론
API는 **프로그램 간의 원활한 데이터 교환**을 위한 규칙이자 통신 방법입니다. 특히 AI API를 사용할 때는 클라이언트가 데이터를 보내고 AI 서버가 처리 후 응답을 보내는 방식으로, 쉽게 AI 모델의 기능을 활용할 수 있습니다.
API에 대해서는 대략적으로 이해가 되었을 것.
예시로, 주소 찾는 기능을 제공하는 것이 있다고 해보자.
어떤 홈페이지를 갈때마다 회원가입을 해야 하는데, 그럴 때마다 자기 집 주소를 찾아줄 수 있는 기능을 그 홈페이지가 구현하고 있다고 생각하면 굉장히 복잡해질 수 있다. 그러니까 그 홈페이지 관리자는, 주소찾는 기능은 외부에 있는 API를 통해서 구현하는 것이다. 그래서 회원가입을 할 때, 주소 입력하는 건 다 비슷비슷한 이유가 그것이다.
또 다른 예로는, 간단인증 하는 것. 그리고 PASS 인증하는 것. 등등. 본인 인증을 해야 하는데, 그럴때마다 만나게 되는게 간단인증이나 PASS 인증이다. 어디를 가든, 다 비슷비슷할 것이다. 그러니까 그 모든 곳들이 해당 인증 API를 불러와서 사용하는 것이라고 생각하면 된다.
자, 이제 랜덤한 응답, 정해진 목록 내에서 랜덤한 답장을 해주는게 아니라 AI API를 통해서 답변을 받아와서 응답을 해주는 걸 구현할거다.