온라인 해킹 대회 사이트 만들기 1 > 요구사항 정의
내가 다니고 있는 순천향대학교 정보보호학과는 매년 고등학생들을 대상으로 해킹 대회를 개최한다.
보다시피 단순히 학생들 끼리 주최하는 것이 아닌, 대학교와 함께 진행하는 나름의 큰 행사이다.
보통 대게 해킹대회는 다음과 같은 프로세스로 진행된다.
- 온라인 예선
- 온라인으로 로그인을 하여 해킹대회 문제를 푼다.
- 예선에서 상위 등수를 차지한 이들은 본선에 진출한다.
- 오프라인 본선
- 오프라인 장소에 인원들이 모여 온라인으로 대회를 진행한다.
- 여기서 상위 등수를 차지한 이들은 상을 받는다.
또한 (학생들이 자주적으로) 매년 새로운 사이트를 개발하여 진행하는 것이 전통이다.
안정성이 중요한 ‘대회’ 플랫폼이기 때문에, 매년 새로운 사이트를 만들지 말고 하나를 제대로 만들어서 운영하는 것이 좋은 것은 분명하다. 하지만 이게 전통이라니 어떡하겠는가.
딱 할것도 없어서 심심하기도 해서 2022년 올해는 내가 자원하여 개발하기로 하였다.
하지만 풀스택을 하기엔 시간이 너무 뺏길 것 같아서 프론트엔드 개발을 하는 과 동기와 함께 프로젝트를 맡았다.
(결국에는 풀스택 했다……)
요구사항 정의
주최측 개발 요구사항
일반 사용자 기능
- 인증
- 로그인
- 문제
- 문제 푼사람 리스트 확인 가능.
- 문제 점수 확인.
- 문제 풀기.
- 문제 점수는 풀이자 수에 따라서 dynamic하게 산정되어야 함.
- 랭킹 확인
- dynamic score가 적용된 순위
관리자 기능
- 회원 관리
- 회원 생성
- 회원 삭제
- 권한 편집
- 문제 관리
- 문제 등록
- 문제 등록시 파일도 같이 업로드 가능하겠끔 개발
- 수정
- 삭제
- 문제 등록
- 로그 열람
- 사용자와 관리자들의 행위에 대한 로그가 남았으면 함 (부정행위 방지용)
이러한 요구사항 정의에 맞게 필요한 테이블과 테이블의 필수 칼럼 요소들을 정리해보았다.
데이터베이스 설계 (임시안)
문제 테이블(ProblemEntity) idx, 문제명, 출제자, 문제내용(html), 플래그, Type(enum Forensic, misc …. etc ), 공개여부(T, F) List(Solved) : <- 연관관계
문제 파일 테이블(ProblemFileEntity) idx, 문제 id, 업로더 id, 기본점수 fileName(UUID_originFileName), OriginFileName, 업로드 시간 파일다운로드 여부도 띄어야함
회원 테이블(AccountEntity) idx, 이름, 아이디, 비밀번호, 이메일 닉네임, User_Role(일반회원, 운영진=출제자), List(Solving) : <- 연관관계
Solved 테이블(SolvedEntity) idx, 문제 id, 회원id, 맞춘 시각-> 이건 Auth Log 테이블 내 정답여부(is_success) = T로 검사하는 것으로 대체Auth Log 테이블(AuthLogEntity) idx, 회원 id, 문제 id, auth한 값, 정답 여부(enum T, F)
Admin Log 테이블(AdminLogEntity) idx, 회원 id, Action, 시간
공지사항 테이블(NoticeEntity) idx, 제목, 내용, 생성 시각, 수정 시각
다음 임시안을 토대로 하여 다음과 같은 데이터베이스를 설계하였다.
최종 ERD
ERD를 보면, “Notification랑 NotificationDetail 테이블 왜 연관관계 지정안했나요?” 라고 할 수 있다.
나는 개발의 편리함을 위해 데이터의 정합성이 필히 요구되는 테이블만 연관관계를 지정한 점 참고바란다.
디자인 기획
내가 대회를 운영하는 것이 아니기 때문에, 주최측에서 원하는 대로 개발하여야 했다. 다만, 한가지 예외로 사이트 디자인은 우리 맘대로 하라고 하셨다.
그래서 프로젝트를 맡은 나랑 친구는 깊은 고뇌에 빠졌다.
어떻게 디자인해야 이쁘게 만들었다고 소문이 날까?
고민만 며칠하다가… 내가 우분투 디자인으로 하면 어떨까? 제안했고,
결국 디자인은 우분투 디자인으로 확정되었다.
(해킹 공부하는 고등학생, 즉 미래 공대생들을 위한 대회라 우분투 디자인으로 하면 나름 재치있다고 평가받을 것이다.)
다음은 프론트엔드를 전담하는 친구가 피그마로 디자인 한 사진이다.
나는 직접적인 디자인은 안하고, 말로만 참여했다.
Comments powered by Disqus.