๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป IT·๊ธฐ์ˆ ·ํ†ต๊ณ„

[API] ๋ฆฌ๊ทธ์˜ค๋ธŒ๋ ˆ์ „๋“œ: ์ฑ”ํ”ผ์–ธ ๋ง๊ณ  API๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•„๋ณด์ž

by nowgeun 2023. 2. 5.
728x90

๋ฆฌ๊ทธ์˜ค๋ธŒ๋ ˆ์ „๋“œ๋Š” ๊ณ ๋“ฑํ•™๊ต 3ํ•™๋…„๋ถ€ํ„ฐ ์ง€๊ธˆ๊นŒ์ง€ ์•ฝ 10๋…„๊ฐ„ ์ €์™€ ํ•จ๊ป˜ํ•œ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ๋Œ€ํ•™ ์ถ”๊ฐ€ํ•ฉ๊ฒฉ ์ „ํ™”๋„ ์ง‘์—์„œ ๋กค์„ ํ•˜๋˜ ๋„์ค‘์— ๋ฐ›์•˜๊ณ , ์ฒซ ์ง์žฅ ์ทจ์—… ์†Œ์‹๋„ ๋กค์„ ํ•˜๋˜ ๋„์ค‘ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ทจ๋ฏธ๋ผ๊ณ ๋Š” ๊ฒŒ์ž„๋ฐ–์— ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์†Œ์‹๊ณผ ์‹ซ์€ ์†Œ์‹๋„ ๋ชจ๋‘ ๋กค๊ณผ ํ•จ๊ป˜ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋งŒํผ ๋กค์€ ์ œ๊ฒŒ ์žˆ์–ด ์• ์ฐฉ์ด ๊นŠ์€ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค.

 

๋กค์„ ํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ชจ๋ฅผ ์ˆ˜๊ฐ€ ์—†๋Š” ์ฃผ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ „์ ๊ฒ€์ƒ‰๊ณผ ๊ฒŒ์ž„ ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ฃผ๋Š” op.gg, lol.ps, fow.kr๊ณผ ๊ฐ™์€ ์›น์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์›น์‚ฌ์ดํŠธ๋“ค์€ ๋กค์˜ ๊ฐœ๋ฐœ์‚ฌ์ธ ๋ผ์ด์—‡๊ฒŒ์ž„์ฆˆ์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“  ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. API์™€ ๊ด€๋ จ๋œ ํฌ์ŠคํŒ…์„ ์ตœ๊ทผ ๋“ค์–ด ๋งŽ์ด ํ•˜๊ณ  ์žˆ๋˜ ์™€์ค‘์— ๋ฌธ๋“ ๋ผ์ด์—‡๊ฒŒ์ž„์ฆˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” API์— ๊ด€์‹ฌ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ฒŒ์ž„์˜ API๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

RIOT GAMES LOGO
๋กค ๊ฐœ๋ฐœ์‚ฌ ๋ผ์ด์—‡๊ฒŒ์ž„์ฆˆ

 

๋กค API ๋ฐœ๊ธ‰๋ฐฉ๋ฒ•

API Key ๋ฐœ๊ธ‰ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด์—‡๊ฒŒ์ž„์ฆˆ์˜ ๊ฐœ๋ฐœ์ž ํŽ˜์ด์ง€์— ๊ฐ€์„œ ๋กœ๊ทธ์ธ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. (์„ค๋งˆ ๋กค ๊ณ„์ •์ด ์•„์˜ˆ ์—†๋Š” ๋ถ„์€ ์—†๊ฒ ์ฃ ...?) ๋กœ๊ทธ์ธ์„ ํ•˜๊ณ  ๋‚˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

 

๋กค ๊ฐœ๋ฐœ์ž ํŽ˜์ด์ง€

์•„๋ž˜ reCAPTCHA๋ฅผ ๋ˆ„๋ฅด๊ณ  API Key๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. API Key์˜ ์œ ํšจ๊ธฐ๊ฐ„์€ ๋ฐœ๊ธ‰ ์‹œ์ ์œผ๋กœ ๋ถ€ํ„ฐ ๋Œ€๋žต 24์‹œ๊ฐ„์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์œ ํšจ๊ธฐ๊ฐ„์ด ์‹ซ์œผ์‹œ๋‹ค๋ฉด Personal API Key ํ˜น์€ Production API Key๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์Šน์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ๋Š” ๊ทธ๋ƒฅ Development API Key๋ฅผ ์‚ฌ์šฉํ•˜์…”๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

 

์ฑ”ํ”ผ์–ธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

์ฑ”ํ”ผ์–ธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ณ„๋„์˜ API Key๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋กค์—์„œ๋Š” ์ฑ”ํ”ผ์–ธ, ์•„์ดํ…œ, ๋ฃฌ, ์†Œํ™˜์‚ฌ ์ฃผ๋ฌธ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋คํ”„ ๋ฐ์ดํ„ฐ๋กœ ์ œ๊ณต์„ ํ•˜๋ฉฐ Data Dragon์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. 

 

์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ณ„๋„์˜ API Key ์ž…๋ ฅ ์—†์ด ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฑ”ํ”ผ์–ธ ์ •๋ณด ์—ด๋žŒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:

import pandas as pd
import requests

# ์ฑ”ํ”ผ์–ธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
champions = requests.get('http://ddragon.leagueoflegends.com/cdn/13.1.1/data/ko_KR/champion.json')

# ์ฑ”ํ”ผ์–ธ ์ •๋ณด ํ…Œ์ด๋ธ”๋กœ ๋ณด๊ธฐ
champ_df = pd.DataFrame(champions.json()['data']).T
champ_df.index = champ_df['name']
champ_df = champ_df.drop(columns=['name'])

๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•˜๋ฉด ์ฑ”ํ”ผ์–ธ์˜ ์ด๋ฆ„์ด index์— ๋“ค์–ด๊ฐ€๊ณ  ๊ณ ์œ ๋ฒˆํ˜ธ, ํƒ€์ดํ‹€, ์Šคํ† ๋ฆฌ, ์—ญํ• ๊ตฐ, ์Šคํƒฏ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฑ”ํ”ผ์–ธ ๋กœํ…Œ์ด์…˜ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

๋กค์˜ ๊ฒฝ์šฐ์—๋Š” ์‹ ๊ทœ ๊ฐ€์ž…ํ•œ ์œ ์ € ๋ฐ ์ผ๋ฐ˜ ๊ฒŒ์ž„์— ํ•œํ•ด์„œ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณตํ•˜๋Š” ์ฑ”ํ”ผ์–ธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฑ”ํ”ผ์–ธ ๋กœํ…Œ์ด์…˜์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. API Key๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฑ”ํ”ผ์–ธ ๋กœํ…Œ์ด์…˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

import requests

API_KEY = '๋ฐœ๊ธ‰๋ฐ›์€ API Key'

headers = {"Accept-Language": "ko,en-US;q=0.9,en;q=0.8,ko-KR;q=0.7,und;q=0.6,th;q=0.5",
    "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
    "Origin": "https://developer.riotgames.com",
    "X-Riot-Token": API_KEY
}

response = requests.get('https://kr.api.riotgames.com/lol/platform/v3/champion-rotations', headers=headers )

๋ฌด๋ฃŒ ๋กœํ…Œ์ด์…˜ ์ฑ”ํ”ผ์–ธ์˜ id์™€ ์‹ ๊ทœ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์œ„ํ•œ ์ฑ”ํ”ผ์–ธ id ๊ทธ๋ฆฌ๊ณ  ์‹ ๊ทœ ํ”Œ๋ ˆ์ด์–ด์˜ ์กฐ๊ฑด์ธ ์ตœ๋Œ€ ๋ ˆ๋ฒจ๊นŒ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์ •๋ฆฌํ•œ ์ฑ”ํ”ผ์–ธ์˜ key ๊ฐ’์œผ๋กœ ๋กœํ…Œ์ด์…˜ ์ฑ”ํ”ผ์–ธ ๋ชฉ๋ก์„ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ fow.kr์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชฉ๋ก๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

