나의개발일지
[mongoDB] 기초적인 mongoDB를 시작해보자!!! 본문
본 글은 작성자가 어디선가 주워듣고 이해한 내용들을 개인적인 언어로 작성한 게시물입니다.
잘못된 내용이 존재할 수 있으니, 읽게 되신다면 이점을 감안해 주세요!!!
- 우리는 결국 자신이 가진 이야기로 상대방을 이해할 수 있을 뿐이다.-
현재 수강하는 강의가 Node와 프레임워크로는 Express 그리고 데이터베이스로는 MongoDB를 이용한 웹애플리케이션 프로젝트이다. 그러다 보니 지금까지 사용하던 Mysql이 아닌 또 다른 mongoDB를 이용한 작업을 하게 되면서 mongoDB에 대한 기초적인 지식이 필요했다. 데이터베이스에는 SQL과 No-SQL이라는 두 가지 종류의 데이터베이스가 존재하는데, 지금까지 사용해 오던 Mysql의 경우는 SQL데이터베이스에 해당하는 반면, MongoDB의 경우는 No-SQL데이터베이스에 해당한다. 간단하게 두 종류의 데이터베이스의 차이점에 대해서 알아보자면, SQL은 관계형 데이터 베이스로 데이터는 정해진 스키마에 따라서 테이블에 저장되게 된다. 데이터는 관계를 통해서 여러 테이블에 저장되게 된다. No-SQL은 관계형 데이터베이스와 반대로 관계가 없고, 스키마도 없는 데이터베이스이다. 대량의 분산된 데이터를 조회하고 저장하는데 특화된 데이터베이스이다. SQL의 경우 정해진 스키마에 따라서 데이터에 대한 작업을 해야 가능하나, NOSQL은 따로 정의된 스키마가 없기 때문에 SQL보다는 데이터에 대한 작업이 자유롭다. 두 개의 데이터베이스는 위와 같은 차이점이 있다. 그런데 막상 프로젝트를 진행하다 보니, No-SQL이라고 반드시 스키마가 존재하지 않는 것은 아니었다. MongoDB도 일정한 스키마를 정해주면, 해당 데이터에 대한 규제(?) 제한(?)이 가능했다. 테이블이 아닐 뿐, SQL데이터베이스와 비슷하게 작업이 가능하다는 것을 알게 되었다. mongoDB를 node에서 좀 더 편리하게 사용할 수 있게 도와주는 mongoose라는 모듈이 있는데, mongoose를 이용해서 스키마를 정의하거나 모델을 만들 수도 있고, MongoDB와 연결을 해서 데이터에 대한 작업을 편리하게 할 수 있었다. 그리고 mongDB와 Express가 함께 사용되는 형태는 일반적인 구성이라고 한다. 그 이유가 MongDB가 javascript와 관련이 있기 때문이라고 한다.
기초적인 MongoDB
먼저 mongoDB에서 데이터베이스를 만드는 방법은 use라는 키워드를 이용해서 데이터베이스를 만들 수 있다. 해당 데이터베이스는 데이터가 저장되기 전까지는 확정된 데이터베이스가 아니게 됨으로 이점 주의를 해서 작업을 해야 한다. mongoDB의 경우 JSON형태로 데이터를 저장하는 것이 아닌 바이너리 BSON형태로 데이터를 저장하게 된다. 이는 이진 JSON으로 효율적으로 데이터를 저장할 수 있다는 특성이 있다. mongoDB의 경우 테이블이 아닌 컬렉션이라는 형태로 데이터를 저장한다. 컬렉션을 확인 하기 위해서는 show collections명령어를 통해서 해당 데이터가 담긴 컬렉션을 모두 볼 수 있다. 컬렉션은 집합이라고 할 수 있다.
데이터 삽입하기
데이터를 삽입하는 방법으로는 insertOne(), insertMany(), insert()가 있다. 여기서 가장 많이 사용되는 것이 insert()로 다른 두 개의 경우는 명령어 그대로 하나 또는 다수의 데이터를 삽입할 때 사용가능하다. insert()는 앞서 본 두 개의 명령어 기능을 모두 할 수 있기 때문에 insert() 하나를 사용해도 될 것이다.
// insertOne()
db.컬렉션.insertOne({name:"kim", age:6, is_student:false })
// insertMany()
db.컬렉션.insertMany([
{name:"kim", age:6, is_student:false },
{name:"lee", age:7, is_student:true },
{name:"park", age:19, is_student:false },
{name:"test", age:10}
])
// insert()
db.컬렉션.insert({name:"kim", age:6, is_student:false })
다량의 데이터를 삽일 할 경우는 어떤 경우든 [ {데이터1}, {데이터 2} ] 배열을 이용해서 데이터를 넣어야 한다. 이점 주의하도록 하자!!!! 또한 위의 name이 test인 경우 is_student라는 데이터가 없다. No-SQL의 경우는 특정한 스키마에 대한 제한이 없기 때문에 가능하다. 만약 다른 그 이외의 데이터를 추가해도 상관이 없다.
데이터 찾기
원하는 데이터를 찾는 방법으로는 find()가 있다. 해당 명령어의 ()에 {쿼리}를 넣어서 원하는 데이터를 찾을 수 있다.
// find()
db.컬렉션.find({name:"kim"})
데이터 업데이트
업데이트 명령어로는 updateOne()과 updateMany()가 있다. 데이터를 업데이트 하는 방법은 두 개의 인수를 받아야 한다. 먼저 업데이트하고자 하는 데이터를 적고, 다음은 업데이트할 내용을 적어주면 된다. 업데이트의 경우 {$set:{ 업데이트 내용}}이라는 특정한 키워드가 사용되기 때문에 이를 주의해서 사용해야 한다. 또한 업데이트하고자 하는 원소가 없다면 해당 내용을 추가하게 된다.
// updateOne()
db.컬렉션.updateOne({name:kim}, {$set:{name:kim!!!, email:"kim@gamil.com"}})
위의 경우 kim이라는 본래의 데이터에는 email이 없는데 위와 같이 업데이트 요소에 넣어주면 자동으로 추가된다.
데이터 삭제하기
데이터 삭제하는 명령어로는 deleteOne()과 deleteMany()가 있다. 명령어 그대로 한 개 또는 다량의 데이터를 삭제할 때 각 각 사용할 수 있는 명령어이다.
//deleteOne()
db.컬렉션.deleteOne({name:"kim"})
//deleteMany()
db.컬렉션.deleteMany({age: 10})
//전체데이터 삭제
db.컬렉션.deleteMany({})
deleteMany({})명령어를 사용시 만약 해당 쿼리 안에 아무것도 넣지 않는다면 모든 데이터가 삭제되기 때문에 주의해야 한다.
기초연산자
mongoDB에는 다양한 연산자가 존재하며 필요한 경우 구글에서 검색해서 찾아서 사용하면 된다. 대표적인 gt, in, or연산자에 대해서 어떻게 사용할 수 있는지 간단히 알아보자.
gt는 great than으로 초과의 의미이다. 이상의 경우는 gte로 알고 있다. 확실하지 않으니 구글링을 해보자!!!
// 10보다 큰 age에 해당하는 데이터를 찾는다.
db.컬렉션.find({age:{$gt:10}})
in은 해당 배열안에 있는 값을 찾는다.
//name이 kim, lee, park에 해당하는 데이터를 찾는다.
db.컬렉션.find({name:{$in:["kim", "lee", "park"]}})
or은 또는의 의미로 여러 개의 쿼리가 있을 시 해당 쿼리 중 하나라도 조건에 충족하는 데이터를 찾는 연산자이다.
//age가 10이거나 name이 kim인 데이터를 찾는다. 두개다 만족해도 되고, 둘 중 하나만 만족해도 된다.
db.컬렉션.find({$or:[{age:10}, {name:"kim"}]})
그 외
No-SQL의 경우 자유롭게 데이터에 대한 구조를 가질 수 있다. 아래와 같은 데이터의 구조를 가지는 경우도 있을 수 있다.
db.person.insert({name:"kim", age:10, personality: {friendly:true, kindly:false} })
위와 같이 중첩되게 해당 데이터를 저장할 수 있는데, 이럴 경우 friendly나 kindly에 접근하기 위해서는 다음과 같이 쿼리를 입력해야 한다.
db.컬렉션.find({'personality.friendly':true})
정리하자면
지금까지 사용한 SQL과는 달리 No-SQL은 정해진 규칙이 상대적으로 자유롭다고 생각한다. 자유롭다는 것은 그만큼 제한이 없다는 말이고 그만큼 개발자가 고려해야 될 상황이 많다는 것을 의미하기도 한다. 어느 정도의 제한은 프로젝트를 올바른 방향으로 흐르게 하기 때문에 필요한데, No-SQL의 경우는 그러한 제한이 많이 없다 보니까 생각해야 될게 많은 것이다. 하지만, 또 다르게 생각하면, 좀 더 입맛에 맞게 데이터에 대한 작업을 할 수 있다는 측면도 있을 것이다. 아직은 정말 기본적인 MongoDB에 대한 기능을 알아보았을 뿐이기에 이렇다 저렇다 말할 수 있는 레벨도 되지 않기 때문에, 사용하면서 알아가야겠다. mongoDB를 프로젝트에서 사용할 수 있는 mongoose라는 모듈이 있는데, mongoose모듈을 활용하면 좀 더 쉽게 mongoDB를 이용할 수 있고, 앞서 말한 데이터에 대한 제한도 걸 수 있는 거 같다. 다음은 mongoose에 대한 포스팅을 해보자
해당 글은 글쓴이의 사견과 잘못된 내용이 담긴 글일 수 있기에 참고해 주세요.
공부하면서 작성한 내용이기에 부족한 점이 많을 수 있습니다.
참고 후 더 알고 싶으시다면 구글링을 통해 알아보시는 방법도 좋은 방법입니다.
mongoDB와 mongoose 너무 재미있다....
'NodeJS.Express.MongoDB' 카테고리의 다른 글
| [Express] 알아보자!! Error-handler 사용하자!! Error-handler 포기하자..... (1) | 2023.01.20 |
|---|---|
| [Express] express는 Middleware가 엄청나게 많다. 와 middleware야 너는 정말 좋겠구나 (1) | 2023.01.20 |
| [nodeJS+Express+mongoose] 연결하자 연결하자!!!! (0) | 2023.01.20 |
| [mongoose] mongoDB를 node에서 사용해보자!!! (0) | 2023.01.17 |
| [nodeJS+Express] 처음부터 시작하는 NodeJS + Express (0) | 2023.01.16 |