게임 통계 서버에서 사용자 활동을 추적하기 위한 테이블 구조는 플레이어의 행동을 세밀하게 기록하고, 이를 바탕으로 다양한 통계를 생성하는 데 중점을 둡니다. 사용자 활동 추적을 위한 테이블 구조는 일반적으로 로그 기반 이벤트 테이블메타데이터 테이블로 구성됩니다. 여기서는 각 테이블의 역할과 구조를 설명하고, 이를 구현할 때 고려해야 할 사항을 정리합니다.


1. 주요 테이블 구조

1.1 사용자 이벤트 로그 테이블 (user_event_log)

이 테이블은 유저의 모든 게임 내 활동을 시간순으로 기록하는 로그 테이블입니다. 각각의 활동(이벤트)을 하나의 레코드로 저장하며, 시간에 따른 유저 행동을 추적하는 핵심 테이블입니다.

테이블 필드:

필드 이름 데이터 타입 설명
event_id INT 고유 이벤트 식별자 (자동 증가)
user_id INT 유저 식별자
event_type VARCHAR 이벤트 종류 (예: 로그인, 구매, 레벨 업 등)
event_timestamp DATETIME 이벤트 발생 시각
event_details JSON (TEXT) 이벤트와 관련된 추가 정보 (예: 아이템 ID, 위치 등)
session_id VARCHAR 세션 식별자 (유저가 게임에 접속한 세션 ID)

설명:

  • user_id: 특정 유저의 활동을 구분하기 위한 고유 식별자.
  • event_type: 이벤트의 유형을 정의합니다. 예를 들어, 로그인(login), 구매(purchase), 레벨 업(level_up) 등 다양한 게임 내 이벤트를 기록할 수 있습니다.
  • event_timestamp: 활동이 발생한 정확한 시간을 기록합니다. 이를 통해 시간에 따른 패턴 분석이 가능합니다.
  • event_details: 이벤트와 관련된 구체적인 정보를 JSON 형식으로 저장하여 유연성을 제공합니다. 예를 들어, 구매한 아이템의 ID나 금액을 저장할 수 있습니다.
  • session_id: 특정 세션에서 발생한 여러 이벤트를 그룹화하여 분석할 때 유용합니다.

예시 데이터:

event_id user_id event_type event_timestamp event_details session_id
1 1001 login 2024-10-01 09:00:00 {} session_001
2 1001 purchase 2024-10-01 09:05:00 {"item_id": 201, "amount": 5.99} session_001
3 1002 level_up 2024-10-01 10:00:00 {"new_level": 10} session_002
4 1001 logout 2024-10-01 09:30:00 {} session_001

1.2 사용자 세션 테이블 (user_session)

이 테이블은 유저의 접속 및 로그아웃 정보를 기록하는 테이블입니다. 세션 데이터는 유저가 게임에 머무르는 시간을 추적하고, 특정 세션 동안 발생한 이벤트들을 연결하는 데 유용합니다.

테이블 필드:

필드 이름 데이터 타입 설명
session_id VARCHAR 세션 고유 식별자
user_id INT 유저 식별자
login_timestamp DATETIME 유저가 게임에 로그인한 시각
logout_timestamp DATETIME 유저가 게임에서 로그아웃한 시각
session_duration INT 세션 동안의 총 플레이 시간 (분 단위)

설명:

  • session_id: 세션에 대한 고유 식별자. 이 값을 통해 user_event_log와 연결하여 세션 동안 발생한 모든 이벤트를 추적할 수 있습니다.
  • login_timestamp, logout_timestamp: 각각 유저의 로그인 및 로그아웃 시간을 기록합니다.
  • session_duration: 로그아웃 시점을 기준으로 플레이한 시간을 계산하여 저장합니다.

예시 데이터:

session_id user_id login_timestamp logout_timestamp session_duration
session_001 1001 2024-10-01 09:00:00 2024-10-01 09:30:00 30
session_002 1002 2024-10-01 10:00:00 2024-10-01 10:50:00 50

1.3 구매 내역 테이블 (purchase_log)

유저의 인게임 구매 기록을 관리하는 테이블입니다. 구매 로그는 주로 매출 관련 통계 및 유저의 구매 성향을 분석하는 데 사용됩니다.

테이블 필드:

