# steam_data.py
import environ
import requests
from django.core.management.base import BaseCommand
from accounts.models import Account, SteamProfile, SteamReview, SteamPlaytime
from selenium import webdriver
class Command(BaseCommand):
help = "전체 DB의 스팀 정보를 일괄 갱신"
def handle(self, *args, **options):
env = environ.Env()
api_key = env("STEAM_API_KEY")
accounts = Account.objects.exclude(steamId="")
# WebDriver 준비
driver = webdriver.Chrome()
for account in accounts:
# (A) 프로필 공개 여부 확인
# (B) 리뷰, 플레이타임 조회
# (C) SteamProfile/SteamReview/SteamPlaytime 저장
# ...
driver.quit()
self.stdout.write(self.style.SUCCESS("Steam 데이터 처리 완료."))
기존 로직(전체 DB를 일괄 업데이트하는 커맨드)으로는 새로 가입한 유저가 스팀을 연동했을 때 즉각적으로 DB에 반영되지 않는 문제가 있었다.
이를 해결하기 위해 신규 유저가 스팀 계정을 연결하자마자 DB에 정보를 저장할 수 있도록 별도의 모듈 함수를 만들고 기존 회원가입 로직과 스팀콜백 로직에 반영하여 해결했다.
전체 일괄 업데이트 로직:
steam_data.py
에 있는 Django Management Command
를 통해, DB에 등록된 steamid
가 필드에 존재하는 모든 유저를 한번에 스팀 정보(프로필, 리뷰, 플레이타임)를 갱신했다. crontab
을 이용한 정기적 작업이나 대규모 업데이트에는 유용하지만, ‘새 유저가 스팀을 방금 연동한 순간’에는 곧바로 DB에 반영되지 않는 문제가 있었다. 즉각적 반영 불가:
# steam_service.py
import environ
import requests
from django.db import transaction
from selenium import webdriver
from accounts.models import Account, SteamProfile, SteamReview, SteamPlaytime
def sync_new_steam_user_data(account):
"""
새 유저(특정 account)에 대해 프로필/리뷰/플레이타임 정보를 즉시 DB에 반영.
"""
# 1) Steam API 키 불러오기
env = environ.Env()
api_key = env("STEAM_API_KEY")
# 2) 프로필 공개 여부 확인
if not check_profile_public(api_key, account.steamId):
# 비공개면 is_review=False, is_playtime=False
sp, _ = SteamProfile.objects.get_or_create(account=account)
sp.is_review = False
sp.is_playtime = False
sp.save()
return
# 3) 리뷰/플레이타임 조회
# ...
# 4) DB에 즉시 저장
# ...
sync_new_steam_user_data
생성: steam_service.py
로 별도 모듈을 만들고, sync_new_steam_user_data(account)
함수를 정의했다.Account
(특히 스팀 ID 보유)를 입력받아, 리뷰/플레이타임/프로필 공개 여부를 크롤링/조회 후 DB에 즉시 반영한다. @api_view(["POST"])
def signup(request):
#...
steam_id = request.data.get("steam_id")
if steam_id:
# DB에 리뷰공개 여부/플레이타임/리뷰 데이터 동기화 다음에 하기 할 때 제외하는 로직
sync_new_steam_user_data(user)
return
@api_view(["POST"])
def steam_callback(request):
#...
# DB에 리뷰공개 여부/플레이타임/리뷰 데이터 동기화
sync_new_steam_user_data(account)
return
View 에서 새 유저 연동 시점에 호출:
steamId
를 등록하는 즉시, sync_new_steam_user_data(account)
를 호출한다. is_review=False, is_playtime=False
로 처리. 기존 커맨드(steam_data.py
)는 유지:
steam_service.py
)과 커맨드에 있는 로직이 중복되지 않도록, 공통 함수를 활용하거나 로직 구조를 최대한 비슷하게 맞췄다.수정 함으로써 신규 유저가 스팀을 연동하는 시점에 즉각적인 리뷰·플레이타임 DB 등록이 가능해졌다. 기존 배치 로직(전체 일괄 갱신)은 그대로 유지하되, 새로 가입한 유저에 대해서만 개별로 빠르게 동기화하는 최적화를 시행했다.
구분 | 기존 (steam_data.py ) | 개선 (steam_service.py ) |
---|---|---|
목적 | 모든 계정(steamId 보유)을 일괄 갱신 | 특정 유저(신규 스팀 연동 등)만 즉각 갱신 |
실행 시점 | 정기적 or 필요 시(수동 명령) | 회원가입/로그인/스팀 연동 완료 시, 실시간(개별 호출) |
단점 (기존) | 새로 가입한 유저가 갱신 대기 필요 | - |
장점 (개선) | 많은 유저를 한 번에 갱신 가능 | 신규 유저 연동 시 즉시 DB 반영, 사용자 경험 크게 향상 |
기존 리뷰/플레이타임 처리 | (코드에 따라) 전체 삭제 후 새로 생성 가능 | 삭제 없이 get_or_create 로 중복만 방지 |
즉, 전체 업데이트용 커맨드와 신규 유저 즉시 반영용 서비스 함수를 동시에 운영함으로써, 기존 DB 갱신과 실시간 반영을 모두 처리할 수 있게 되었다.