보안 전공생의 공부

게시판 만들기 / back end + mongoose 정리 본문

WEB/Node

게시판 만들기 / back end + mongoose 정리

수잉 2021. 10. 18. 13:52

1. 게시물 model 만들기

//models/Post.js
const mongoose = require('mongoose');
const postSchema = mongoose.Schema({
  title:{type:String, required:true},
  body:{type:String, required:true},
  createdAt:{type:Date, default:Date.now},
  updatedAt:{type:Date},
});

const Post = mongoose.model('post', postSchema);
module.exports = Post;

- Post의 schema 구성 -> title, body, createdAt, updatedAt

 

createdAt:{type:Date, default:Date.now}

default 항목에 함수명을 넣으면 해당 함수의 return이 기본값이 된다

· Date.now : 현재 시간 return

 

//routes/posts.js

const express  = require('express');
const router = express.Router();
const Post = require('../models/Post');

// Index 
router.get('/', function(req, res){
  Post.find({})                 
  .sort('-createdAt')          
  .exec(function(err, posts){  
  if(err) return res.json(err);
    res.render('posts/index', {posts:posts});
  });
});

// New
router.get('/new', function(req, res){
  res.render('posts/new');
});

// create
router.post('/', function(req, res){
  Post.create(req.body, function(err, post){
    if(err) return res.json(err);
    res.redirect('/posts');
  });
});

// show
router.get('/:id', function(req, res){
  Post.findOne({_id:req.params.id}, function(err, post){
    if(err) return res.json(err);
    res.render('posts/show', {post:post});
  });
});

// edit
router.get('/:id/edit', function(req, res){
  Post.findOne({_id:req.params.id}, function(err, post){
    if(err) return res.json(err);
    res.render('posts/edit', {post:post});
  });
});

// update
router.put('/:id', function(req, res){
  req.body.updatedAt = Date.now();
  Post.findOneAndUpdate({_id:req.params.id}, req.body, function(err, post){
    if(err) return res.json(err);
    res.redirect("/posts/"+req.params.id);
  });
});

// destroy
router.delete('/:id', function(req, res){
  Post.deleteOne({_id:req.params.id}, function(err){
    if(err) return res.json(err);
    res.redirect('/posts');
  });
});

module.exports = router;

// Index

router.get('/', function(req, res){

  Post.find({}) 

  .sort('-createdAt'

  .exec(function(err, posts){ 

    if(err) return res.json(err);

    res.render('posts/index', {posts:posts});

  });

});

· .sort() : string인 object를 받아서 정렬하는 함수

           정렬할 항목명을 문자열로 넣으면 -> 오름차순 정렬(ㄱㄴㄷㄹ)

           문자열 앞에 -을 붙여 넣으면 ->내림차순 정렬(ㄹㄷㄴㄱ)

           2가지 이상으로 정렬하는 경우

· .exec() : DB에서 찾은 data를 대상으로 명령 

            여기서는 posts/index에 post model을 활용할 데이터로 보낸다. 

// update

req.body.updatedAt = Date.now()

post를 수정하는 경우-수정된 날짜를 updatedAt에 기록

 

//index.js

//Routes

app.use('/', require('./routes/home'));

app.use('/posts', require('./routes/posts'))

index.js에 posts route를 추가한다.

 

- 출처 : https://www.a-mean-blog.com/ko/blog/Node-JS-%EC%B2%AB%EA%B1%B8%EC%9D%8C/%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0/%EA%B2%8C%EC%8B%9C%ED%8C%90-Back-End-%EA%B0%9C%EB%B0%9C

 

Node JS 첫걸음/게시판 만들기: 게시판 - Back End 개발 - A MEAN Blog

소스코드 이 게시물에는 코드작성이 포함되어 있습니다. 소스코드를 받으신 후 진행해 주세요. MEAN Stack/개발 환경 구축에서 설명된 프로그램들(git, npm, atom editor)이 있어야 아래의 명령어들을 실

www.a-mean-blog.com


[mongoose를 사용하다보니 이해가 가기 시작해서 정리하기]

· NoSQL : 단순 검색, 추가 작업에 최적화된 키 값 저장공간

 SQL계열의 쿼리 언어를 사용할 수 있음(->Not Only SQL이라 불리기도 함)

 대규모의 데이터를 유연하게 (RDBMS와 달리 데이터 구조가 정해져있지 않음)처리할 수 있으며,

 설계가 단순하고 수평 확장(관계형 데이터베이스의 문제점)에 용이함

 -> 대표 : mongoDB

 

· ORM(Object Relational Mapping) : 오브젝트와 관계형 데이터를 자동으로 매핑해주는 것

- 객체 지향 프로그램 - 클래스 사용 / 관계형 데이터베이스 - 테이블 사용

- 객체 모델과 관계형 모델 간의 불일치는 SQL을 자동 생성하여 해결해줌

- 객체를 통해 간접적으로 데이터베이스 데이터를 다룸

 

· mongoose모듈 : mongoDB(NoSQL database)를 지원하는 노드의 확장모듈

- schema를 만들고 -> model을 만듬 => data를 불러옴

  -> data를 객체화시켜 빠르게 수정함으로써 데이터에 접근할 수 있다

<사용법>

(1) mongoose 설치 : npm install mongoose --save

(2) mongoDB 연결 :

const mongoose=require('mongoose')로 mongoose객체에 mongoose모듈 로드할 수 있다.

mongoDB와 node.js 연결 관련해서는 따로 포스팅한 것이 있당-> https://jonnastudy.tistory.com/91

 

MongoDB를 node.js에 연결하기 | mongoDB 연결 오류 문제 해결

· 전역함수(global variable) vs 지역함수(local variable)  : 전역함수는 프로그램 전체에서 접근 가능,  지역함수는 일정한 범위 내에서만 접근 가능 · 환경변수(environment variable)  : 변수를 프로그램..

jonnastudy.tistory.com

// DB setting

mongoose.connect(process.env.MONGO_DB);

const db = mongoose.connection;

데이터베이스가 연결되면 connection 인스턴스가 생성된다.위의 방법은 1개의 데이터베이스에 연결할 떄만 유효된다.다른 데이터 베이스도 함꼐 사용하고자 mongoose.connect()재호출하면 

mongoose.connection 인스턴스는 새로운 데이터베이스에 연결된 것으로 변경된다.

여러 데이터베이스를 사용하고 하면 mongoose.connect() 대신 mongoose.createConnection()메소드를 사용하면 됨

const connection1 = mongoose.createConnection(...);

const connection2 = mongoose.createConnection(...);

 

(3) 모델 정의하기

mongoose의 모델 : mongoDB에서의 데이터를 저장하는 기본 단위인 도큐먼트의 형태

- mongoose에서 제공하는 Schema 인터페이스를 통해 생성 가능

const postSchema = mongoose.Schema({

  title:{type:String, required:true},

  body:{type:String, required:true},

  createdAt:{type:Date, default:Date.now},

  updatedAt:{type:Date},

});

 

위처럼 정의한 schema를 model에 정의하려면

mongoose.model('post', postSchema)를 이용해야하며, 이를 통해 model에 접근 가능하다.

 

const Post = mongoose.model('post', postSchema);

앞서 생성한 postSchema를 이용해 post라는 model을 생선하는 코드이다.

 

(4) 모델 사용하기

const Contact= require('../models/Contact')

생성한 model의 인스턴스를 다시 한 번 생성하여 model을 사용할 수 있다.

생성한 인스턴스를 이용해 우리가 원하는 실제 데이터베이스 작업(삭제, 생성, 검색 등)을 수행할 수 있다.

 

 

 

 

참조 : https://gmlwjd9405.github.io/2019/02/01/orm.html

 

[DB] ORM이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://m.blog.naver.com/passionisall/222133887293

 

[데이터베이스] RDBMS vs NoSQL 차이점

최근 MySQL이라는 RDBMS를 사용하여 데이터를 쌓는 연습을 했는데 NoSQL이란 것에 대해서도 ...

blog.naver.com

https://ko.m.wikipedia.org/wiki/NoSQL

 

NoSQL - 위키백과, 우리 모두의 백과사전

Document Store CouchDB, Cloudant, Couchbase, MongoDB, Jackrabbit, XML-Databases, ThruDB, CloudKit, Prsevere, Riak-Basho, Scalaris

ko.m.wikipedia.org

https://edu.goorm.io/learn/lecture/557/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-node-js/lesson/174385/mongoose-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0;

 

구름EDU - 모두를 위한 맞춤형 IT교육

구름EDU는 모두를 위한 맞춤형 IT교육 플랫폼입니다. 개인/학교/기업 및 기관 별 최적화된 IT교육 솔루션을 경험해보세요. 기초부터 실무 프로그래밍 교육, 전국 초중고/대학교 온라인 강의, 기업/

edu.goorm.io

 

Comments