๐Ÿ“ฆ๋ถ„์„ ํ”„๋กœ์ ํŠธ/๐ŸŽฎ RIOT API ๋ถ„์„ ๋ฐ ์›น์„œ๋น„์Šค ๊ฐœ๋ฐœ

๐ŸŽฎRIOT API ๋ถ„์„ ํ”„๋กœ์ ํŠธ(7) - Flask๋ฅผ ์‚ฌ์šฉํ•ด ์›นํŽ˜์ด์ง€ ๊ฐœ๋ฐœ

๋ฐ์ดํ„ฐํŒ์Šค 2024. 9. 22. 01:16

flask๋ฅผ ํ™œ์šฉํ•ด ์›นํŽ˜์ด์ง€ ๊ฐœ๋ฐœ

flask_project/
โ”‚
โ”œโ”€โ”€ app.py                # Flask ๋ฉ”์ธ ํŒŒ์ผ
โ”œโ”€โ”€ riot_api.py           # Riot API ๊ด€๋ จ ํ•จ์ˆ˜๋“ค
โ”œโ”€โ”€ templates/
โ”‚   โ”œโ”€โ”€ home.html         # ์†Œํ™˜์‚ฌ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ํผ
โ”‚   โ””โ”€โ”€ results.html      # ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ํŽ˜์ด์ง€
โ””โ”€โ”€ static/               # CSS, JS ํŒŒ์ผ ๋“ฑ (ํ•„์š” ์‹œ)

 

์ด์ œ DB๋Š” ๊ตฌ์ถ•์„ ๋‹ค ํ–ˆ๊ณ  ์œ ์ €๋“ค์˜ ๋‹‰๋„ค์ž„์„ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ์ž์‹ ์˜ ์ตœ๊ทผ 5ํŒ ํ‰๊ท ์„ ๋ณด์—ฌ์ฃผ๋Š” ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

flask๋ฅผ ์ด์šฉํ•˜๋ฉด ๋น„๊ต์  ์†์‰ฝ๊ฒŒ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ๊ตฌ์กฐ๋Š” ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ”ํƒ•ํ™”๋ฉด์— flask_project๋ผ๋Š” ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— app.py์™€ riot_api.py ๋ผ๋Š” ํŒŒ์ด์ฌ ํŒŒ์ผ์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ™ˆํŽ˜์ด์ง€์— ๊ตฌํ˜„ํ•  home.html ๊ณผ results.html๋ผ๋Š” ํŒŒ์ผ์„ templates๋ผ๋Š” ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ ์•ˆ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

 

 

 

app.py ํŒŒ์ผ

from flask import Flask, render_template, request
from riot_api import get_summoner_info, get_recent_matches

app = Flask(__name__)

@app.route("/")
def home():
    return render_template("home.html")

@app.route("/search", methods=["GET"])
def search():
    summoner_name = request.args.get("name")
    
    if not summoner_name:
        return render_template("home.html", error="Please enter a summoner name.")
    
    # ์†Œํ™˜์‚ฌ ์ •๋ณด์™€ ์ตœ๊ทผ ๋งค์น˜ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
    summoner_info = get_summoner_info(summoner_name)
    if not summoner_info:
        return render_template("home.html", error="Summoner not found.")
    
    # ์ตœ๊ทผ 5๊ฒŒ์ž„ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
    match_details = get_recent_matches(summoner_info['puuid'], count=5)
    
    return render_template("results.html", matches=match_details, summoner_name=summoner_name)

if __name__ == "__main__":
    app.run(debug=True)

 

 

 

 

riot_api.py ํŒŒ์ผ 

import requests

API_KEY = "my_api"

# ์†Œํ™˜์‚ฌ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
def get_summoner_info(summoner_name):
    url = f"https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/{summoner_name}"
    headers = {"X-Riot-Token": API_KEY}
    
    response = requests.get(url, headers=headers)
    
    # ์ƒํƒœ ์ฝ”๋“œ ๋ฐ ์‘๋‹ต ๋‚ด์šฉ ๋กœ๊ทธ ์ถœ๋ ฅ
    print(f"API ํ˜ธ์ถœ ์ƒํƒœ ์ฝ”๋“œ: {response.status_code}")
    print(f"API ์‘๋‹ต ๋‚ด์šฉ: {response.text}")
    print(f"Rate Limit? Retry-After: {response.headers.get('Retry-After')}")
    
    if response.status_code == 200:
        return response.json()
    else:
        return None


