오늘은 EPL 리그 성적 업데이트를 하는 것 만들었습니다. 
간단한 API를 만들 때 플로우나 어떤 데이터를 가지고 가공을 해야하는지 정리해두고 하는게 일을 효과적으로 빠르게 처리할 수 있습니다. (개인적인 생각)

목적 

- 크롤링 해온 데이터와 기존의 DB 정보에서 오늘 진행한 경기가 끝날 때마다
  (스케줄러{현재 - 24:00 기준으로 진행중}) 클럽별 총 전적을 업데이트함.

PremierLeaugeData :  EPL 리그에 대한 상세 내용이 기재되어 있는 사이트에서 데이터를 크롤링해서 필요한 정보만 가져옵니다.
DatabaseData : 데이터베이스 내에 업데이트 되어야하는 테이블에서 기본키값과 클럽ID, 클럽명(LEFT JOIN 클럽) 을 가져옵니다. 

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) ...

return query;

Q) 데이터 가공되어질 때마다 query를 DB에 보내면 되지 않나요?
A) 저는 데이터베이스 연결을 요청하는 작업이 많은 자원을 소모하기 떄문에, 한번에 query를 만들어서 보내는게 좋다고 생각했습니다.

Q) INSERT INTO ... ON DUPLICATE KEY UPDATE 가 아니라 UPDATE 구문을 사용해도 되는 것 아닌가요?
A) 저도 성능을 직접 측정해보지 않아서 정확하게는 모르겠습니다. 추후에 정리한 뒤 어떤 것이 더 효율적인지 비교하려고합니다.

'개발일지 > 설계' 카테고리의 다른 글

[Node.js] 채팅 설계 Q&A  (2) 2024.02.14

사이드 프로젝트 진행중 ... 안드로이드 개발자(기획)와 백엔드 개발자의 채팅 설계 질문지에 대한 답변 정리입니다.

Q) 1:1 채팅 앱인지, 그룹 채팅 앱인지?

A) 그룹 채팅입니다. 생각했던 스토리는 경기 시작 1시간 전에 채팅방 입장이 가능하고(나중에 푸시와 연동) 경기 종료 1시간 후에 채팅방이 끝나는 느낌이구요, 그 때 해당 경기에 관해 채팅을 할 수 있는 방이 하나만 열리고, 그 방에서 그룹 채팅을 하는 형태입니다.

Q) 일별 능동 사용자 수 (DAU) 기준으로 몇명을 처리할 예정인지?

A) 아직 고려는 하지 않았습니다. 몇 명인지에 따라서 개발 방향이 크게 바뀐다면 한번 다같이 더 찾아보고 의논해보는 게 좋을 것 같습니다.

Q) 그룹 채팅의 경우에 인원 제한이 있는지?

A) 따로 두지는 않았습니다. Socket 통신 시 문제가 생기는 지점이 있는지 파악을 해두는 건 좋을 것 같습니다. 서버단에서 체크를 해보는 것도 좋을 것 같아요. 

Q) 중요 기능으로 어떤 것이 있는지, 첨부파일도 지원할 수 있는지?

A) 저희가 따로 파일을 저장하는 시스템이 현재 없어서 첨부파일은 고려하지 않아도 될 것 같구요. 간단하게 생각해본 건 챗봇 느낌으로 명령어나 특정 메세지를 보내면 그에 맞게 데이터를 보내주고 클라 UI 상에서 일반 메시지와는 다르게 보여준다거나, 경기와 관련된 채팅이기 때문에 득점이나 경기 시작, 종료 등과 같은 상황을 브로드캐스트로 뿌려준다거나 하는 등의 기능을 생각해봤습니다. 우선은 복잡하게 데이터 규격을 정해야 하는 기능보다는 문자열 형태로도 주고받을 수 있는 기능인데, 다른 형태로 구현해 볼만한 기능이 있는지도 고민해보겠습니다.

Q) 메시지 길이에 제한이 있는지?

A) 당장은 변수가 발생할 수도 있는 상황을 배제하고 원활한 처리를 위해 길이를 제한하는 게 좋을 것 같구요, 현재는 메시지 저장을 따로 안 하는데 차후에 더 디벨롭해서 기능을 확장하게 되어 저장을 한다면 테이블 구조와 소켓 통신, 클라에서 처리 가능한 길이 등을 고려해서 제한을 두는 것도 좋을 것 같습니다.

Q) 종단 간 암호화를 할 것 인지?

A) 메시지 저장하기 전까지는 고려하지 않아도 될 것 같습니다.

Q) 채팅 이력은 얼마나 오래 보관해야하는지?

A) 지금 기능 상으론 서버에선 소켓으로 들어온 메세지를 바로바로 다시 내보내는 형태일 걸로 생각되는데 그 때 따로 보관은 하지 않아도 될 것 같구요. 클라에선 채팅방 입장~퇴장 까지 중에서 화면이 활성화되어 있는 상황에서 주고 받은 메세지들은 보여줘야 하기 때문에 메모리상에는 들고 있을 것 같습니다. 서버나 클라나 현재로선 메시지를 DB에 저장하지는 않아서 관련 기능 추가전까지는 고려하지 않아도 될 것 같습니다.

프로젝트 GITHUB : https://github.com/Mirandalaw/gooner

 

+ Recent posts