필드 이름 데이터 타입 설명
purchase_id INT 구매 고유 식별자 (자동 증가)
user_id INT 유저 식별자
purchase_timestamp DATETIME 구매 발생 시각
item_id INT 구매한 아이템 ID
amount DECIMAL 결제 금액
currency VARCHAR 결제한 통화 (USD, EUR 등)
session_id VARCHAR 구매가 발생한 세션 ID

설명:

  • user_id: 구매한 유저를 추적합니다.
  • purchase_timestamp: 구매가 이루어진 정확한 시간 기록.
  • item_id: 구매한 아이템의 고유 ID. 이를 통해 어떤 아이템이 인기가 있는지 분석할 수 있습니다.
  • amount: 구매 금액을 저장하며, 통화 종류를 currency 필드에서 함께 저장하여 글로벌 게임의 다양한 화폐 단위 처리를 지원합니다.

예시 데이터:

purchase_id user_id purchase_timestamp item_id amount currency session_id
1 1001 2024-10-01 09:05:00 201 5.99 USD session_001
2 1002 2024-10-01 10:20:00 202 9.99 USD session_002

1.4 레벨/성장 추적 테이블 (user_level_log)

유저의 레벨 상승 및 성장 관련 기록을 추적하는 테이블입니다. 게임 내에서 유저의 성장을 시간에 따라 분석하는 데 도움을 줍니다.

테이블 필드:

필드 이름 데이터 타입 설명
level_log_id INT 고유 레벨 로그 식별자 (자동 증가)
user_id INT 유저 식별자
new_level INT 유저가 도달한 새로운 레벨
level_up_timestamp DATETIME 레벨 상승이 이루어진 시간
session_id VARCHAR 레벨 상승이 이루어진 세션 ID

예시 데이터:

level_log_id user_id new_level level_up_timestamp session_id
1 1001 10 2024-10-01 10:15:00 session_001
2 1002 12 2024-10-01 11:00:00 session_002

2. 활용 예시

이러한 테이블 구조를 통해 다음과 같은 사용자 활동을 추적할 수 있습니다:

  • DAU/MAU 계산: user_event_log에서 특정 기간 동안의 로그인 이벤트를 집계하여 활성 유저 수를 계산할 수 있습니다.
  • 구매 행동 분석: purchase_log를 통해 유저의 구매 패턴 및 아이템 선호도를 분석할 수 있습니다. 이는 게임 내 경제 밸런스 조정에 중요한 데이터가 됩니다.
  • 세션 분석: user_session 테이블을 통해 유저가 하루 평균 얼마나 오래 게임을 즐기는지 분석할 수 있으며, 세션당 발생하는 이벤트 빈도도 파악할 수 있습니다.
  • 레벨 상승 패턴 분석: user_level_log

를 사용하여 유저들이 특정 레벨에서 얼마나 오랫동안 머무는지, 레벨 업 속도를 분석할 수 있습니다.


결론

사용자 활동 추적을 위한 테이블 구조는 게임 내 다양한 이벤트와 상호작용을 기록하고, 이를 바탕으로 유저의 활동 패턴을 분석하는 데 필수적입니다. 로그 기반 구조를 통해 시간에 따른 유저 행동을 쉽게 분석할 수 있으며, 이는 게임의 운영 및 분석에 중요한 인사이트를 제공합니다.

이벤트 로그를 위한 데이터 카드 자료구조는 각 이벤트를 구조화된 방식으로 기록하고, 이를 쉽게 저장, 추적 및 분석할 수 있게 해주는 구조입니다. 이벤트 로그는 다양한 상황에서 활용될 수 있으며, 특히 시스템 모니터링, 사용자 활동 추적, 오류 분석, 그리고 성능 모니터링과 같은 용도로 많이 사용됩니다.

이벤트 로그를 위한 데이터 카드 자료구조는 이벤트 발생 시점, 이벤트 유형, 이벤트 발생 위치, 이벤트 설명 등과 같은 주요 정보를 저장하는 방식으로 설계됩니다.

1. 이벤트 로그 데이터 카드 설계

데이터 카드를 사용하여 이벤트 로그를 구조화하는 기본 아이디어는, 각 이벤트를 카드로 간주하고 이를 시간순으로 저장하거나 추적하는 방식입니다.