rotation champions
์ฑ”ํ”ผ์–ธ ๋ฐ์ดํ„ฐ์™€ ๊ฒฐํ•ฉํ•œ ๊ฒฐ๊ณผ
rotation champs
fow.kr ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธˆ์ฃผ์˜ ๋กœํ…Œ์ด์…˜ ์ •๋ณด

 

์†Œํ™˜์‚ฌ ๊ฒ€์ƒ‰ (feat. ํŽ˜์ด์ปค ์„ ์ˆ˜์˜ ์ตœ๊ทผ๊ฒŒ์ž„ KDA)

๋กค์˜ ๊ฒฝ์šฐ์—๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์†Œํ™˜์‚ฌ (Summoner)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์œ ์ €๋“ค์ด ์ฑ”ํ”ผ์–ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์†Œํ™˜ํ•œ๋‹ค๋ผ๊ณ  ํ‘œํ˜„์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ € ์ด๋ฆ„์€ ์†Œํ™˜์‚ฌ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ „์  ๊ฒ€์ƒ‰์„ ํ•  ๋•Œ๋„ ์†Œํ™˜์‚ฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒ€์ƒ‰์„ ํ•ฉ๋‹ˆ๋‹ค. API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์†Œํ™˜์‚ฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์„ธ ๊ฐ€์ง€ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค:

 

1. ์†Œํ™˜์‚ฌ ์ด๋ฆ„์œผ๋กœ ์•”ํ˜ธํ™”๋œ puid๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ

2. ํ•ด๋‹น puid๋กœ ๊ฐ ๊ฒŒ์ž„ ํŒ์˜ id ๊ฐ€์ ธ์˜ค๊ธฐ

3. ๊ฒŒ์ž„ ํŒ์˜ id๋กœ ์ •๋ณด ํ™•์ธ

 

๋‹จ๊ณ„๋ณ„๋กœ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import requests

API_KEY = '๋ฐœ๊ธ‰๋ฐ›์€ API Key'

headers = {"Accept-Language": "ko,en-US;q=0.9,en;q=0.8,ko-KR;q=0.7,und;q=0.6,th;q=0.5",
    "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
    "Origin": "https://developer.riotgames.com",
    "X-Riot-Token": API_KEY
}

# ๊ฒ€์ƒ‰๋Œ€์ƒ ์†Œํ™˜์‚ฌ ์ด๋ฆ„
summoner = 'hide on bush' # SKT T1 ํŽ˜์ด์ปค ์„ ์ˆ˜์˜ ์†Œํ™˜์‚ฌ๋ช…

# ์†Œํ™˜์‚ฌ ์ด๋ฆ„์œผ๋กœ puuid ๊ฐ€์ ธ์˜ค๊ธฐ
response = requests.get(f'https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/{summoner}', headers=headers)
puuid = response.json()['puuid']

# ํ•ด๋‹น puuid๋กœ ์ตœ๊ทผ 20๊ฒŒ์ž„์˜ ๊ฒŒ์ž„ ํŒid ๊ฐ€์ ธ์˜ค๊ธฐ
match_ids = requests.get(f'https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/{puuid}/ids?start=0&count=20', headers=headers).json() 

# ์ง„ํ–‰ํ•œ ๊ฒŒ์ž„ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
def get_match_data(match_id):
    data = requests.get(f'https://asia.api.riotgames.com/lol/match/v5/matches/{match_id}', headers=headers).json()
    return data
    
game_data = [get_match_data(x) for x in match_ids]

ํŽ˜์ด์ปค ์„ ์ˆ˜์˜ ์ตœ๊ทผ ๊ฒŒ์ž„ 20ํŒ ์ „์ ์„ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ game_data๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๊ฒŒ์ž„์˜ json ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

