Spring Boot와 MongoDB 연동
Back-End/Spring 2019. 7. 8. 09:28Spring와 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이 출력되면 인증이 성공 |
'Back-End > Spring' 카테고리의 다른 글
Spring 어노테이션 정리 (0) | 2019.07.08 |
---|---|
Spring Boot와 MongoDB 연동해서 회원관리 예제 (회원가입, 로그인, 로그아웃) (1) | 2019.07.08 |
Spring boot 프로젝트 (데이터베이스 연동, Template 적용) (0) | 2019.07.07 |
타임리프 (Thymeleaf) 란? (0) | 2019.07.07 |
Template System 이란? (0) | 2019.07.07 |