- 해당 과제는 총 5개의 Step으로 구성되어 있습니다.
- 모든 과제는 C4-Cometrue 깃허브 레포에서 관리되어야 하며, 반드시 각 Step이 종료될 때 마다 PR 요청을 날려야 합니다.
- 물론, 다른 사람들의 PR에 대한 리뷰도 가능합니다.
- 서버는 필요할 때 편하게 말씀해 주세요.
- 상당히 고민이 많이 필요한 주제입니다. 일부 Step에 대해서 제공하는 키워드가 힌트가 될 수 있으니, 키워드와 관련한 학습을 진행하는 것을 권장합니다.
- 궁금증이 있으면 주저하지 말고 서로 커뮤니케이션하고, 그럼에도 해결되지 않는다면 질문을 남겨주세요.
- 각 PR 마다 설계 의도를 작성해주세요. 좀 더 효율적인 리뷰가 가능할 겁니다.
온라인 저지 개발
- 알고리즘 연습 사이트 (ex. 릿코드, 백준, 프로그래머스) 를 개발해 봅시다.
- 최소 1개 이상의 언어를 지원해야 하며, 정/오답 여부, 메모리 및 시간 제한 여부 등을 체크할 수 있어야 합니다.
- 문제 제작자는 문제 데이터 (ex. 테스트케이스, 시간 및 메모리 제한) 를 쉽게 수정할 수 있어야 합니다.
- 기본적인 환경을 구축합니다. 문제를 조회할 수 있는 기능을 개발해 주세요.
- 특정 문제는 다음과 같은 정보를 갖고 있습니다.
- 문제 제목
- 시간/메모리 제한
- 제출 횟수/정답자
- 문제 설명
- 예제 입출력 데이터
- 채점용 데이터 (각 문제당 최소 10개 - 입력 파일/출력 파일 별도로 구성)
- 채점용 데이터는 수백mb 가 넘는 경우도 허다합니다. 이 파일들을 어떻게 관리하는게 좋을까요?
- 문제에는 이미지가 반드시 포함되어야 합니다. 이미지를 관리하는 방법도 생각해 보세요.
- 사용자가 특정 문제에 대한 코드를 제출한 경우, 해당 문제를 채점하여 결과를 반환하도록 만들어 주세요.
- 해당 Step 에서는 정답/오답 여부만 체크합니다.
- 제출할 수 있는 언어는 본인의 편의에 의해 설정하면 되나, 최소 2개 이상의 언어를 사용하도록 만들어 주세요.
- Step 1에서 저장된 모든 채점용 데이터를 활용하여 채점하며, 하나라도 답이 다르다면 오답, 전부 맞는 경우에만 정답으로 인식되도록 개발해 주세요.
- 언어의 컴파일 및 빌드부터 진행해야 합니다. 해당 프로세스에서 실패할 시, "컴파일 에러" 메시지가 떠야겠네요.
- 데이터를 보내는 사용자가 악의적인 코드 (ex. 시스템 강제 종료) 를 호출할 수도 있습니다. 이를 어떻게 막을 수 있을까요?
주의: 해당 Step을 100% 완벽하게 수행하기 위해선,
- Docker 등의 가상화 기술을 활용하거나,
- 채점용 Worker Server Pool을 별도로 구성해야 합니다.
서버가 1대인 경우엔, 채점 때 마다 달라지는 런타임 차이 를 어느정도 감수하고 개발해야 합니다. 해당 사항만 인지하신다면 Step 구현이 불가한 건 아니니 참고해 주세요.
- 채점 환경을 더 고도화 합니다.
- 이제, 여러 문제에 대한 여러 요청이 동시에 들어올 수 있습니다.
- 또한, 제한시간 및 메모리제한을 체크합니다.
- 참고로, 백준과 프로그래머스의 시간제한/메모리제한 정책이 다릅니다. (백준은 상대적으로 런타임 속도가 느린 일부 언어의 경우에 한 해 보너스 시간 제공, 프로그래머스는 정확성 테스트는 10초/효율성 테스트는 정답 코드의 일정 배수)
- (선택 - 도전) 채점 현황을 조회할 수 있는 API를 개발해 주세요. (채점 중인 경우엔 진행 퍼센트 포함)
- 오래 걸려도 괜찮습니다. 다만, 절대 사용자 요청이 유실되지 않도록 해야 합니다.
- 서버 1대로 진행해도, 최소 3개의 채점 프로세스가 돌아야 합니다.
- 사용자가 여러 번 제출 버튼을 누르면, 어떻게 처리해야 할까요?
- (선택 - 도전) 중간에 서버를 꺼버리고, 재부팅 해 주세요. 이 경우에도 사용자 요청이 유실되지 않을 방법이 있을까요?
- (선택 - 도전) Cache의 존재로 인해, 런타임의 오차가 커질 수 있습니다. 이를 보정할 방법을 생각해 보세요.
- 유저가 문제를 쉽게 추가할 수 있도록 기능을 개발합니다.
- Step 1에서 언급한 모든 데이터를 필요로 합니다.
- 문제 임시 저장 및 불러오기가 가능해야 합니다.
- 문제 출제자가 지원하는 언어 중 2개 이상의 언어로 해당 문제를 해결해야만 공개할 수 있습니다.
- (선택 - 도전) 검수진을 추가합니다. 검수진 3인 이상이 해당 문제를 해결해야만 공개할 수 있습니다.
- 제작중인 문제는 어떻게 관리해야 할까요? 특히 DB에서 어떤 방식으로 관리해야 할지 생각해 보세요.
- 문제에 오류가 있거나, 반례를 추가하기 위한 기능을 개발합니다.
- 문제 지문 수정 및 데이터 추가, 시간제한/메모리제한을 수정할 수 있습니다.
- 만약 데이터를 추가하거나, 시간 및 메모리 제한이 추가된 경우, 관련된 모든 제출은 전부 재채점되어야 합니다.
- 단, 특정 언어의 시간제한, 메모리제한만 수정된 경우엔 해당 언어에 대해서만 재채점을 진행합니다.
- 재채점이 진행되는 중에도 다른 문제 채점은 여전히 진행되어야 합니다. 어떻게 해야 서비스 영향도를 최소화할 수 있을까요?
- (선택 - 도전) 10,000 개 이상의 제출이 존재하는 문제를 만들고, 수정을 해 보세요. 문제 없이 동작하나요?
- 실제로 개발한 서버의 성능이 어떨까요?
- 사용자의 사용 시나리오를 설계하고, 이를 활용해 스트레스 테스트 툴을 사용한 성능 테스트를 진행해봅시다.
- 여기서는 nGrinder를 사용해 봅시다.