필수 항목:

  • 이벤트 ID: 고유한 이벤트 식별자.
  • 이벤트 유형: 오류, 경고, 정보 등 이벤트의 유형.
  • 이벤트 설명: 이벤트에 대한 상세 설명.
  • 이벤트 발생 시간: 이벤트가 발생한 시간.
  • 추가 데이터: 이벤트와 관련된 추가 정보(예: 발생한 시스템 정보, 사용자 정보 등).

2. 예제 코드: 이벤트 로그를 위한 데이터 카드

from dataclasses import dataclass, field
from typing import Dict, Any, List
from datetime import datetime
import json

@dataclass
class EventLogCard:
    event_id: int
    event_type: str
    description: str
    timestamp: datetime
    metadata: Dict[str, Any] = field(default_factory=dict)

    # 이벤트 로그를 JSON으로 직렬화
    def to_json(self) -> str:
        return json.dumps(self.__dict__, default=str, indent=4)

    # JSON에서 이벤트 로그 복구
    @staticmethod
    def from_json(json_data: str):
        data = json.loads(json_data)
        data['timestamp'] = datetime.fromisoformat(data['timestamp'])
        return EventLogCard(**data)

# 예시: 새로운 이벤트 로그 생성
event_card = EventLogCard(
    event_id=1,
    event_type="ERROR",
    description="Database connection failed",
    timestamp=datetime.now(),
    metadata={"server": "db1", "retry_attempts": 3}
)

# 이벤트 로그를 JSON으로 변환 (파일로 저장하거나 전송할 수 있음)
json_event = event_card.to_json()
print("이벤트 로그의 JSON 표현:")
print(json_event)

# JSON 데이터를 이용해 이벤트 로그 복구
restored_event_card = EventLogCard.from_json(json_event)
print("\n복구된 이벤트 로그:")
print(restored_event_card)

출력 결과:

이벤트 로그의 JSON 표현:
{
    "event_id": 1,
    "event_type": "ERROR",
    "description": "Database connection failed",
    "timestamp": "2024-10-17T13:45:30.517698",
    "metadata": {
        "server": "db1",
        "retry_attempts": 3
    }
}

복구된 이벤트 로그:
EventLogCard(event_id=1, event_type='ERROR', description='Database connection failed', timestamp=datetime.datetime(2024, 10, 17, 13, 45, 30, 517698), metadata={'server': 'db1', 'retry_attempts': 3})

3. 이벤트 로그 모음 및 관리

이벤트 로그는 시간 순서대로 기록되므로, 여러 개의 이벤트 로그 카드를 리스트에 저장하여 로그 모음을 관리할 수 있습니다. 예를 들어, 시스템 모니터링을 위한 이벤트 로그 리스트를 다음과 같이 구현할 수 있습니다.

@dataclass
class EventLogDeck:
    deck_name: str
    events: List[EventLogCard] = field(default_factory=list)

    # 새로운 이벤트 로그 추가
    def add_event(self, event: EventLogCard):
        self.events.append(event)

    # 이벤트 로그를 시간순으로 정렬
    def sort_by_time(self):
        self.events.sort(key=lambda event: event.timestamp)

    # 특정 유형의 이벤트 로그 필터링
    def filter_by_type(self, event_type: str) -> List[EventLogCard]:
        return [event for event in self.events if event.event_type == event_type]

    # 모든 로그 출력
    def display_events(self):
        for event in self.events:
            print(f"[{event.timestamp}] {event.event_type}: {event.description}")

# 이벤트 로그 덱 생성
event_log_deck = EventLogDeck(deck_name="System Event Logs")

# 여러 이벤트 로그 추가
event_log_deck.add_event(event_card)
event_log_deck.add_event(EventLogCard(
    event_id=2,
    event_type="WARNING",
    description="High memory usage detected",
    timestamp=datetime.now(),
    metadata={"memory_usage": "95%", "threshold": "90%"}
))

event_log_deck.add_event(EventLogCard(
    event_id=3,
    event_type="INFO",
    description="Backup completed successfully",
    timestamp=datetime.now(),
    metadata={"duration": "15 minutes", "backup_size": "1GB"}
))

# 시간 순으로 정렬
event_log_deck.sort_by_time()

# 모든 이벤트 로그 출력
print("\n시스템 이벤트 로그:")
event_log_deck.display_events()

# 특정 이벤트 유형 필터링
error_logs = event_log_deck.filter_by_type("ERROR")
print("\nERROR 유형의 이벤트 로그:")
for error in error_logs:
    print(f"{error.event_type}: {error.description}")

출력 결과:

시스템 이벤트 로그:
[2024-10-17 13:45:30.517698] ERROR: Database connection failed
[2024-10-17 13:46:00.123456] WARNING: High memory usage detected
[2024-10-17 13:47:10.789012] INFO: Backup completed successfully

ERROR 유형의 이벤트 로그:
ERROR: Database connection failed

4. 이벤트 로그의 JSON 저장 및 로드

이벤트 로그 리스트는 JSON 파일에 저장하거나, 이를 다시 로드할 수 있습니다. 예를 들어, JSON 파일로 직렬화하고 저장한 후, 파일에서 다시 읽어올 수 있습니다.

JSON 저장 예제:

# 전체 이벤트 로그 덱을 JSON으로 저장
def save_log_to_file(log_deck: EventLogDeck, filename: str):
    with open(filename, 'w') as f:
        json.dump([event.to_json() for event in log_deck.events], f, indent=4)

# JSON 파일에서 이벤트 로그를 복원
def load_log_from_file(filename: str) -> EventLogDeck:
    with open(filename, 'r') as f:
        events_json = json.load(f)
        events = [EventLogCard.from_json(event) for event in events_json]
        return EventLogDeck(deck_name="Loaded Event Logs", events=events)

# 이벤트 로그를 파일로 저장
save_log_to_file(event_log_deck, "event_logs.json")

# 파일에서 이벤트 로그를 불러오기
loaded_log_deck = load_log_from_file("event_logs.json")
print("\n불러온 이벤트 로그:")
loaded_log_deck.display_events()

요약

  • 이벤트 로그 데이터 카드는 이벤트 정보를 구조화하여 기록하는 방식으로, 각각의 이벤트가 카드 형태로 관리됩니다.
  • 이 데이터 카드에는 이벤트의 타입, 설명, 발생 시간, 그리고 메타데이터가 포함됩니다.
  • 이벤트 로그 덱을 사용하여 여러 이벤트를 시간 순으로 관리하거나, 특정 이벤트 유형을 필터링할 수 있습니다.
  • 이벤트 로그는 JSON 형식으로 직렬화하여 파일로 저장하거나, 다시 파일에서 불러올 수 있어 공유 및 분석이 용이합니다.

이 구조는 시스템 모니터링, 애플리케이션 로그 관리, 사용자 활동 추적 등 다양한 상황에서 활용될 수 있습니다.

타임 트랙(Time Track) 자료구조는 시간에 따른 데이터나 이벤트의 기록을 저장하고 관리하는 데 사용할 수 있습니다. 예를 들어, 특정 시점에 발생한 이벤트나 데이터를 저장하고, 이를 시간 순서대로 관리하거나 조회하는 경우가 많습니다.

파이썬 리스트를 활용하여 타임 트랙 자료구조를 구현하면, 시간에 따른 데이터를 간단하게 저장하고 특정 시간 범위에 발생한 데이터를 검색하는 기능 등을 추가할 수 있습니다. 리스트의 기본 특성을 활용하여 시간 순서대로 데이터를 쉽게 관리할 수 있습니다.

1. 타임 트랙 설계

타임 트랙 자료구조는 다음과 같은 주요 기능을 포함할 수 있습니다:

  • 이벤트 기록: 특정 시간과 그에 해당하는 데이터를 기록합니다.
  • 시간 범위 검색: 주어진 시간 범위 내에서 발생한 이벤트를 검색합니다.
  • 최신 이벤트 조회: 가장 최근에 발생한 이벤트를 쉽게 조회할 수 있는 기능.

2. 타임 트랙 자료구조 구현

import time

class TimeTrack:
    def __init__(self):
        """
        시간에 따른 데이터 트랙을 저장할 리스트 초기화.
        각 요소는 (타임스탬프, 데이터)로 구성됨.
        """
        self.track = []

    def add_event(self, data):
        """
        현재 시간과 데이터를 기록.
        """
        timestamp = time.time()  # 현재 시간의 타임스탬프를 가져옴
        self.track.append((timestamp, data))
        print(f"Event added at time {timestamp}: {data}")

    def get_latest_event(self):
        """
        가장 최근에 추가된 이벤트를 반환.
        """
        if not self.track:
            return None  # 리스트가 비어있으면 None 반환
        return self.track[-1]  # 마지막 요소가 가장 최근의 이벤트

    def get_events_in_range(self, start_time, end_time):
        """
        특정 시간 범위 내에서 발생한 이벤트들을 반환.
        start_time: 범위의 시작 시간 (타임스탬프)
        end_time: 범위의 끝 시간 (타임스탬프)
        """
        return [(timestamp, data) for (timestamp, data) in self.track if start_time <= timestamp <= end_time]

    def __repr__(self):
        """
        저장된 모든 이벤트를 출력하는 메서드.
        """
        return f"TimeTrack({self.track})"


