Spring Boot와 MongoDB 연동

Back-End/Spring 2019. 7. 8. 09:28

Spring와 MongoDB 연동



NoSQL


Not Only SQL : SQL만을 사용하지 않는 데이터베이스 관리 시스템


기존의 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터저장소


RDBMS처럼 고정된 스키마가 존재하지 않으며 join을 사용할 수 없음


비정형 데이터를 저장하기 위해 최적화된 저장 방법을 제공함



현실 세계의 모든 데이터가 일정한 틀과 형태를 가지고 있지는 않다.


대화, 채팅, 음악 등


테이블을 만드는 것은 공통적인 속성들을 선택하는 작업


종류 - MongoDB, Cassandra, Redis 등



MongoDB


1) 개요


NoSQL로 분류되는 Cross Flatform Document 지향 데이터베이스 시스템


전통적인 테이블 - 관계 기반의 RDBMS처럼 스키마가 고정된 구조가 아닌 JSON 형태의 동적 스키마형 문서를 사용함



* 몽고DB 사용 예 - 이베이, 뉴욕 타임즈 등



Collection 안에 Document 데이터 저장


Document는 일정한 틀을 가지지 않음


Document 내부의 Field 자료형 형식이 달라도 입력이 가능하며 각 Document들은 모두 일관된 Field를 가지지 않아도 된다.



Table => Collection


Record => Document (문서)



2) 설치


   

  http://mongodb.com


C++로 작성된 오픈소스 문서지향 (Document Oriented) Cross-platform 데이터베이스


Products > MongoDB Server > MongoDB Community Server 다운로드




1. https://www.mongodb.com/download-center/community 접속


2. Windows 64-bit x64 버전 설치




 3. 다운받은 실행파일을 실행해서 Complete로 설치 (기본적인 옵션으로 설치)




4. Install MongoDB Compass에 체크를 해제 하고 Next버튼 클릭





3) 실행


mongod.exe 서버 실행 파일


mongo.exe 쉘 프로그램



1. c:\data\db 디렉토리 생성 (몽고db에서 기본적으로 참조하는 디렉토리)


(변경하려면 mongod --dbpath "c:\mongodb\data\db")




2. cmd 창을 켜서 cd C:\Program File\MongoDB\Server\4.0\bin (mongodb가 설치된 디렉토리) 를 검색하고, mongod를 쳐서 서버를 실행




이 창이 켜져있어야만 서버가 켜져있는 것이기 때문에 MongoDB를 사용할 수 있다.



3. cmd창을 하나 더 열고, 아까와 같은 MongoDB의 경로를 입력하고,  mongo를 치면 mongo.exe 쉘 프로그램이 실행된다.





-sql과의 비교 (mongoDB는 기본적으로 SQL문법을 사용하지 않는다)-


Mongo DB에서는 Primary Key (기본키)를 _id라고 써야한다.


      


      Insert


SQL    : insert into users ("name",city) values ("terry","seoul")


Mongo DB : db.users.insert({id : "terry", city : "seoul"}) // { }중괄호 안에는 제이슨 문법




Select


SQL    : select * from users where id = "terry"


Mongo DB : db.users.find({_id : "terry"})




Update


SQL    : update users set city = "busan" where _id = "terry"


Mongo DB : db.users.update ({_id : "terry"}), {$set : {city : "Busan"}}) //id가 terry인것을 찾아서 city를 Busan으로 바꾸라는 쿼리




Delete


SQL    : delete from users where _id = "terry"


Mongo DB : db.users.remove({_id : "terry"})






방금 실행한 mongo cmd창을 키고 다음의 명령을 실행


     

     -DB 목록-


show dbs (현재 사용중인 데이터베이스 목록을 보여줌)



-db 생성-


use testdb (testdb 데이터베이스를 만들고 testdb데이터베이스를 사용한다)



-현재 사용중인 db 이름-


db



-전체 데이터베이스 목록-


show dbs (현재 testdb 데이터베이스를 사용하고 있으므로, 그 안에 있는 데이터베이스들을 보여준다)





MongoDB에서는 create 명령어를 사용하지 않는다.


