1. 배경
C언어 문제를 채점해야하는데 효율적인 시간 사용을 위해 'c언어 문제 검사하는 프로그램'을 찾다가 백준같은 Online Judge 사이트의 문제 검사 프로그램을 이용하면 되겠다고 생각했다. 이와 관련한 여러 사이트의 강좌에서 다루는 QingdaoUniversity의 Oneline Judge를 고르게 되었다.
서버 환경은 기호에 맞게 고르면 된다. 경량화가 눈에 띄었고 겸사겸사 windows docker 사용법을 익히기 위해 docker를 선택하였다.
| 구분 | Vmware | Docker |
| 장점 | 완전한 가상 | 경량화 |
| 다양한 운영체제 지원 | 빠른 시작 시간 | |
| 안전성 및 보안 | 확장성 | |
| 이식 | ||
| 단점 | 자원소비 | 완전한 가상화 제공 불가능 |
| 시작시간 | 보안 문제 |
참조한 유튜브 영상
https://youtu.be/G409CtgN0LE?si=5QUxmsRbYAiNmCtp
2. 세팅
windows docker를 사용하고 있다면 유튜브만 보고도 서버를 구성하는건 간단하다.
(하지만, docker-machine에 대해 세팅하지 않으면 docker-machine 명령어 사용이 불가능 한 것 같다.
따라서 위 영상과 조금 다르게 진행해야 하는 것 같다.)
1. (git 사용 유저)는 cmd에서 cd C:\path로 원하는 경로로 이동한다.
2. git clone -b 명령어로 아래사이트의 Deploy를 다운로드 할 수 있다.
https://github.com/QingdaoU/OnlineJudgeDeploy
<cmd>, 관리자 권한 실행
1. git clone -b 2.0 https://github.com/QingdaoU/OnlineJudgeDeploy.git
-> ((관리자권한 실행 - CMD창에서 처럼 다운받은 경로로 이동))
2. docker-compose up -d
<powershell>, 관리자 권한 실행
docker ps -a
docker-machine ip
3. docker로 빌드한 뒤 확인하면 oj-backend / judge-server / oj-redis / oj-postgres 라는 컨테이너를 확인 가능하다.
judge-server는 api 형태로 사용자가 입력한 소스 코드를 채점하는 역할을 수행하는 서버다.
옆에 출력되는 8080포트로 연결할 수 있다.
oj-backend는 실질적으로 443 혹은 80포트로 내부적으로 1443,8000포트로 연결하는 것을 통해 web서버라는 것을 알 수 있다.
위 2가지가 핵심인 것 이다.
이러한 채점 서버는 api 형태로 동작한다. 따라서 채점서버에 접근하는 클라이언트가 되는 웹서버인 oj-backend의 소스코드를 변경하면 웹서비스를 바꿀 수 있다.
다답안을 제출할 때만 한해서 judge-server에서 실행되게 되는 것이다.
3. 로컬서버 접속
ip로 접속하는 건 확인 못했다.
docker inspect -f "{{ .NetworkSettings.IPAddress }}" CONTAINER_ID
위 명령어로 powershell에서 container id를 입력하여 해당 컨테이너의 ip는 얻어올 수 있으나 따로 접속이 되진 않는 것 같다.

대시보드에서 이름을 클릭한다.

보이는 포트옆에 바로가기 표시가 있다. 실제로 눌러보면 80,443포트인 http, https로 이루어진 http://localhost로 이동되며 docker로 빌드한 컨테이너의 사이트로 연결된다.
앞서 언급한 QingdaoUniversity 오픈소스의 read.MD 확인 시,
id: root
password: rootroot
입력 시 root 계정으로 접속 가능하다.
4. 문제 업로드 및 세팅
1. localhost접속
2. 우측 상단 탭에서 management 접속

3. 좌측 탭 list에서 Problem 탭에서 문제 관리 가능

Problem - 'Create Problem' 에서 문제 출제 및 업로드가 가능하다.


이 외에도 code templete, hint 등을 넣을 수 있다.
TEST CASE 넣는 법

먼저 한꺼번에 담아둘 test_case 폴더를 만든다.
문제 이름이 'A+B' 라고 한다면, test_case/A+B가 될 수 있도록 각 문제마다 폴더를 만들어 관리하는게 편할 것이다.

이런식으로 구성하고 이 폴더를 압축한다.

1. 반드시 zip파일로 업로드해야 함.
2. 일반 windows 기능으로 압축하면 empty file이라는 문구가 뜨며 in,out 확장자가 어째서인지 인식이 되질 않는다.
3. 반디집 zip 압축 기능으로 이용하니 정상적으로 업로드 된다.

save 버튼을 누르면 최종적으로 업로드 된다.
5. 실제 문제 확인


정답 확인도 잘 작동한다.

우분투에서 docker 사용한 기억을 되짚다가 이거 데이터 안날아가려나? 따로 저장해야되나 생각했는데
stop, start 버튼만으로 가상머신, 로컬서버를 시작하고, 중지하면 자원도 잡아먹지 않는다니 굉장히 편리하다.
그리고 docker-compose.yml 파일로 이미 c드라이브 어딘가에서 파일로도 저장되어 있어서 걱정없을 것 같다.
마치며..
약1년 전에 docker desktop을 엉성하게 설치하려다가 시스템이 꼬여서 푸느라 에러만 5~6개를 마주하며 애먹었다. 그게 아니라면 도커 부분도 금방 설치했을 것 같다.
매번 vmware를 통한 우분투로 서버를 사용하닥 windows 환경에서 docker desktop을 이용하여 로컬서버를 처음 세팅해봤는데 굉장히 가볍게 돌아간다는 것을 느꼈다. 꼭 vmware를 사용해야하는 부분이 아니라면, 아직은 서툴지만 너무나도 가벼운 docker를 애용할 것 같다.
오픈소스를 서버에 그대로 세팅한 것 뿐이라 내가 한 일은 몇 가지 없어서 더욱 편리했던 것 같다.