#1 설계
1) 데이터 구조 설계. MongoDB를 사용한다. tf-idf 검색 기능을 사용할 수 있게끔 설계한다.
[document 구조]
{
"가나": {
"frequency": 7,
"idf_value": 0.5832,
"word_frequencies": {
"가나": 3,
"나라": 4
}
},
"스위스": {
"frequency": 7,
"idf_value": 0.5832,
"word_frequencies": {
"스위스": 4,
"나라": 3
}
},
"나라": {
"frequency": 7,
"idf_value": 0.5832,
"word_frequencies": {
...
}
}
}
2) URL 설계
라우터의 역할은 결국 작업중인 주제를 기반으로 URL을 그룹화해준다는 게 핵심이다.
[URL 디자인]
(홈에서 바로 갈 수 있는 글로벌 라우터)
/ : Home, 검색, 알파벳 순 모음 일부 나옴
/alphabet?letter= : 홈에서 알파벳에 해당하는 단어 모두를 긁어올 수는 없기 때문에 모두 긁어오는 페이지 만들기
/category?tag= : 특정 카테고리에 해당하는 단어들 모음
/search?dicQuery= : 검색 결과 목록 출력
/result/(검색어) : 해당 문서
/documents/edit : 관리자 문서 수정
/documents/delete : 관리자 문서 삭제
#/intro/lab : 연구소 소개
#/intro/researcher : 연구진 소개
#2 Router 만들기
결국 Router는 MiddleWare에서 URL을 카테고리 분류를 해주는 것과 같은 기능을 한다.
Router폴더 안에 특정 카테고리의 라우터 파일을 만들고 (예를들어 글로벌이라면 아래와 같다)
//server.js 파일에 있는 1차적인 거름망
app.use("/", globalRouter);
//global.js파일
const globalRouter = express.Router();
function handleHome(req, res){
res.send("Home");
};
globalRouter.get("/", handleHome);
원래
app = express();
app.get("/", handler, controller); 로 되어있는 구조를 그대로 사용한다고 볼 수 있다.
결국 큰 틀에서 보면 main이 되는 JS파일에서
app.use() 가 Router에 있는 router.get() 을 부르고, 이게 Controller에 있는 함수를 부르는 구조이다.
#3 JS에서 export의 개념
JS프로젝트는 모든 file이 private이다.
import를 위해서는 해당 파일의 export가 필요한데,
export default app;
위와 같이 'default'를 사용해서 어떤 변수를 내보낼 것인지 미리 선택해두면
import anything from "app.js"
위와 같이 import할 때 아무런 이름이나 써주어도 해당 변수가, 새로운 이름으로 import된다.
당연하게도 한 파일에서 여러가지 변수(함수)를 export 해주고 싶다면 위와 같이 사용하지 않는다.
대신 export하고 싶은 대상 앞에 export를 붙혀서 사용한다.
이렇게 export된 것들은 모두 아래와 같은 구조로 import해야 한다.
import {app, server} from "app.js"
#4 URL Parameter
' /:변수명 '
위와 같은 형태로 URL에 들어가는 URL parameter는 변수와 같은 개념이다.
controller에서 req.params로 불러올 수 있다.
반환형은 object로 변수와 값이 key-value 형태로 내부에 주어진다.
req.param.id
따라서 위와 같은 형태로 사용하면 된다
다만 이렇게 파라미터를 사용했을 경우 router에서 get을 사용하는 순서를 주의해야한다.
//이 순서로해야 upload를 먼저 검사하고 id변수에 값을 담지,
videoRouter.get("/upload", uploadVideo);
videoRouter.get("/:id", watchVideo);
//이 순서로 썼다가는 URL의 upload가 id에 들어가버린다.
videoRouter.get("/:id", watchVideo);
videoRouter.get("/upload", uploadVideo);
위와 같은 문제들을 해결하기 위해 정규식을 사용해서 이 문제를 다루기도 한다.
get 함수에서 주소를 인자로 받는 부분에 정규 표현식을 넣는 것.
videoRouter.get("/:id(\\d+)", watchVideo);
위와 같이 사용하면 숫자만 받아진다.
express 라우팅 공식 문서 : https://expressjs.com/ko/guide/routing.html
정규 표현식 테스트하는 사이트 : https://www.regexpal.com
#5 정규표현식
모든 정리 - https://ko.javascript.info/regexp-introduction
/로 열어서 /로 닫는 구조를 가지고 있다.
이 외에 크게 패턴과 플래그라는 요소로 나뉘어져 있는데,
+추가
greedy 알고리즘으로 동작하는 regex에 대하여( .*? 과 .*의 차이)
'프로젝트 기록 > 러시아어 사전 및 검색 웹' 카테고리의 다른 글
개발 과정 리뷰 -4- MongoDB 연동 (0) | 2023.12.09 |
---|---|
개발 과정 리뷰 -3- (0) | 2023.12.07 |
개발 과정 리뷰 -1- (0) | 2023.12.03 |
MongoDB 환경 통일 (0) | 2023.11.30 |
기술 스택 선택 (0) | 2023.11.10 |