유지상

경진대회 예선 플랫폼

공공 경진대회 예선의 시간·트랙·1회 제출 규칙을 서버에서 강제하고, 코드 실행은 기존 제품에 맡기되 대회용 자원은 분리했습니다.

Spring Boot, Spring Security, JPA, Mustache, MySQL, CodeMirror

답을 고쳐 낼 수 없어야 하는 시험

공공 경진대회 예선을 온라인으로 치러야 했습니다. 참가 팀이 브라우저에서 답안 코드를 쓰고 제출하면 실행 결과로 판정하는 방식인데, 시험이라는 성격 때문에 플랫폼이 막아야 할 것이 한둘이 아니었습니다. 시작 전에 문제가 보이면 안 되고, 끝난 뒤에 들어온 제출이 받아지면 안 됩니다. 한 문제에 답을 여러 번 제출하며 맞춰 보는 것도 시험에서는 허용할 수 없습니다.

출제와 담당 범위

Java 20문제와 Python 20문제를 직접 냈고, 플랫폼 코드도 혼자 작성했습니다. 출제한 문제는 KISA가 구성한 평가위원단이 검수했습니다.

규칙을 서버 통제로 옮기기

대회 규칙서버에서 강제한 경계
팀마다 Java와 Python 중 한 트랙에 참가인증 뒤 경로를 트랙별로 분리하고 다른 트랙은 인가 단계에서 차단
운영자가 참가 계정을 발급운영자 권한으로만 계정을 만들고 최초 로그인 때 비밀번호 변경 강제
시작 전 문제 노출과 종료 후 제출 금지문제 조회마다 대회 시간 창 확인
반복 제출로 답을 추측하는 행위 금지제출 이력을 확인해 문제당 한 번만 제출 허용

제출한 코드와 채점 결과는 팀 식별자와 문제 식별자, 제출 시각, 접속 IP와 함께 남겼습니다.

실행 엔진은 다시 만들지 않았습니다

코드를 실제로 돌려서 판정하는 부분은 이미 회사에 있었습니다. 시큐어코딩 실습 제품이 학습자 코드를 실행해 결과를 돌려주고 있었으니, 대회 플랫폼은 그 실행 API를 그대로 호출했습니다. 남은 일정에 실행 환경을 새로 만드는 대신, 플랫폼은 자격과 시간과 제출 횟수를 맡고 실행은 넘겼습니다.

자원까지 같이 쓰지는 않았습니다. 대회용 실행 서버는 운영 중인 서비스와 분리해 따로 올렸습니다.

확인한 구현 범위

저장소 검토로 40개 문제 경로, 트랙별 접근 제어, 시간 창 분기, 1회 제출과 실행 API 위임 구조를 확인했습니다.

소속 경력