[EPL 자동 업데이트 시스템 구축기] 경기 결과 기반 DB 업데이트 플로우 & 쿼리 예제
2024. 3. 7. 07:29
728x90


 EPL 경기 결과를 DB에 자동 업데이트하는 시스템, 어떻게 만들었을까?


매일 새벽 12시, 오늘 치러진 EPL 경기 결과를 기준으로
클럽별 누적 전적을 DB에 자동 업데이트하는 간단한 API를 구성했습니다.
이 포스트에서는 데이터 처리 흐름부터, 실제 쿼리 작성 전략까지 정리해보았습니다.


 목적

 크롤링한 EPL 경기 결과 + 기존 클럽 DB 정보
→ 오늘 경기 기준으로 클럽별 총 전적 자동 반영
→ 스케줄러 기준 00:00에 수행


사용 데이터

1. 크롤링 데이터 (PremierLeagueData)
- 팀명 team, 순위 ranking, 경기수 totalMatches
- 승/무/패 win/draw/lose, 득실점 score/conceded
- 득실차 gainLossDifference, 승점 point, 최근5경기 last5Matches

2. DB 클럽 정보 (DatabaseData)
- participating_club_id (기본키), club_name (LEFT JOIN)


처리 흐름 (Flow)

 



핵심 쿼리 로직

let query = "INSERT INTO [테이블명] (컬럼들...) VALUES";

for (const [index, premierLeagueData] of premierLeagueList.entries()) {
  for (const clubData of clubList) {
    if (clubData.club_name.includes(premierLeagueData.team)) {
      query += `(
        ${clubData.participating_club_id},
        ${premierLeagueData.ranking},
        ${premierLeagueData.totalMatches},
        ${premierLeagueData.win},
        ${premierLeagueData.draw},
        ${premierLeagueData.lose},
        ${premierLeagueData.score},
        ${premierLeagueData.conceded},
        ${premierLeagueData.gainLossDifference},
        ${premierLeagueData.point},
        "${premierLeagueData.last5Matches}"
      )`;

      if (index + 1 !== premierLeagueList.length) query += ',';
    }
  }
}

query += `
  ON DUPLICATE KEY UPDATE 
    ranking = VALUES(ranking),
    totalMatches = VALUES(totalMatches),
    win = VALUES(win),
    draw = VALUES(draw),
    lose = VALUES(lose),
    point = VALUES(point),
    last5Matches = VALUES(last5Matches)
`;



자주 묻는 질문


Q1. 매번 UPDATE하는 게 더 효율적인 거 아닌가요?
A. INSERT + ON DUPLICATE KEY UPDATE를 쓰면
   신규 데이터는 삽입, 기존 데이터는 갱신이라는 흐름에 더 적합합니다.

Q2. 쿼리를 하나하나 보내는 것보다 batch가 나은가요?
A. 네. DB 연결/요청은 비용이 크기 때문에
   한 번의 대량 쿼리 전송이 성능적으로 더 유리합니다.


향후 개선 방향

- 쿼리 효율 측정 (UPDATE vs ON DUPLICATE)
- 트랜잭션 및 에러 핸들링 강화
- job log 기록 테이블 추가

기록해두면 나중에 팀원이 보기도 좋고, 나중에 복습도 쉬워집니다 😊

 

반응형