# 예제 사용

# 타임 트랙 생성
time_track = TimeTrack()

# 이벤트 추가
time_track.add_event("Start Task A")
time.sleep(1)  # 1초 대기
time_track.add_event("End Task A")
time.sleep(1)  # 1초 대기
time_track.add_event("Start Task B")

# 최근 이벤트 조회
print("\nLatest event:")
print(time_track.get_latest_event())

# 시간 범위 검색
start_time = time.time() - 3  # 3초 전부터의 기록 검색
end_time = time.time()  # 현재 시간까지
print("\nEvents in the last 3 seconds:")
events_in_range = time_track.get_events_in_range(start_time, end_time)
for event in events_in_range:
    print(event)

코드 설명

  1. TimeTrack 클래스:

    • 이 클래스는 이벤트와 해당 이벤트가 발생한 시간을 저장합니다.
    • 각 이벤트는 (타임스탬프, 데이터) 형태로 리스트에 저장되며, 타임스탬프는 time.time()을 사용해 초 단위로 기록합니다.
  2. add_event(self, data) 메서드:

    • 새로운 이벤트가 발생하면, 현재 시간의 타임스탬프와 함께 데이터를 리스트에 추가합니다.
    • time.time() 함수는 현재 시간을 초 단위의 부동소수점 수로 반환합니다.
  3. get_latest_event(self) 메서드:

    • 리스트에서 가장 최근에 추가된 이벤트를 반환합니다. 리스트의 마지막 요소가 가장 최근 이벤트이므로, self.track[-1]을 사용해 마지막 요소를 반환합니다.
  4. get_events_in_range(self, start_time, end_time) 메서드:

    • 주어진 시간 범위(start_time, end_time) 내에 발생한 이벤트들을 검색하여 리스트로 반환합니다.
    • 리스트 컴프리헨션을 사용하여 주어진 시간 범위에 속하는 이벤트만 필터링합니다.
  5. __repr__(self) 메서드:

    • 객체를 문자열로 표현할 때, 저장된 모든 이벤트를 출력합니다.

실행 결과

Event added at time 1697544667.065451: Start Task A
Event added at time 1697544668.067688: End Task A
Event added at time 1697544669.070716: Start Task B

Latest event:
(1697544669.070716, 'Start Task B')

Events in the last 3 seconds:
(1697544667.065451, 'Start Task A')
(1697544668.067688, 'End Task A')
(1697544669.070716, 'Start Task B')

기능 설명

  1. 이벤트 기록: add_event 메서드를 통해 이벤트와 그에 대한 시간을 기록합니다.
  2. 최신 이벤트 조회: get_latest_event 메서드를 사용하여 리스트에서 가장 최근에 발생한 이벤트를 조회할 수 있습니다.
  3. 시간 범위 검색: get_events_in_range 메서드를 통해 특정 시간 범위 내에서 발생한 이벤트만 필터링하여 검색할 수 있습니다.

확장 가능성

  • 이벤트 삭제: 특정 시간 또는 조건에 해당하는 이벤트를 삭제하는 기능을 추가할 수 있습니다.
  • 정렬된 삽입: 타임스탬프를 기준으로 삽입 시 정렬된 형태를 유지할 수도 있습니다.
  • 이벤트 카테고리화: 이벤트를 특정 카테고리(예: 작업, 에러, 상태 변경 등)로 분류하여 관리할 수 있습니다.
  • 타임스탬프 포맷 변경: 초 단위의 타임스탬프 대신, 더 사람이 읽기 쉬운 형식(예: YYYY-MM-DD HH:MM:SS)으로 기록할 수도 있습니다.

이 타임 트랙 자료구조는 시간 기반 데이터 추적이 필요한 다양한 상황에서 유용할 수 있으며, 특히 로그 시스템이나 이벤트 기록 시스템 등에 적용할 수 있습니다.

+ Recent posts