#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

     

    Regex Tester - Javascript, PCRE, PHP

    RegexPal requires a modern browser. Please update your browser to the latest version and try again.

    www.regexpal.com

     

     

    #5 정규표현식

    모든 정리 - https://ko.javascript.info/regexp-introduction

     

    패턴과 플래그

     

    ko.javascript.info

     

    /로 열어서 /로 닫는 구조를 가지고 있다.

    이 외에 크게 패턴과 플래그라는 요소로 나뉘어져 있는데,

    기본적인  "패턴"

     

     

    +추가

    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
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기