LOL GAME DATA
๋กค ์ „์ ๊ฒ€์ƒ‰ JSON ์ •๋ณด

 

์ฐพ๊ณ ์ž ํ•˜๋Š” KDA์˜ ์ •๋ณด๋Š” 'participants' ํ•ญ๋ชฉ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ index ์ˆœ์„œ๋Œ€๋กœ ์œ„์˜ 5๋ช…์ด ํ•œ ํŒ€, ์•„๋ž˜ 5๋ช…์ด ํ•œ ํŒ€์œผ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ญ์‹œ ์„ธ๊ณ„ ์ตœ๊ณ ์˜ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ฃฝ์€ ํšŸ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋“ค์— ๋น„ํ•ด์„œ ํ˜„์ €ํ•˜๊ฒŒ ์ ๋„ค์š” ใ„ทใ„ท

 

๋กค API๋กœ ๊ฐ€์ ธ์˜จ ํŽ˜์ด์ปค ์„ ์ˆ˜์˜ ์ตœ๊ทผ ์ „์  KDA

 

์œ„์™€ ๊ฐ™์ด ๊ฒŒ์ž„์ข…๋ฃŒ ํ›„ ๊ฒฐ๊ณผ ํ™”๋ฉด์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” game_data [0]['info']๊ฐ€ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. 

๊ฐ™์€ KDA ์ •๋ณด์ธ๋ฐ ๋””์ž์ธ์— ๋”ฐ๋ผ ๋Š๋‚Œ์ด ์•„์ฃผ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FAKER GAME HISTORY
FAKER ์„ ์ˆ˜์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ๊ฒŒ์ž„์ „์ 

 

๋กค API๋ฅผ ๋งŒ์ง€๋‹ค ๋ณด๋‹ˆ ์ ์  ๋กค์„ ํ•˜๋Ÿฌ ๊ฐ€๊ณ  ์‹ถ์–ด ์ง€๋„ค์š” ใ…Žใ…Ž... ๋Œ€์ถฉ ์—ฌ๊ธฐ์„œ ๋งˆ๋ฌด๋ฆฌ ์ง“๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด ์—ฌ๊ธฐ์˜ Documentation์„ ์ฐธ๊ณ ํ•ด์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋” ์ฐพ์•„๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค


๋งˆ๋ฌด๋ฆฌ

์˜ค๋Š˜์€ ๋ฆฌ๊ทธ์˜ค๋ธŒ๋ ˆ์ „๋“œ API๋ฅผ ์‚ฌ์šฉํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. ๋งจ๋‚  ํ•˜๋˜ ๊ฒŒ์ž„์˜ ๋ฐ์ดํ„ฐ์™€ json ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•ด ๋ณด๋‹ˆ ๋‚˜๋ฆ„ ํฅ๋ฏธ๋กœ์› ์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž

API๋ฅผ ๋งŒ์ง€๋ฉด์„œ ์ข…์ข… ๋“œ๋Š” ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. "์•„๋ฌด๋ฆฌ ์ข‹์€ ๋ฐ์ดํ„ฐ๋ผ๋„ ํ‘œํ˜„์„ ์ž˜ํ•ด์•ผ ์ „๋‹ฌ๋„ ์ž˜ ๋œ๋‹ค"๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๊ฐ€๊ณตํ•˜๋Š” ๊ฒƒ๋„ ๋ฌผ๋ก  ์ค‘์š”ํ•˜์ง€๋งŒ, UX/UI๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ์ •๋ณด๋ฅผ ์ •๋ฆฌํ•ด์„œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋„ ๋ชป์ง€์•Š๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. UX/UI ํŒ€ ๋ฐ ํ”„๋ŸฐํŠธ์—”๋“œ ๋ถ„๋“ค์˜ ๋Œ€๋‹จํ•จ์„ ์ฒด๊ฐํ•˜๋Š” ์‹œ๊ฐ„์ด๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€