-
http / tcp 통신을 이용해 클릭 대회를 구현한 프로젝트 입니다.
-
HH시 00분 부터 1분 간 가장 많이 클릭한 사용자를 찾아내는 것이 목표입니다.
-
1분은 00초부터 59.999999초를 의미하며, 시간 범위에 들어오지 않은 클릭은 세지 말아야합니다.
-
어떠한 연속된 1초 구간 내에 클릭 횟수가 4회를 초과하면 실격 처리됩니다.
( 초당 4회를 초과 시, 부정행위자로 간주하고 누적 클릭량에 관계 없이 실격 처리 ) -
회원가입하지 않은 유저는 참여 할 수 없습니다.
-
첫 클릭은 참여로 간주됩니다.
-
참여한 유저가 10초간 클릭하지 않는다면 자동 실격 처리됩니다. 즉, 이후의 요청을 세지 말아야합니다.
-
각종 사유로 실격한 참여자는 재참여 할 수 없습니다.
-
클릭 수가 동일한 선두가 생길 경우, 1 마이크로초라도 빠르게 클릭수에 도달한 유저가 우승자가 됩니다.
-
클릭 요청은 TCP 통신을, 회원가입은 HTTP 서버로 구현
-
이벤트 종료 후, 우승자의 아이디 / 주소지 / 클릭 횟수 를 출력할 수 있어야 함
-
e2e(End To End) 테스트 및 유닛 테스트 구현
-
클러스터 모드로 실행되도록 설계
-
어떠한 외부 소스 없이 구현
-
Repository를 복제하여 IDE로 폴더를 연다.
-
eventServer/session.js 파일로 들어가 시간 설정을 해준다.
// 이벤트 시작 시간 hour(0~23):minute(0~59) const hour = 6; const minute = 58;
-
아래의 명령어를 터미널에 입력하여 클러스터 모드로 실행해준다.
node common/clustering/cluster.js
-
아래의 명령어를 추가 터미널에 입력하여 더미 클라이언트를 실행해준다.
node tests/e2e/client.spec.js
-
설정된 시간을 기준으로 1분 이후 우승자 결과가 cluster 터미널 화면에 확인된다!
( 현재 단위 테스트에서 오류가 나는 부분이 있어 주석처리 해두었습니다 )
// eventServer/classes/session/userSession.class.js
this.timer = setTimeout( async ()=> {
this.isOpen = true;
// console.log("시작");
await new Promise((resolve) => setTimeout(() => resolve(), 60000));
this.isOpen = false;
// console.log("끝");
await this.countUpload();
// 결과 확인용 ( 단위 테스트 시 오류 발생으로 주석처리 )
//setTimeout(async () => console.log(await this.getWinner()), 5000);
}, delay)회원가입 오류 시 database.sqlite 파일을 지워주세요!
(중복 회원가입 불가)
-
Repository를 복제하여 IDE로 폴더를 연다.
-
eventServer/session.js 파일로 들어가 시간 설정을 해준다.
// 이벤트 시작 시간 hour(0~23):minute(0~59) const hour = 6; const minute = 58;
-
터미널을 2개를 실행하여 각각 아래의 명령어들을 입력해준다
# TCP 서버 node eventServer/server.js # HTTP 서버 node registerServer/server.js
-
더미 클라이언트 파일을 연다 tests/e2e/client.spec.js
-
맨 아래에 있는 실행문에서 주석처리를 아래와 같이 변경해준다
// 부하 테스트 실행문 for (let i = 0; i < 5; i++) { // 일반 테스트 await defaultTest(5, i); // 클러스터 테스트 //await clusterTest(5, i); await new Promise((resolve) => setTimeout(() => resolve(), 1000)); }
-
아래의 명령어를 추가 터미널에 입력하여 더미 클라이언트를 실행해준다.
node tests/e2e/client.spec.js
-
tests/unit 폴더에 있는 각각의 파일들을 단일로 실행시켜 준다.
# 예시 node tests/unit/controllers/event.onData.spec.js



