Skip to content

feat: Judge0 부재 시 동작하는 StubJudgeService 추가 - #26

Merged
s26059-maker merged 2 commits into
developfrom
feature/stub-judge-service
Aug 7, 2026
Merged

feat: Judge0 부재 시 동작하는 StubJudgeService 추가#26
s26059-maker merged 2 commits into
developfrom
feature/stub-judge-service

Conversation

@s26059-maker

Copy link
Copy Markdown
Contributor

개요

채점용 학교 VM(GSM SV judge0 인스턴스)이 만료되어 Judge0에 접근할 수 없는 상태입니다.
12월 데모 직전(11월)에 VM을 재구축할 예정이며, 그때까지 백엔드/프론트 개발이
채점 엔진 부재로 막히지 않도록 JudgeService의 스텁 구현체를 추가합니다.

JudgeService 인터페이스 경계는 그대로 유지되어 SubmissionService
Judge0/Stub 중 무엇이 주입됐는지 알지 못합니다.

변경 사항

  • infra/stub/StubJudgeService 신규 — 기본 동작은 전체 통과(AC), 매직 주석으로 특정 verdict 강제
  • infra/judge0/Judge0Configjudge0.url blank 여부로 Stub/Judge0Adapter 분기 (ExecutorConfig와 동일 패턴)
  • application.ymlJUDGE0_URL 기본값을 http://localhost:2358 → 빈 문자열로 변경
  • CLAUDE.md — §8.5에 안내 추가, §11 백로그 섹션 신설
  • StubJudgeServiceTest 신규

매직 주석

제출 코드 첫 줄에 아래 주석이 있으면 해당 verdict를 강제합니다. (//, # 모두 인식)

주석 결과
//STUB:WA Wrong Answer (total - 1 통과)
//STUB:TLE Time Limit Exceeded
//STUB:RE Runtime Error (시간/메모리 더미값 채움)
//STUB:CE Compile Error (시간/메모리 null)
없음 Accepted, 전체 통과

Verdict.PENDINGSubmission 생성 시 초기값일 뿐 judge() 반환값이 될 수 없어 제외했습니다.

점수는 SubmissionService.persist()에서 verdict != AC면 이미 0으로 고정되므로
스텁 쪽에 별도 처리를 넣지 않았습니다.

스텁 사용 사실 노출

예외를 성공으로 위장하지 않도록, 스텁 동작임을 명시적으로 드러냅니다.

  • 기동 시 WARN 레벨 배너 로그
  • 채점 호출마다 WARN 로그 (요청 상관관계 ID 포함)

SubmissionService.submit()Submission 저장 전에 judge()를 호출하므로
채점 시점에는 DB PK가 없습니다. JudgeRequest/SubmissionService를 변경하지 않기 위해
스텁이 호출마다 짧은 UUID를 발급해 로그에 남기는 방식을 택했습니다.

미변경

JudgeRequest, SubmissionService, Judge0Adapter, Flyway 마이그레이션(스키마 변경 없음),
API 응답 DTO(노션 명세가 단일 진실 공급원), LocalProcessExecutor.

LocalProcessExecutor는 문제 생성 시 정답 코드 검증용으로 Judge0과 무관하며,
Railway Dockerfile에 gcc/python3가 설치되어 있어 23시 스케줄러는 정상 동작합니다.

⚠️ 머지 후 필수 조치

Railway 환경변수에서 JUDGE0_URL 삭제

현재 죽은 Cloudflare Quick Tunnel URL이 남아 있습니다.
blank가 아니면 Judge0Adapter가 선택되어 프로덕션 제출이 502로 실패합니다.
JUDGE0_TOKEN도 함께 제거하고, 11월 VM 재구축 시 재등록합니다.

재배포 후 로그에 스텁 WARN 배너가 출력되는지 확인 필요.

팀 검토 필요 (임시 초안)

  • 매직 주석 키워드 명명 규칙
  • WA 시 통과 개수 total - 1 (테스트케이스가 1개면 0 통과가 되는 건 불가피)

후속 (백로그)

Judge0Configinfra.stub을 참조하는 구조는 의존 방향이 역전되어 있습니다.
12월 이후 자체 채점 엔진 도입 시 infra/judge/JudgeConfig 같은 중립 설정 클래스로
빈 팩토리를 옮기는 리팩터링이 필요합니다.

테스트

  • ./gradlew compileJava compileTestJava 통과
  • StubJudgeServiceTest(신규), SubmissionServiceTest 전체 통과

@s26059-maker
s26059-maker merged commit 77c2b72 into develop Aug 7, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant