이번에는 애플리케이션을 만드는 데 있어서 데이터베이스를 어떻게 처리할 것인지에 대해 알아보도록 하겠다.
애플리케이션, 웹 사이트를 만들 때 여러 정보들을 다루게 되는데, 이 정보들은 데이터베이스라는 별도의 공간에 저장된다. 사이트나 애플리케이션이 쉽게 접근할 수 있도록 자료를 효율적으로 구성하는 것이 중요하다.

그리고 이 데이터베이스에 자료를 어떻게 보관하고, 어떤 식으로 관리 하는지에 따라 크게 2가지, 관계형 데이터베이스와 관계형이 아닌 데이터베이스, 즉 NoSQL 데이터베이스로 나뉘게 된다.
- 관계형 데이터베이스
- 저장할 자료들을 행과 열로 구분해서 표 형태로 관리
- 표와 표를 서로 연결해서 사용할 수도 있음
- 자료 추가, 수정 등 작업을 할 때 SQL 언어를 사용하므로 SQL 데이터베이스라고도 함
- NoSQL 데이터베이스
(SQL을 사용하지 않는 데이터베이스라는 뜻으로, 공식 명칭은 아님.)
- 문서 형태(json형식)로 자료 저장, 추가, 수정, 삭제하는 여러 관리 가능
- 새로운 필드를 추가하기도 쉽고, 기존 필드를 수정할 수도 있음
- 별도 언어 공부 없어도 js를 알고 있다면 데이터베이스를 다루기 쉬워짐
- 자료를 여러 컴퓨터에 나누어 저장할 수 있음
우리가 이번에 해 볼 것은 NoSQL 데이터베이스 중 MongoDB라는 데이터베이스를 이용해서 연락처 정보를 저장, 수정, 삭제하는 방법이다.
몽고db를 사용하기 위해서는 회원가입이 필요하다.
몽고db가 준비 되었다면 우리가 작성하던 애플리케이션 코드에다 몽고db를 연결해 보도록 하자.
vs code에서 몽고 db를 사용하기 위해 확장을 하나 추가할 것이다. 이 확장을 사용하면 따로 몽고 db 사이트에 접속하지 않아도 vs code 상에서 데이터베이스에 어떤 내용이 저장 되었는지 또는 자료가 수정 되었는지를 확인할 수 있다.

위 확장을 설치해주자.
그 후 몽고 db 홈페이지로 database페이지로 간 우 connect를 누르면

이런 페이지가 나오는데 여기서 MongoDB for VS Code를 누르고 들어가서 나와있는 문자열, 다른 말로 커넥션 스트링을 복사하자.

vs code에서 설치된 확장을 클릭하고 add connection을 누르면 다음 페이지가 나온다. connect를 누르자.

그러면 위에 이런 공간이 나타나는데, 여기에 복사한 커넥션 스트링을 붙여넣자.
그리고 password 부분에 비밀번호가 들어가야 한다.
몽고db 회원가입을 하며 데이터베이스 관리를 위해 설정한 id, pw중 pw를 입력해주자.

이렇게 잘 생성된 것을 볼 수 있다. 여기서 admin과 local은 기본적인 데이터베이스이고, 우리는 여기에 새로운 데이터베이스를 만들어 추가할 것이다.
애플리케이션 코드에서 몽고db를 사용하는 방법에 대해 알아보자. 우선 애플리케이션 코드에게 몽고 db를 어떻게 연결하는지 알려줘야 한다. 이 때, 사용하는 것이 환경 변수이다.
환경 변수는 .env라는 파일에다가 저장을 하게 된다. 이 파일은 애플리케이션 코드에서 환경 변수 값을 저장하는 역할을 한다.
환경 변수란, 예를 들어 작성한 코드를 github에 올려서 다른 사람들이 볼 수 있게 오픈한다고 가정하자. 이 때 애플리케이션 코드 안에서 몽고 db에 접속하는 주소가 드러나면 안 될 것이다. 다른 사람에게 노출시키면 안되는 내용들은 .env 파일에 환경 변수로 저장해 놓게 된다. 그리고 github에 소스를 공개할 때는 .env 파일을 푸시하지 말라고 지정을 해주면 된다.
우리는 .env 파일에 몽고 db에 접속하는 주소, 커넥션 스트링 값을 넣을 것이다.

환경 변수를 사용할 때는 대부분 대문자를 사용한다. 코드 안의 다른 변수들과 쉽게 구별하기 위해서이다.