# ์ตœ๊ทผ ๊ฒฝ๊ธฐ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
def get_recent_matches(puuid, count=5):
    match_list_url = f"https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/{puuid}/ids?start=0&count={count}"
    headers = {"X-Riot-Token": API_KEY}
    
    match_list_response = requests.get(match_list_url, headers=headers)
    
    if match_list_response.status_code != 200:
        return []
    
    match_ids = match_list_response.json()
    match_details = []

    # ๊ฐ ๊ฒฝ๊ธฐ ์ƒ์„ธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
    for match_id in match_ids:
        match_data_url = f"https://asia.api.riotgames.com/lol/match/v5/matches/{match_id}"
        match_data_response = requests.get(match_data_url, headers=headers)
        
        if match_data_response.status_code == 200:
            match_data = match_data_response.json()
            
            # ํ•ด๋‹น ๊ฒฝ๊ธฐ์—์„œ ์†Œํ™˜์‚ฌ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœ
            participant_data = next(p for p in match_data['info']['participants'] if p['puuid'] == puuid)
            match_details.append({
                'kills': participant_data['kills'],
                'deaths': participant_data['deaths'],
                'assists': participant_data['assists'],
                'goldEarned': participant_data['goldEarned'],
                'wardsPlaced': participant_data['wardsPlaced']
            })

    return match_details

 

 

 

 

home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Summoner Search</title>
</head>
<body>
    <h1>Search for Summoner</h1>
    
    <form action="/search" method="get">
        <label for="name">Summoner Name:</label>
        <input type="text" id="name" name="name" required>
        <button type="submit">Search</button>
    </form>
    
    {% if error %}
    <p style="color: red;">{{ error }}</p>
    {% endif %}
</body>
</html>

 

 

 

results.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Match Results for {{ summoner_name }}</title>
</head>
<body>
    <h1>Recent Matches for {{ summoner_name }}</h1>
    
    <ul>
        {% for match in matches %}
        <li>
            <p>Kills: {{ match.kills }}</p>
            <p>Deaths: {{ match.deaths }}</p>
            <p>Assists: {{ match.assists }}</p>
            <p>Gold Earned: {{ match.goldEarned }}</p>
            <p>Wards Placed: {{ match.wardsPlaced }}</p>
        </li>
        {% endfor %}
    </ul>
</body>
</html>

 

์ด๋ ‡๊ฒŒ ํŒŒ์ผ๋“ค์„ ๋งŒ๋“ค๊ณ  ํ„ฐ๋ฏธ๋„์—์„œ python app.py๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

 

 

 

ํ„ฐ๋ฏธ๋„์— app ์—ฐ๊ฒฐ, ์›น์‚ฌ์ดํŠธ ์—ฐ๋™ ํ™•์ธ

ํ„ฐ๋ฏธ๋„์— ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๊ฐ€ ๋˜๊ณ  ์ฃผ์†Œ์— http://127.0.0.1:5000๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋งŒ๋“  ์›นํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค!

 

 

์ด๋Ÿฐ ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ œ๋Œ€๋กœ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Summoner Name๋ฅผ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทผ๋ฐ ์ž๊พธ summoner not found๋ผ๊ณ  ๋‚˜์˜ต๋‹ˆ๋‹ค.

 

 

vscode๋กœ ๋Œ์•„์™€์„œ ํ„ฐ๋ฏธ๋„์„ ํ™•์ธํ–ˆ๋”๋‹ˆ 403 ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

403 ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์›์ธ์€ ๋ณดํ†ต ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  • ์ƒˆ๋กœ์šด API ํ‚ค ๋ฐœ๊ธ‰: API ํ‚ค๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.Riot Developer Portal์—์„œ ์ƒˆ๋กœ์šด API ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๊ณ  ์ ์šฉ
  • API ํ˜ธ์ถœ ์ œํ•œ ํ™•์ธ: API ํ˜ธ์ถœ ํšŸ์ˆ˜๊ฐ€ ์ œํ•œ์— ๊ฑธ๋ ธ์„ ์ˆ˜ ์žˆ๋‹ค. ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„ ๋‹ค์‹œ ์‹œ๋„
  • API ํ‚ค ์ž…๋ ฅ ์˜ค๋ฅ˜ ํ™•์ธ: API ํ‚ค๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
  • ์˜ฌ๋ฐ”๋ฅธ ์ง€์—ญ ์„œ๋ฒ„ ์‚ฌ์šฉ: ํ•œ๊ตญ ์„œ๋ฒ„(kr.api.riotgames.com)๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธ
  • HTTPS ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉ: Riot API๋Š” HTTPS๋ฅผ ํ†ตํ•ด ์š”์ฒญ

 

๊ทผ๋ฐ ์ €๋Š” ์œ„์— ํ•ด๋‹นํ•˜๋Š” ์›์ธ์ด ์—†์—ˆ๊ณ , ์ฝ”๋“œ์— ์˜ค๋ฅ˜๋‚˜ ์˜คํƒ€๊ฐ€ ์žˆ์ง€๋„ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

