Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

coding etude

201026 [MVC / ORM / sequelize] 본문

Javascript TIL

201026 [MVC / ORM / sequelize]

코코리니 2020. 10. 26. 23:27

MVC(Model-View-Controller)

: 소프트웨어 디자인 패턴으로 말 그대로 애플리케이션의 정보를 나타내는 model 과 user interface를 나타내는 view 그리고 상호작용을 하는 controller로 구성된 패턴을 말한다.

MVC 패턴의 구동원리

이런 MVC 패턴을 이용하기 위해서 ORM 이 필요하다.....

하.. 왜이렇게 용어들이 많이나오는지...  

ORM (Object Relational Mapping) 단어의 뜻대로 객채와의 관계를 맵핑(동일하게 만든다) 한다라는 뜻을 가지고 있다.

쉽게 말해서 객체지향인 JS 는 class 를 사용하지만 DB에서는  table 를 사용하기 때문에 서로 맞지 않는데 이것을 객체의 형태로 만들어서 사용 할 수 있게 만들어 주는것을 말한다.

이 ORM 시스템에는 장점과 단점이 있지만 다음에 조그 더 깊게 알아보도록 하자!!

 

그럼 다시 돌아아와서 ORM 을 쉽게 사용하기 위해서 mysql 및 기타 sql 을 위한 node.js 기반의 sequelize를 사용해 보겠다. (공식홈페이지 : sequelize.org/)

 

1.설치(install)

npm install --save sequelize // sequelize 설치

npm install --save-dev sequelize-cli // CLI 설치

※CLI 는 git에서 commit을 남겨 버전을 관리하는 것과 같이 sequelize에서 데이터 갱신 후 migration을 하여 버전을 추적 관리 할 수 있는 보조 기능이다.

 

2. config 파일 생성

 : config 파일은 mysql 과 같은 언어를 사용하기위해 기본 정보를 입력하는 파일이다. 다음과 같이 입력하면 기본 config 파일이 생성된다.

생성된 config 파일에서 개인정보와 이용할 데이터의 정보를 수정해 주자.

※지극히 개인정보가 들어간 파일이다 보니 .gitignor 파일에 config 파일을 추가해서 업로드 되지 않게 하자!!

// CLI init을 사용하여 기본 셋팅을 가져와서 설치 할 수 있다.
// bootstrapping
npx sequelize-cli init

config 파일을 보면 세가지 형식으로 나누어져 있는데 이것은 개발/ 테스트 / 배포의 경우에 각각 다른 데이터베이스를 사용하기 위함이다.

첫 셋팅은 development 로 되어 있으나 추후에 설정값을 변경하여 사용 할 수 있다.

 

3. 데이터 베이스 생성

// 데이터베이스 만들기 
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string

(생성된 예시 추가)

위의 방법으로 DB를 생성 할 수 있고 속성 값으로 각 clumn을 만들고 그 type을 정해 줄 수 있다.

※여기서 inference 가 발생 하는데 table 의 이름은 DB의 이름을 설정하면 자동으로 DB 의 복수형으로 생성이 된다.

위의 방법 대로 생성을 한다면 table의 이름은 users 가 된다. 

생성한 데이터의 기본값을 주기 위해 생성된 model/user.js 파일의 기본 데이터 정보를 수정해 주어야 한다.

//기본값
firstname: DataType.STRING

//변경값
firstname: {type: DataType.STRING, defaultValue:"jone"}

지금까지 데이터베이스와 테이블을 생성하는 초기 작업을 마무리 한것이다.

 

그럼 이제 routing 과 controller의 작성방법을 알아보자.

 

4. route 

분기작업은 express 를 참조하여 작업을 진행 할 수 있다. 기본적인 routing 작업과 동일하지만, 단순히 요청이 들어왔을 때 controller 의 요청이 메소드가 작동되게 하는 역할을 해줄 뿐 그 이상의 기능은 없다.

const express = require('express');
const route = express.Router();

router.get('/links', controllers.get) // get method 실행
router.post('/links', controllers.post) // post method 실행
router.get('./links/:id', controller.redirects) // redirect method 실행

module.export = router; // router.js 파일 모듈화

5. controller 

MVC 의 가장 핵심적인 controller 를 작성해 보자. 

controller 는 가장 처음에 설명했던 사진 처럼 가운데서 요청과 응답을 진행하는 역할을 수행하는 핵심 요소이다.

작성 방법은 데이터를 받아서 요청에 응답해 주는 서버의 형식과 비슷하다고 생각하면 되지만, sequelize 만의 방식을 따라서 작성해야 한다.

공식문서의 Query 부분의 메소드 사용법을 익혀두자(sequelize.org/master/manual/model-querying-basics.html)

controller의 특징은 비동기적으로 구동 되기 때문에 async/await 를 사용해야 한다는 점이다. 꼭 지억해 두자.

const { getUrlTitle, isValidUrl } = require('../../modules/utils')
const model = require('../../models').url // 모델에 정의 되어있는 table를 참조
// const { url:URLModel } = require('../../models') 가능

module.exports={
    get: async (req, res)=>{
       //다음과 치환 되는 메소드 // SELECT * FROM table 
        res.status(200).send(data); //app.js 에 body-parser 가 사용되어 JSON 변경이 불필요
    },

    post: async (req, res)=>{
        const url = req.body.url;
        if (){
        	//해당 url 이 존재하는지 확인하고 없다면 err
        }
        getUrlTitle(url, (err, title)=>{
             //다음과 치환되는 메소드 // INSERT INTO table(url, title) VALUES(value,.. ) 
            .then(result=>res.status(201).send(result))
        });
    },
       
    redirects: async (req, res)=>{
        let { id } = req.params; // 요청된 parameter의 값 / id 만..
        // 다음과 치환가능한 메소드// SELECT id FROM table WHERE id=req.id
            //update 메소드 사용하여 데이터 변경 // get 요청에 데이터 변경..
            .then(result => res.redirect(result.url));// redirect 메소드 사용
    } 
}

대략 이런식으로 작성 된다고 보면 된다.

controller의 핵심은 메소드, 구조분해, module, 비동기를 얼마나 잘 이해하고 있느냐이다. 서버의 문법을 익혀두는 것 또한 많은 도움이 될것 같다. 

 

※ Transactions / Associations 은 무조건 기억해야 한다.

 - Transaction : 작업의 단위를 말하는것으로 예를들어 게시판에 새글을 작성하면 서버에 새글을 post 하고 화면이 전화 되면서 새로운 DB를 get 하는 작업이 동시에 이루어 지는 것/ 이것이 Transaction 이라고 할 수 있다. 

이 작업은 설계자의 기준에 따라 달라질 수 있으며, Transaction 을 잘 다루는 것이 중요하다. 

 

 - Association : table 간의 관계를 설정해 주는 것을 말한다. 1:1/ 1:N/ N:N 의 관계를 설정해 줄수 있다.(공식문서를 참조하자..)

 

이상으로 MVC (sequelize) 에 대하여 간략하게 공부하는 시간을 가졌다.. 아직 해결되지 않은 것들이 많지만 익숙해 질때까지 해보는 방법 밖에는 없는것 같다.. 

'Javascript TIL' 카테고리의 다른 글

[sequelize] 서버구현 초기 셋팅 하기  (0) 2020.10.31
201030 [OAuth 2.0]  (0) 2020.10.31
201026 [SQL]  (0) 2020.10.26
201007 [commonJS & express]  (0) 2020.10.06
201006 [Server / node.js]  (0) 2020.10.06