API(Application Programming Interface)는 서로 다른 프로그램이 정해진 규칙에 따라 통신할 수 있도록 제공하는 인터페이스이다.
클라이언트 (client)API 문서요청 (request)서버 (server)응답 (response)
Request & Response요청(request)을 전송한다.응답(response)을 반환한다.GET: 데이터를 조회한다.POST : 데이터를 전송하거나 생성을 요청한다.PUT : 기존 데이터 전체를 수정한다. (교체)PATCH : 기존 데이터 일부를 수정한다.DELETE : 데이터를 삭제한다.OPTIONS : 사용할 수 있는 메서드를 확인한다.200 : 요청 성공 → 요청 성공404 : 요청한 자원을 찾을 수 없다. → URL 경로가 잘못되었거나, 요청한 데이터가 존재하지 않는 경우500 : 서버 내부 오류 → 서버 코드 실행 중 예외 발생 등으로 정상 처리하지 못한 경우requests.get() : 서버의 응답을 Response 객체로 반환한다.URL = "https://jsonplaceholder.typicode.com/users"import requests
from pprint import pprint
URL = "https://jsonplaceholder.typicode.com/users"
SAMPLE = [
{"name": "Leanne Graham", "email": "Sincere@april.biz",
"address": {"city": "Gwenborough"}},
{"name": "Ervin Howell", "email": "Shanna@melissa.tv",
"address": {"city": "Wisokyburgh"}},
]
try:
response = requests.get(URL, timeout=5)
print("상태 코드:", response.status_code) # 200, 요청 성공
data = response.json() # 응답을 파이썬 객체로 변환
except Exception as e:
print("네트워크를 사용할 수 없어 샘플 데이터로 진행:", e)
data = SAMPLE
print("사용자 수:", len(data))

프로그램 간에 데이터를 주고받거나 저장할 때 사용하는 텍스트 기반 데이터 형식이다.
사람이 읽기 쉬우며 다양한 프로그래밍 언어에서 지원한다.

{
"id": 1,
"name": "김동건",
"age": 25,
"isStudent": true,
"skills": [
"Python",
"JavaScript"
],
"address": {
"city": "Seoul",
"country": "Korea"
}
}
first_user = data[0]
print(first_user["name"]) # 이름
print(first_user["email"]) # 이메일
print(first_user["address"]["city"]) # 주소에 저장된 도시
dict["키"] : 키가 없으면 KeyError 가 발생한다.dict.get("키") : 키가 없으면 None을 반환한다.dict.get("키", "기본값") : 키가 없으면 지정한 기본값을 반환한다.first = data[0] # 첫 번째 사용자
print(first["name"]) # 이름
print(first["email"]) # 이메일
# 첫 번째 사용자의 도시를 꺼내 보세요 (address의 city)
도시 = None # first["address"]["city"]
print(도시)



os.environ 이나 별도 비밀 파일로 관리한다.import os
from dotenv import load_dotenv
# .env 파일 읽기
load_dotenv() # 현재 파일과 같은 경로에 있을경우
# load_dotenv(../.env) # 상위 폴더에 있을경우 (상대, 절대경로 사용 가능)
API_KEY = os.getenv("OPENAI_API_KEY")
if not API_KEY:
raise RuntimeError("OPENAI_API_KEY가 .env 파일에 없습니다.")
else:
print("OPENAI_API_KEY 읽기 성공")
# API 키 전체를 출력하지 않고 일부만 확인하는 이유는 키 노출을 방지하기 위해서이다.
print(API_KEY[:10] + "...")
💡API키가 노출되면 무단 사용으로 요금 폭탄 맞을 수 있다. 공개 저장소에 API 키를 업로드 하지말자!
headers = {
# API 인증을 위한 키 전달
"Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}",
"Content-Type": "application/json",
}
prompt = "대전의 유명한 관광지를 소개해줘."
API_URL = "https://api.openai.com/v1/chat/completions"
body = {
"model": "gpt-4.1-mini",
"messages": [
{
"role": "user",
"content": prompt,
}
],
"temperature": 0.7,
"max_tokens": 500,
}
response = requests.post(
API_URL,
headers=headers,
json=body,
timeout=30,
)
print(response.status_code)
print(response.json())
answer = response.json()["choices"][0]["message"]["content"]
print(answer)

### Request 흐름
1. Header
- API 인증 정보 전달
- JSON 요청임을 명시
2. Body
- 사용할 모델 지정
- 사용자 입력(prompt) 전달
- 생성 옵션 설정
3. Response
- 서버에서 생성된 AI 응답 반환
- JSON 구조에서 content 값 추출
이번 학습을 통해 API를 이용한 데이터 통신 구조와 JSON 데이터 처리 방식을 이해했다.
앞으로는 단순히 API를 사용하는 것을 넘어, REST API 설계와 데이터 처리 방식까지 학습할 예정이다.