무언가를 처음으로 저장할 때 생성된다.


먼저 스키마 (테이블안에 있는 속성같은 것들) 을 정의할 필요없이 바로 자료를 넣어주면 거기에 맞는 속성이 자동으로 생성된다.


(예를들면 자료를 넣을때 테이블을 한번에 만들 수 있다)



* memo Collection (테이블)에 자료를 입력


// _id : 기본키, 지정하지 않으면 Document 객체의 번지값으로 저장됨


db.memo.save (    {_id : 1, writer : "김철수", memo : "첫번째 메모", post_date : new Date( )    }    )


db.memo.save (    {_id : 2, writer : "홍철수", memo : "두번째 메모", post_date : new Date( )    }    )


db.memo.save (    {writer : "박철수", memo : "세번째 메모", post_date : new Date( )    }    )    

//id값을 넣지 않았기 때문에 Document객체의 번지값으로 자동저장 된다.


db.memo.find( ) //자료를 넣은 테이블을 확인할 때 사용




값을 넣을때 나오는 nUpserted는 insert와 update를 합친말로 넣고, 최신화한다는 의미이고, 


세번째 값은 id를 따로 넣어주지 않았기 때문에 id 키 값이 Document 객체의 번지값으로 자동으로 저장이 된다.


MongoDB는 비정형의 자료를 저장하기 적합한 구조이다.



- MongoDB 문법 -


 

      db.memo.count( ) //db안에 들어가 있는 객체들의 갯수를 확인 ( 객체와 그 객체에 대한 속성값을 3번 삽입했으므로 3이 출력된다)



삭제할때는 memo.remove({_id : 2})



// member Collection에 자료 입력

db.member.save(    {_id : "kim", passwd : "1234", name : "김철수"    }    )



// 컬렉션 생성 (테이블에 해당됨)

테이블을 미리 만들고 작업할 수도 있지만 궂이 먼저 만들지 않고 아래 코드처럼 데이터를 입력하면서 만들 수도 있다.

db.createCollection("customers")



// 데이터를 입력하면서 동시에 collection 생성

db.customers.insert(    { name : "김철수", age : 22   }    )



//컬렉션 목록

show collections

db.<collection 이름>.insert(<생성할 데이터>)



//데이터 생성

db.customers.insert(    {name : "이철호", age : 25}    )

db.customers.insert(    {name : "lee", age : 35    }    )

db.customers.insert(    {name : "hong", age : 45    }    )

db.customers.insert(    {name : "park", age : 55    }    )



//데이터 읽기

db.<collection 이름>.find(<검색 조건>)

db.customers.find(    {name : "김철수"}    )



//데이터 수정

db.<collection 이름>.update(<업데이트할 데이터선택>,<데이터를 입력>)


 

//수정 확인

db.customers.find( )



//데이터 삭제

db.<collection 이름>.remove(<삭제할 데이터 선택>)

db.customers.remove(    {name : "kim"    }    )

db.customers.find( )



//데이터 조회

db.customers.find( )

db.<Collection 이름>.find({ }, {"<표시할 field>" : 1, "<표시하지 않을 field>" : 0})

db.customers.find({ }, {"_id" : 0, "name" : 1})



//db.<collection 이름>.find().limit(<보여주고 싶은 데이터 개수>)

db.customers.find().limit(1)



//db.<collection 이름>.find().skip(<건너뛰고 싶은 데이터 행수>)

db.customers.find().skip(2)



//db.<collection 이름>.find().sort("<정렬에 사용할 기준 field>" : <1 혹은 -1>), 1과 -1은 

오름차순과 내림차순을 구분할때 사용한다.

db.customers.find().sort({"age" : 1})     //오름차순 정렬

db.customers.find().sort({"age" : -1})    //내림차순 정렬



//함수 여러개 호출 가능

db.customers.find().skip(1).limit(2) //하나를 건너뛰고 2개만 찾으라는 의미



//정확히 일치하는 자료를 검색

db.<collection 이름>.find({"<검색할 field>" : <찾을 값>})

db.customers.find({"age" : 25})



//Less Than Equals 검색