riot api๋ฅผ ์žฌ๋ฐœ๊ธ‰๋„ ๋ฐ›์•„๋ดค์ง€๋งŒ ํ•ด๊ฒฐ์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ์›์ธ์ด ๋ญ˜๊นŒ ์‹ถ์–ด์„œ riot api๋ฅผ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๋ฐ ์›์ธ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค..

 

 

 

summonerName API ์„œ๋น„์Šค ๋ฏธ์ง€์›

 

 

https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/{summoner_name} ๋ผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ

RIOT API๋Š” ์†Œํ™˜์‚ฌ ์ด๋ฆ„์„ ํ†ตํ•ด ์†Œํ™˜์‚ฌ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋” ์ด์ƒ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ตฌ๊ธ€์—์„œ ๊ฒ€์ƒ‰ํ•ด์„œ RIOT API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์œ ์ €๊ฐ€ ์ž์‹ ์˜ ๋‹‰๋„ค์ž„์„ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ์ตœ๊ทผ ์ „์ ์ด ๋‚˜์˜ค๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ ๋ชจ๋“  ๊ธ€๋“ค์€ https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/{summoner_name} ๋ฅผ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

 

๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ์—์„œ ํผ์™”๋Š”๋ฐ, ์˜ˆ์ „์—๋Š” ์œ„์™€ ๊ฐ™์ด summonerName ์ด๋ผ๋Š”  api๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋‹‰๋„ค์ž„์„ ์ž…๋ ฅํ•ด์„œ puuid๋ฅผ ์–ป๊ณ  ๊ทธ๊ฒƒ์„ ํ™œ์šฉํ•ด matchid๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด์—ˆ๋Š”๋ฐ ์ด์ œ๋Š” ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์“ธ ์ˆ˜ ์—†๊ฒŒ ๋œ ๊ฒ๋‹ˆ๋‹ค.

์˜ฌํ•ด 2์›”์ธ๊ฐ€ ๊นŒ์ง€๋Š” ์žˆ์—ˆ๋Š”๋ฐ..

๊ทธ๋Ÿฌ๋‹ˆ riot_api.py์ด๋ผ๋Š” ์ฝ”๋“œ์—์„œ summonerName์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์„ ์“ธ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์ฃ .

๊ฒŒ์ž„์ •๋ณด๋Š”  puuid, encryptedSummonerID๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ ๊ฒŒ์ž„ ๋‚ด๋ถ€์—์„œ ์œ ์ €๋Š”์ž์‹ ์˜ puuid, summonerID๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ง„์งœ ๋ฌธ์ œ๊ฐ€ ์—ฌ๊ธฐ์„œ ์ƒ๊ธด ๊ฒƒ์ด์ฃ . 

 

์„œ๋น„์Šค๋ฅผ ๊ตฌ์ƒํ•˜๊ธฐ ์œ„ํ•ด DB ๊ตฌ์ถ•๋„ ๋‹ค ํ–ˆ๋Š”๋ฐ ์œ ์ €๋“ค์ด ์ž์‹ ์˜ ๋‹‰๋„ค์ž„ or puuid๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ผ๋ถ€ ๋น„๊ณต์‹ API๋‚˜ ๋กค ์ „์  ์‚ฌ์ดํŠธ๋Š” ์—ฌ์ „ํžˆ ์†Œํ™˜์‚ฌ ์ด๋ฆ„์„ ํ†ตํ•ด PUUID๋ฅผ ์ถ”์ถœํ•ด์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ํ™œ์šฉํ•ด ์†Œํ™˜์‚ฌ ์ด๋ฆ„์„ PUUID๋‚˜ ๋‹ค๋ฅธ ์‹๋ณ„์ž๋กœ ๋ณ€ํ™˜ํ•œ ํ›„, ์ด๋ฅผ Riot API์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์•ˆ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํƒ€์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ์ œ๊ฐ€ ๊ตฌ์„ฑํ•œ ๊ฒƒ๋งŒ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. 

 


 

๋ฐฉ๋ฒ•์ด ์žˆ๊ธด ์žˆ์Šต๋‹ˆ๋‹ค... ์—ฌ๊ธฐ์„œ๋Š” ๋‹ค์ด์•„ 1 ํ‹ฐ์–ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. league-ex-v4์—์„œ ํ•ด๋‹น๋œ ํ‹ฐ์–ด์˜ ๋ชจ๋“  ์œ ์ € summonerID๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. (2์ฒœ๊ฐœ๋‹น 1์‹œ๊ฐ„, 1๋งŒ์œ ์ €๊ฐ€ ์กฐ๊ธˆ ๋„˜๊ธฐ์— 5์‹œ๊ฐ„ ์ •๋„ ์‹œ๊ฐ„์˜ˆ์ƒ) 