커넥션 스트링의 맨 뒤, / 뒤에 만들고 싶은 데이터베이스 이름을 추가해서 새로운 데이터베이스를 만들 수 있다.
이제 app.js, 애플리케이션 파일로 돌아와서 db 연결을 해보자. 그 전에, 2가지 모듈을 설치할 것이다. node.js에서 몽고 db를 사용하기 쉽게 만들어주는 mongoos라는 모듈과 .env 파일에 있는 데이터를 가져와서 사용할 수 있게 해주는 dotenv라는 모듈을 설치해 주겠다.
npm i mongoose dotenv
이러면 두 가지 패키지가 설치되었다. app.js 파일 안에다가 db를 연결하는 코드를 작성해도 되지만, node.js는 되도록 모듈화 시켜서 사용한다.
데이터베이스에 접속하는 코드도 별도의 파일로 만들어 보자.
config 폴더와 그 안에 dbConnect.js 파일을 만들자. 이 파일에서 db의 연결을 해 볼 것이다.
const mongoose = require("mongoose"); // 설치한 mongoose 모듈을 가져와 mongoose라는 변수로 사용
require("dotenv").config(); // 설치한 dotenv 모듈을 가져와 그 안의 config라는 함수를 실행
데이터베이스에 접속해서 그 안의 내용을 가지고 뭔가를 하기 위해서는 비동기 처리를 해 줘야 한다. async와 await를 사용할 것이다.
기본 형태
const dbConnect = async() => { try{ } catch(err){ } }
이렇게 묶은 {} 안에 await를 사용해서 비동기 처리를 할 수 있다. 또 try 와 catch를 이용해서 오류가 발생할 경우 어떻게 처리하라고 따로 지정을 해주게 된다.
- const connect = mongoose.connect(process.env.DB_CONNECT);
mongoose 모듈에서 connect 함수를 이용해서 db에 접속하게 된다. () 안에는 db 연결하는 주소가 들어간다. 원래라면 커넥션 스트링이 들어가겠지만 우리는 이를 .env 파일안에 DB_CONNECT 변수로 저장했으므로 이를 가져온 것이다. process.env 부분이 env 파일에 있는 내용을 가져오는 객체이다. .env 모듈에서 config 함수를 실행하지 않으면 이 값을 가져올 수 없다. 아무튼 이렇게 가져온 연결을 connect라고 부를 것이다.
어디에 비동기 처리를 해야할까? 바로 시간이 걸리는 부분, 데이터 베이스에 연결하는 mongoose.connect(process.env.DB_CONNECT) 이 부분이다. 그러므로 await를 여기에 붙여준다. 시간이 걸리더라도 일단 db에 접속 한 다음 뒤의 문장을 실행하라는 이야기이다.
이렇게 데이터베이스에 접속하는 코드를 전부 작성해보면
const mongoose = require("mongoose"); // 설치한 mongoose 모듈을 가져와 mongoose라는 변수로 사용
require("dotenv").config(); // 설치한 dotenv 모듈을 가져와 그 안의 config라는 함수를 실행
const dbConnect = async() => {
try{
const connect = await mongoose.connect(process.env.DB_CONNECT);
console.log("DB Connected");
} catch(err){
console.log(err);
}
}
module.exports = dbConnect;
이렇게 된다. 코드를 모듈로 사용하기 위해 module.exports = dbConnect;를 사용해서 밖으로 내보내자.
그 후 app.js 애플리케이션 코드에 config 폴더 안의 dbConnect.js를 모듈로 가져오는 코드를 추가하고 dbConnect();를 통해 데이터베이스에 접속하자.
const express = require("express");
const dbConnect = require("./config/dbConnect"); // 변경된 부분
const app = express();
dbConnect(); // 데이터베이스에 접속
app.get("/", (req,res)=>{
res.send("Hello Node");
});
app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use("/contacts", require("./routes/contactRoutes"));
app.listen(3000, () => {
console.log('서버 실행 중');
});

다음과 같이 서버가 실행되고 db에 잘 연결된 것을 확인할 수 있다.

스키마를 이용해서 어떠한 자료들이 들어간다(ex 이름, 나이, 주소)라고 지정을 해놓으면 그 스키마에 맞게끔 구성된 자료가 도큐먼트이고, 여러 개의 도큐먼트가 모아져 있는 것을 컬렉션이라고 부른다.
이제 애플리케이션을 통해서 연락처 정보를 몽고 db에다가 저장 해보자. 우리가 사용하려고 하는 연락처가 어떤 자료 형식을 가지고 있는지 먼저 지정, 즉 스키마를 만들어줘야 한다.
스키마 역시 별도의 파일로 만들어서 관리 할 것이다.
models라는 폴더를 만들자. 여기에는 스키마 정보에 대해 저장 할 것이다. 연락처와 관련된 스키마를 만들어 보자. models 폴더 안에 contactModel.js 파일을 만들고 이를 통해 연락처 정보가 어떻게 구성되어 있는지 지정해주자.
const mongoose = require("mongoose");
const contactSchema = new mongoose.Schema({
// contactSchema : 스키마의 이름, mongoose.Schema : 몽구스에서 사용하는 함수
name: { // 중괄호 안에는 요소의 자료 유형, 필수 자료인지 아닌지를 지정 가능
type: String,
required: true
},
email: {
type: String,
},
phone: {
type: String,
required: [true, "전화번호는 꼭 기입해 주세요"]
// 사용자가 필수 속성을 입력하지 않았을 때 표시할 에러 메세지
}
},
{
timestamps: true
// 자료가 작성, 수정되면 자동으로 그 시간을 기록해주는 속성. true로 하면 mongodb에서 알아서 해준다.
}
);
// mongoose.model(모델명, 스키마명)
// (스키마 -> 모델) 변환 함수
const Contact = mongoose.model("Contact", contactSchema);
module.exports = Contact;
이렇게 스키마를 만들었을 때 이 스키마를 모델로 만들어 줘야 db에 저장이 된다.
const Contact = mongoose.model("Contact", contactSchema); 이 부분은 스키마를 모델로 바꾸고 이렇게 변환하는 함수를 Contact 변수로 사용할 것이라는 말인데, 이 이유는 모듈로 내보내기 위해서이다.