코딩테스트 사이트
React구성
2.1 CodeMirror
2.2 CodeMirror Source Code
2.3 데이터 상태관리
2.4 결과 화면
Server 구성
3.1 Node Express 구성
3.2 문자열을 함수로 변환
3.3 에러가 날경우
3.4 Source Code
먼저 한국에서 많이 쓰이는 사이트부터 알아봤다.
프로그래머스
1. 먼저 코드실행하는 부분과 제출, 그리고 질문하기 테스트케이스추가하기 기능이 있다.
2. 프로그래머스에 로그인하고 문제를 풀다가 나가면 입력했던 코드가 저장되는것을 확인 할 수 있다.
3. 실행결과는 아래 표시영역에 출력되며 결과와 정답 유무를 확인 할 수 있다.
4. JAVA, JS , Python , C 등 다양한 언어를 사용자가 지정하여 설정할 수 있다.
가장 유저입장에서 사용하기 편하고 필요한 기능을 가장 잘 지원해주는 프로그래머스를 따라서 만들어 볼 예정이다.
사용 기술은
종류 | 이름 |
---|---|
Front | React.js |
Back | Node.js |
를 사용할 예정이다 .
필요기능으로는
1. 코드를 IDE환경과 같은 모습으로 입출력 할 수 있어야 한다.
2. 테스팅을 통해 오답 유무를 가려낼 수 있어야한다.
3. 결과를 사용자에게 보여줄 수 있어야한다.
이렇게 3가지를 간단하게 목적으로 두고 만들어볼 예정이다.
2.1 CodeMirror
2.2 CodeMirror Source Code
<div className='codingIDE'>
<CodeMirror
className='CodeMirror'
lineNumber={true} // 줄옆에 숫자
value={code} // 입력된 값을 code라는 변수에 담았다
extensions={[javascript({ jsx: true })]} // 입력값의 종류
onChange={onChange} //값이 변할때마다 호출되는 함수
theme={okaidia} // 테마
gutter={true} // 자동생성
/>
<div className="BtnArea">
이렇게 해주면 CodeMirror를 활용해서 웹 IDE를 구성할 수 있다.
2.3 데이터 상태관리
function App() {
const jsFuction = `function solution(t,p) {
}`
const [code, setCode] = useState(jsFuction); // CodeMirror에 입력되는 값들 ( 기본으로 jsFunction을 가진다 )
const [result, setResult] = useState([]); // 채점 후 결과를 저장하는 곳
const onChange = (e) => {
setCode(e) // CodeMirror의 값이 변할 때마다 호출되어서 값이 저장된다.
}
const runCode = async () => {
// 제출버튼을 누르면 axios를 통해 서버로 코드데이터가 넘어간다.
await axios.post("http://localhost:8080", { "data": code })
.then((result) => {
console.log(result.data)
setResult(result.data.result)
})
.catch((err) => {
console.log(err)
})
}
// CodeMirror에서 MarkDown도 지원해줘서 문제에 대한 설명을 MarkDown으로 표시할 수 있었다.
const markdown = `
## JavaScript 문제풀이
...
`
const markdownExampel = `
#### 출력 예시
...
2.4 결과 화면
3.1 Node Express 구성
3.2 문자열을 함수로 변환
3.3 에러가 날경우
3.4 Source Code
app.post('/', async (req, res) => {
// 문자열인 함수를 받아와서 하나의 함수로 만들기
const execFunc = (new Function("return " + funcNm))();
// result에 함수의 결과값을 받는다.
const result = execFunc(argument1 , argument2)
// err의 결과중 string부분만 받아올 수 있도록 한다.
catch(err){
resultArray.push({'desc': err.toString() , 'state' : 0})
}
...// result를 TestCase와 비교해서 확인하기
return res
.status(200)
.json({"result": resultArray})
});
참고