오늘은 10월 27일 13일차이다.
우선은 5글자 단어들을 모두 뽑아냈다. 원래는 내가 사용했던 dictionary API에 요청을 해 하나하나 검증하려고 했지만 시간이 너무 오래 걸리고 API 서버에도 무리가 갈 것 같았다. 찾아보니 그 API가 깃허브에 공개되어 있었고, 단어들이 정리된 RAW 파일도 찾을 수 있었다. 거기서 알파벳으로만 이루어진 다섯 글자 단어들을 추출하여 JSON 문서에 담고, MongoDB에서 import하여 데이터베이스를 구성했다.
백엔드 서버에서는 POST /word/exist 요청을 통해 받은 단어를 데이터베이스에서 찾아서 존재한다면 exist: true가 담긴 객체를, 존재하지 않는다면 exist: false가 담긴 객체를 클라이언트로 보낸다.
또한 정답 단어는 random 숫자를 하나 생성하여 db 컬렉션에서 random번 째 단어를 추출해서 랜덤으로 정답 단어를 생성할 수 있도록 하였다.
const fs = require('fs');
const wordList = fs.readFileSync("wordList.txt").toString().split('\n');
const fiveLetters = [];
for ( let i = 0 ; i < wordList.length ; i++ ) {
if( wordList[i].length === 6 ) {
wordList[i] = wordList[i].slice(0, -1);
let hasNotAlphabet = false;
for ( let j = 0 ; j < 5 ; j++ ) {
if ( wordList[i].charCodeAt(j) < 65 || (wordList[i].charCodeAt(j) > 90 && wordList[i].charCodeAt(j) < 97) || wordList[i].charCodeAt(j) >122 ) {
hasNotAlphabet = true;
break;
}
}
if ( hasNotAlphabet )
continue;
const data = {
"word": wordList[i].toUpperCase()
}
fiveLetters.push(data);
}
};
fs.writeFileSync("words.json", JSON.stringify(fiveLetters));
wordList.txt 파일에는 dictionary API 서버에서 가져온 단어들이 들어있다. 이것을 적절히 파싱해서 단어를 추출해준다. 이때 알파벳으로만 이루어져 있고 다섯글자인 단어만 추출해야되기 때문에 조건문으로 걸러줬다. 이 단어들을 words.json 파일에 넣어줬고, MongoDB에서 import하였다.
router.post('/exist', async (req, res) => {
try {
const response = await Word.find({ word: req.body.word });
if ( !response.length )
res.send({
exist: false
})
else
res.send({
exist: true
})
} catch (error) {
console.error(error);
}
});
Word 스키마를 schemas/words.js에 정의했다. request로 받아온 단어를 데이터베이스에서 찾는다. 없다면 [ ]를 반환하기 때문에 길이가 0이라면 exist: false, 아니라면 exist: true를 응답으로 보낸다.
router.get('/correct', async (req, res) => {
let random = Math.floor(Math.random() * await Word.count());
const wordCorrect = await Word.findOne({}).skip(random);
console.log(wordCorrect.word);
res.send({
wordCorrect: wordCorrect.word
});
});
random 변수에 특정 랜덤한 수를 뽑는다. 이때 Word.count()를 통해 총 다큐먼트 개수를 받아와서 이 범위 안에서 수를 추출하도록 한다. 이후 random번째 단어를 정답단어로 하고, 응답으로 보낸다.
그래도 단어 데이터가 있어서 다행이다. dictionary API 개발자분께 감사인사를 드리고 싶다. 그리고 API에 직접 요청해서 검증할 때보다는 속도가 빨라졌지만, 아직까지 아주 약간의 딜레이가 있다. 지금은 포트가 달라서 그런 것 같기도 한데 나중에 하나의 포트로 합치고 나서도 느려진다면 다른 방안을 찾아봐야겠다.