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 기록 테이블 추가
기록해두면 나중에 팀원이 보기도 좋고, 나중에 복습도 쉬워집니다 😊
'백엔드 개발 > 데이터베이스' 카테고리의 다른 글
TypeORM Connection Pool로 DB 연결 안정성 확보하기 (0) | 2025.04.22 |
---|---|
[TypeORM 최신 문법] getRepository 제거 대응법 (0) | 2025.04.21 |
MySQL INSERT 중복 처리 정리 – IGNORE vs ON DUPLICATE KEY UPDATE 언제 써야 할까? (0) | 2024.01.02 |
SQL 최적화 실전 비교 – SELECT 두 번 쓸까 JOIN 한 번 쓸까 (0) | 2024.01.02 |