2. summonerID๋ฅผ DB์— ์‹ค๊ณ  summoner-v4์—์„œ summnerID๋ฅผ ๋„ฃ์€ ๋‹ค์Œ puuid๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. (์—ญ์‹œ 5์‹œ๊ฐ„)

3. puuid๋ฅผ DB์— ์‹ค๊ณ  match-v4์—์„œ ์ตœ๊ทผ 1ํŒ์˜ matchID๋งŒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. (5์‹œ๊ฐ„)

4. matchID๋ฅผ DB์— ์‹ค๊ณ  matchID/v5/matches์—์„œ ํ•ด๋‹นํŒ ๊ฒŒ์ž„ ์ •๋ณด๋ฅผ ๋‹‰๋„ค์ž„๊ณผ PUUID ์ •๋ณด๋งŒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

5. ๊ทธ๋ฆฌ๊ณ  2๋ฒˆ์— ๋งŒ๋“  DB์— ๋“ค์–ด์žˆ๋Š” puuid๊ฐ€ 4๋ฒˆ์—์„œ ์ƒ์„ฑ๋œ PUUID์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ๋งŒ์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.

(4๋ฒˆ์— ๋งŒ๋“  PUUID๋Š” ๊ทธ ํŒ์— ์ฐธ์—ฌํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ puuid๊ฐ€ ๋“ค์–ด์žˆ๊ธฐ์— ํ•ด๋‹น ํ‹ฐ์–ด์— ๋งž๋Š” puuid์ธ 2๋ฒˆ๋งŒ์„ ๊ณจ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

6. ๊ทธ๋Ÿฌ๋ฉด ์œ ์ €์˜ "๋‹‰๋„ค์ž„"๊ณผ "PUUID"๋งŒ์ด ๋‚จ๊ณ  ์ด๊ฒƒ์„ ๋‹ค์ด์•„1 ํ‹ฐ์–ด์˜ ๋‹‰๋„ค์ž„๊ณผ puuid ์žˆ๋Š” DB์œผ๋กœ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

7. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์ด์•„1 ํ‹ฐ์–ด์— ํ•ด๋‹นํ•˜๋Š” ์œ ์ €์˜ ๋‹‰๋„ค์ž„+puuid๊ฐ€ ์žˆ๋Š” DB๊ฐ€ ์žˆ๊ธฐ์— ์œ ์ €๋Š” ์ž์‹ ์˜ ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ DB์— ์—ฐ๋™ํ•˜์—ฌ ํ•ด๋‹น puuid๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๊ทธ๊ฒƒ์„ api๋กœ ํ˜ธ์ถœํ•˜๋Š” ์‹์œผ๋กœ app.py๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฌธ์ œ๋Š” ์›๋ž˜ ๊ณ„ํš์ด์—ˆ๋˜ ์—๋ฉ”๋ž„๋“œ ํ‹ฐ์–ด๋กœ ํ•˜๊ธฐ์—๋Š” ์œ ์ €๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค๋Š” ๊ฒ๋‹ˆ๋‹ค...

riot์€ api rate limit์„ ๋‘๊ธฐ์— ์œ ์ € DB๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋ฉด ๊ต‰์žฅํžˆ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ์„  ๊ทธ๋žœ๋“œ๋งˆ์Šคํ„ฐ(700๋ช…) ์„ ๋Œ€์ƒ์œผ๋กœ ์œ ์ € DB๋ฅผ ๋จผ์ € ๊ตฌ์ถ•ํ•œ ๋‹ค์Œ์— ํ•ด๋‹น ์›น์„œ๋น„์Šค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ๊ตฌํ˜„๋œ๋‹ค๋ฉด

๋‹ค์ด์•„ 1ํ‹ฐ์–ด(1๋งŒ 2์ฒœ๋ช…)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์œ ์ € DB๋ฅผ ๊ตฌ์ถ•์„ ๋„“ํ˜€๋‚˜๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์šฐ์„  ๋‹ค์‹œ ๊ทธ๋žœ๋“œ๋งˆ์Šคํ„ฐ๋ฅผ ํ‹ฐ์–ด๋ฅผ ๋Œ€์ƒ์œผ๋กœ DB๋ฅผ ๋‹ค์‹œ ๊ตฌ์ถ•ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ฐœ๋ฐœ์ด ์ฒ˜์Œ์ด์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ์‰ฝ์ง€ ์•Š๋„ค์š”..