db.<collection 이름>.find({"<검색할 field>" : {"$lte" : <기준 값>}})

db.customers.find({"age" : {$lte : 20}}) //20보다 작거나 같은 나이를 검색



//Greater Than 검색

db.<collection 이름>.find({"<검색할 field>" : {"$gt" : <기준 값>}})

db.customers.find({"age" : {$gt : 25}}) //25보다 큰 나이를 검색



//Greater Than Equals 검색

db.<collection 이름>.find({"<검색할 field>" : {"$gte" : <기준 값>}})

db.customers.find({"age" : {$gte : 25}})



//Not Equals 검색

db.<collection 이름>.find({"<검색할 field>" : {"$ne" : <기준 값>}})

db.customers.find({"age" : {$ne : 25}})



//And 조건

db.<collection 이름>.find({$and : ["<검색할 field>" : {"<검색할 field>"} , {"<검색할 field>" : <기준 값>}]})

db.customers.find($and : [{"age" : {$gte : 23}}, {"name" : "park"}])     //나이가 23보다 크거나 같으면서 이름이 park라는 사람을 찾는 구문



//Or 조건

db.<collection 이름>.find({$or : ["<검색할 field>" : {"<검색할 field>"}, {"<검색할 field>" : "<기준 값>"}]})

db.customers.find({$or : [{"age" : {$gte : 23}}, {"name" : "park"}]})    //나이가 23보다 크거나 같고 or 이름이 park인 사람 찾는 구문






MongoDB 인증 설정


1) 관리자 계정 만들기


use admin


 

     db.createUser(

{

user : "admin",

pwd : "1234",

roles : [    {role : "userAdminAnyDatabase", db : "admin"}    ]

})


//아이디는 admin으로 하고, 비밀번호는 1234로 하고 사용권한을 설정해서 admin(관리자) 로 한다는 구문이다.

//userAdminAnyDatabase는 admin이라는 계정에 데이터베이스에 모든권한을 위임한다는 의미이다.



admin 데이터베이스가 생성되고 admin 관리자 계정이 생성된다.


사용권한 참조

https://docs.mongodb.com/manual/core/authorization/


Ctrl + C를 눌러서 mongod.exe 와 mongo.exe 프로그램을 종료시킴


mongoDB 서버 인증모드로 재시작 (아이디와 패스워드를 치고 들어가기 위해 하는것)


재시작 후에 mongod --auth로 서버를 킨다.


다른 cmd창을 켜서 방금 만든 관리자 계정으로 접속한다. 


 

     -관리자 계정으로 로그인 해보기-


1. mongo --port 27017 -u "admin" -p "1234" --authenticationDatabase "admin"        

// (포트번호, 아이디, 비밀번호, 데이터베이스 이름) mongo에 접속하면서 아이디와 비밀번호를 같이 보내서 접속


2. mongo로 접속한 후에 

use admin

db.auth("admin","1234")


=> 1이 출력되면 인증이 성공





2) 일반사용자 계정 만들기


 

  use web

db.createUser(

{

user:"web",

pwd:"1234",

roles:[    {role:"readWrite", db:"web"}, {role:"read", db:"reporting"}    ]

})


//web라는 아이디와 1234 비밀번호를 가진 계정을 만든다.

//이 계정은 web 데이터베이스에 관해서는 읽고 쓰기가 가능하고, reporting 데이터베이스에 관해서는 읽기만 가능하다.




데이터베이스마다 다른 권한을 부여할 수 있음


web 데이터베이스는 읽기 + 쓰기 가능


reporting 데이터베이스는 읽기만 가능


일반 사용자 계정으로 전송


 

    -일반 사용자 계정으로 로그인 해보기-


다른 cmd창을 켜서 방금 만든 일반 사용자 계정으로 접속한다. 두가지 방법이 있다.


1. mongo --port 27017 -u "web" -p "1234" --authenticationDatabase "web"        

// (포트번호, 아이디, 비밀번호, 데이터베이스 이름) mongo에 접속하면서 아이디와 비밀번호를 같이 보내서 접속


2. mongo로 접속한 후에 

use web

db.auth("web","1234")


=> 1이 출력되면 인증이 성공



: