Skip to main content

API ์†๋„ ์ œํ•œ ์ฒ˜๋ฆฌ

๋ถ€์กฐ์ข…์‚ฌ ์ฑ„ํŒ…์€(๋Š”) ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์žฌ์‹œ๋„ ๋…ผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์•ˆํ•˜์—ฌ API ์†๋„ ์ œํ•œ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

API๋ฅผ ์š”์ฒญํ•  ๋•Œ๋Š” ํŠน์ • ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„ ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธ์ถœ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ์†๋„ ์ œํ•œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. GitHub Copilot ์ฑ„ํŒ…์€ ์†๋„ ์ œํ•œ ์‘๋‹ต์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ง€์—ฐ ํ›„ ์ž๋™์œผ๋กœ ์š”์ฒญ์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์•ˆํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ œํ•œ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์‹œ๋‚˜๋ฆฌ์˜ค

๋‹ค์Œ Python ์ฝ”๋“œ๋Š” ์™ธ๋ถ€ API์—์„œ ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. API์— ์†๋„ ์ œํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ œํ•œ์ด ์ดˆ๊ณผ๋˜๋ฉด ์š”์ฒญ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์•ฑ์€ ์žฌ์‹œ๋„ ๋…ผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์‘๋‹ต์„ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from flask import Flask, request
import requests

app = Flask(__name__)

WEATHER_API_URL = "https://api.example.com/weather"

@app.route('/get_weather', methods=['GET'])
def get_weather():
    city = request.args.get('city')
    # Simulate an API request to the external weather service
    response = requests.get(WEATHER_API_URL, params={"city": city})
    weather_data = response.json()

    return weather_data

์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ

Copilot Chat prompt
How can I handle API rate limits within get_weather().

์˜ˆ์ œ ์‘๋‹ต

์ฐธ๊ณ  ํ•ญ๋ชฉ

๋‹ค์Œ ์‘๋‹ต์ด ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ๋ถ€์กฐ์ข…์‚ฌ ์ฑ„ํŒ… ์‘๋‹ต์€ ๋น„๊ฒฐ์ •์ ์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋œ ์‘๋‹ต๊ณผ ๋‹ค๋ฅธ ์‘๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Copilot๋Š” ์žฌ์‹œ๋„ ๋นˆ๋„๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์‹œ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

import requests
from flask import Flask, request
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

app = Flask(__name__)

WEATHER_API_URL = "https://api.example.com/weather"

def requests_retry_session(
    retries=3,
    backoff_factor=0.3,
    status_forcelist=(500, 502, 504),
    session=None,
):
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount("http://", adapter)
    session.mount("https://", adapter)
    return session

@app.route('/get_weather', methods=['GET'])
def get_weather():
    city = request.args.get('city')
    try:
        response = requests_retry_session().get(WEATHER_API_URL, params={"city": city})
        response.raise_for_status()
        weather_data = response.json()
    except requests.exceptions.RequestException as e:
        return {"error": str(e)}, 500

    return weather_data

์ด ์˜ˆ์ œ์—์„œ Copilot์˜ ์ œ์•ˆ์—๋Š” ํŠน์ • ์ƒํƒœ ์ฝ”๋“œ(500, 502, 504)๋กœ ์ธํ•ด ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ์š”์ฒญ์„ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์žฌ์‹œ๋„ ์„ธ์…˜ ์„ค์ •์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. backoff_factor๋Š” ์žฌ์‹œ๋„ ์‚ฌ์ด์˜ ์ง€์—ฐ์ด ์ ์ฐจ ์ฆ๊ฐ€ํ•˜์—ฌ API์˜ ์†๋„ ์ œํ•œ์„ ๋” ์ด์ƒ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ฐธ๊ณ  ์ž๋ฃŒ