Node.js에서 효율적이게 사용할 수 있는 Nosql DB 중에서 가장 많이 사용하고있는 MongoDB를 사용할 준비와 이것을 Node.js에 연동시키는 방법을 한번 알아보겠습니다.
MongoDB 시작하기
일단 무료 온라인 Mongo DB를 생성하기 위해 https://www.mongodb.com/cloud/atlas 에 접속합니다.
접속해서 가입을 하거나 구글 연동을 한 다음 Create New Cluster 페이지에서 Cluster를 create 해줍니다.

그런다음 IP whitelist를 설정하기위해 해당 목록으로 들어갑니다. 지정된 IP만 DB에서 접근할 수 있도록 할 수 있지만
연습하는 입장에서 Add IP ADDRESS를 누른 다음 Allow Access From Anywhere 버튼 눌러 IP주소가 0.0.0.0/0이 되도록합니다.

이제 Clusters 목록에 들어가 Connect를 누릅니다. 그리고 _Conect Your Application_을 눌러
1. 어떤 버전을 사용할지 선택하고 (우리는 node.js)
-
Connection String에서 Connection String Only부분을 Copy해 줄것입니다.
단, password(<>까지 지워줌) , test_username은 자신의 username와 password로 바꾸어서 사용합니다.
MongoDB를 Node.js에서 사용하는 방법
○ 환경 변수 설정하기
웹 개발에서 특정한 값을 프로그램 코드에서 숨기기위해 중요한 정보를 환경변수에 저장하여 소스에서 제거할 수 있는데요. 이 작업을 하는 방법입니다.
-
시스텝 속성메뉴 > 고급 탭 > 환경변수 버튼 클릭

아까 **Connection String**에서 얻어왔던 부분을 위에 캡처사진과 같이 바꾸어 줍니다.
단, 만약 terminal 프로그램이 실행중이라면 수정후 재 실행 해주어야 합니다.
○ 프로젝트에 MongoDB를 연결
작업하실 프로젝트에 mongoose DB를 연결하시기 위해선 Mongoose를 사용해야합니다. 이것은 MongoDB와 node.js의 오브젝트를 연결해주는 ORM library입니다.
1. Package 설치
npm install --save mongoose
2. DB setting
var mongoose = require('mongoose');
mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);
mongoose.connect(process.env.MONGO_DB);
var db = mongoose.connection;
db.once('open', function(){
console.log('DB connected');
});
db.on('error', function(err){
console.log('DB ERROR : ', err);
});
requrie() : mongoose 모듈 가져오기.
mongoose.set() : 글로벌 설정을 해주는 부분으로 그냥 항상 저렇게 설정하고 쓰면 된다고 한다.
mongoose.connect() :DB를 연결하는 부분이다. 우리는 환경변수 MONGO_DB에 저장 했으니 위와 같이 저장하면 됨.
db.once() & db.on() : 앱 실행시 단 한번만 사용되는 이벤트이다. DB가 연결됬을 때와 아닐때 error를 출력한다.
○ DB 스키마 생성
var contactSchema = mongoose.Schema({
name:{type:String, required:true, unique:true},
email:{type:String},
phone:{type:String}
});
var Contact = mongoose.model('contact', contactSchema);
이제 DB의 스키마를 생성해 볼 것입니다.
간단하게 예시로 이름, 이메일, 전화번호 항목을 생성할 것이구요.
특히, 이름은 requried와 unique를 사용해서 null값 허용 안함 과 중복 허용 안함을 설정할 것입니다.
mongoose.model() : contact라는 데이터 콜렉션에 현재코드를 연결해주는 역할.
여기서 변수 contact object는 model이며 DB에 접근하여 data를 변경할 수 있는 함수들을 가지고 있습니다.
단, contact라는 콜렉션은 미리 생성해 주지 않아도 자동으로 생성해줍니다.
Mongoose 스키마 타입은 총 8가지 입니다. 자세히 보기
String
Number
Date
Buffer
Boolean
Mixed
ObjectId
Array
Decimal128
Map
또한 다양한 속성들을 살펴보실 수 있습니다.
required:꼭 입력해야 한다.
unique:다른 행과 중복되면 안 된다.
trim:공백을 제거합니다.(문자열 타입에 사용)
default:문서가 생성되면 기본값으로 저장됩니다.
lowercase:대문자를 소문자로 저장한다(문자열 타입)
match:정규식으로 저장하려는 값과 비교한다.
validate:함수로 개발자가 조건을 만듭니다.
set:값을 입력할 때 함수로 조건을 만듭니다.
get:값을 출력할 때 함수로 조건을 만듭니다.
ref:해당하는 모델을 참조할 때 사용한다
출처 : https://m.blog.naver.com/rwans0397/220696586520
○ CRUD
만약 DRUD에 대해서 자세히 모르신다면 링크를 통해 좀 더 알아보고 가시길 바랍니다.
참고 블로그는 7 Standard Actions이라 했지만 저는 Standard Controller Actions이라 하겠습니다.
다음 내용은 링크에서 정리한 Standard Controller Actions에 따라 정리한 것입니다.
데이터 생성
1. New(get)
app.get('/contacts/new',function(req,res){
res.render('contacts/new');
});
2. Create(Post)
app.post('/contacts',function(req,res){
//create: data생성함
Contact.create(req.body,function(err,contact){
if(err) return res.json(err);
res.redirect('/contacts');
})
});
'contacts/new'에서 폼을 전달 받습니다.
Contact(모델).create를 이용해 DB에 데이터를 생성합니다. req.body를 통해 data를 받습니다.
데이터 조회
1. Index(get)
app.get('/contacts', function(req, res){
Contact.find({}, function(err, contacts){
if(err) return res.json(err);
res.render('contacts/index', {contacts:contacts});
});
});
Contact(모델).find({검색조건, 콜백 함수})는 만약 검색 조건이 없으면 모델의 모든 data를 검색합니다.
여기서 contacts는 항상 한개 이상일 수 있기 때문에 arrary입니다.
2. Show(get)
해당 데이터 보여주기
app.get('/contacts/:id', function(req, res){
Contact.findOne({_id:req.params.id}, function(err, contact){
if(err) return res.json(err);
res.render('contacts/show', {contact:contact});
});
});
Contact(모델).findOne은 해당 model에서 document하나를 찾는 함수입니다.
find는 다른 점은 결과를 모두 찾아 array로 전달하는 반면 이 함수는 조건에 맞는 경과를 하나 찾아 object로 전달 합니다.(만약 없다면 null입니다.)
데이터 변경
Standard Controller Actions 중 update와 destroy는 HTTP Methods 중 put과 delete를 사용하는데 브라우저 form은 get과 post만을 허용하고 나머지는 허용하지 않습니다.
npm install --save method-override
위의 package를 설치하시면 query로 mothod 값을 받아서 request의 HTTP method를 바꿔주는 역할을 합니다.
1. Edit(get)
app.put('contact/:id',function(req,res){
Contact.findOneAndUpdate({_id:req.params.id},req.body, function(err,contact){
if(err) return res.json(err);
res.redirect('/contacts/'+ req.params.id);
})
});
Contact(모델).findOne을 사용하는 이유는 이제 아실겁니다.
2. Update(put)
app.put('/contacts/:id', function(req, res){
Contact.findOneAndUpdate({_id:req.params.id}, req.body, function(err, contact){
if(err) return res.json(err);
res.redirect('/contacts/'+req.params.id);
});
});
Contact(모델).findOneAndUpdate는 해당 model의 document를 db에서 찾아 수정하는 함수입니다.
여기서는 _id:req.params.id가 찾을 조건이고, req.body는 업데이트 정보를 입력하고, 마지막으로 vkfkalxjsms 입력 data를 찾은 후 콜백 함수를 호출합니다.
데이터 삭제
app.delete('/contacts/:id', function(req, res){
Contact.deleteOne({_id:req.params.id}, function(err){
if(err) return res.json(err);
res.redirect('/contacts');
});
});
Contact(모델).deleteOne은 해당 model의 document를 db에서 찾아 삭제하는 함수입니다.
해당글은 A MEAN Blog의 블로그를 참고하였습니다.
https://www.a-mean-blog.com/ko/blog
더 자세한 코드는 깃허브 업로드 시켜놓았습니다.
'WEB PROGRAMMING' 카테고리의 다른 글
[React] React 처음이라면... React란 ? React의 핵심 (0) | 2020.08.11 |
---|---|
[React]React-redux란 무엇인가? (0) | 2020.08.05 |
HTTP Methods & CRUD (0) | 2020.05.01 |
홈페이지 만들기 (0) | 2019.06.26 |