[트러블 슈팅] 신규 유저 Steam_data 즉시 반영 필요

2star_·2025년 1월 21일
0

최종 프로젝트

목록 보기
24/32

기존 로직

# 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에 정보를 저장할 수 있도록 별도의 모듈 함수를 만들고 기존 회원가입 로직과 스팀콜백 로직에 반영하여 해결했다.


문제 상황 (Trouble)

  1. 전체 일괄 업데이트 로직:

    • 기존에는 steam_data.py에 있는 Django Management Command를 통해, DB에 등록된 steamid가 필드에 존재하는 모든 유저를 한번에 스팀 정보(프로필, 리뷰, 플레이타임)를 갱신했다.
    • 이는 crontab을 이용한 정기적 작업이나 대규모 업데이트에는 유용하지만, ‘새 유저가 스팀을 방금 연동한 순간’에는 곧바로 DB에 반영되지 않는 문제가 있었다.
    • 새로 스팀 연동을 마친 유저 입장에선, 자기 스팀 리뷰나 플레이타임 정보를 즉시 확인하고 싶지만, 전체 작업이 실행될 때까지 기다려야 했다.
  2. 즉각적 반영 불가:

    • 새 유저가 스팀 계정을 등록해도, 다음에 해당 커맨드를 수동/자동으로 실행하기 전까지 DB에 갱신된 정보가 들어오지 않는다.
    • 결과적으로, 사용자 경험(UX)이 떨어지고, “가입 시점에 곧바로 프로필·리뷰·플레이타임 확인” 같은 기능이 구현 어려웠다.

해결 방안 (Solution)

# 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에 즉시 저장
    # ...
  1. 단일 유저 대상 함수 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
  1. View 에서 새 유저 연동 시점에 호출:

    • 새 유저가 회원가입 완료 후, 스팀 로그인 콜백 등을 통해 steamId를 등록하는 즉시, sync_new_steam_user_data(account)를 호출한다.
    • 결과: 스팀 프로필이 Public이라면, 즉시 리뷰·플레이타임을 DB에 저장. Private이면 is_review=False, is_playtime=False로 처리.
    • 사용자 입장에선, 연동 직후 리뷰 목록이나 플레이타임 정보를 볼 수 있게 된다.
  2. 기존 커맨드(steam_data.py)는 유지:

    • 배치 작업 또는 정기 갱신 시에는 여전히 전체 DB를 순회할 수 있는 기존 커맨드를 사용.
    • 새 모듈(steam_service.py)과 커맨드에 있는 로직이 중복되지 않도록, 공통 함수를 활용하거나 로직 구조를 최대한 비슷하게 맞췄다.

요약

  • 트러블: 기존엔 전체 DB 단위 배치만 존재해서, 새 유저가 스팀 연동해도 즉시 DB 저장이 불가능했다.
  • 해결: 단일 유저용 함수를 만들어, 스팀 연동 순간 DB에 곧바로 반영하도록 개선했다.

수정 함으로써 신규 유저가 스팀을 연동하는 시점에 즉각적인 리뷰·플레이타임 DB 등록이 가능해졌다. 기존 배치 로직(전체 일괄 갱신)은 그대로 유지하되, 새로 가입한 유저에 대해서만 개별로 빠르게 동기화하는 최적화를 시행했다.

구분기존 (steam_data.py)개선 (steam_service.py)
목적모든 계정(steamId 보유)을 일괄 갱신특정 유저(신규 스팀 연동 등)만 즉각 갱신
실행 시점정기적 or 필요 시(수동 명령)회원가입/로그인/스팀 연동 완료 시, 실시간(개별 호출)
단점 (기존)새로 가입한 유저가 갱신 대기 필요-
장점 (개선)많은 유저를 한 번에 갱신 가능신규 유저 연동 시 즉시 DB 반영, 사용자 경험 크게 향상
기존 리뷰/플레이타임 처리(코드에 따라) 전체 삭제 후 새로 생성 가능삭제 없이 get_or_create로 중복만 방지

즉, 전체 업데이트용 커맨드신규 유저 즉시 반영용 서비스 함수를 동시에 운영함으로써, 기존 DB 갱신과 실시간 반영을 모두 처리할 수 있게 되었다.

profile
안녕하세요.

0개의 댓글

관련 채용 정보