spring 26강 MongoDB 설치, Spring Boot와 MongoDB 연동 실습 - 회원관리 예제(회원가입, 로그인, 로그아웃)
Spring과 MongoDB 연동
NoSQL (Not Only SQL)
SQL만을 사용하지 않는 DBMS
기존의 RDBMS의 한계를 극복하기 위해 만들어진 새로운 현태의 데이터저장소
RDBMS처럼 고정된 스키마가 존재하지 않으며 join 불가
비정형 데이터를 저장하기 위해 최적화된 저장 방법을 제공함
모든 데이터가 일정한 틀과 형태를 가지고 있지는 않음 (대화, 채팅, 음악 등)
테이블을 만드는 것은 공통적인 속성들을 선택하는 작업
종류 : MongoDB(이번 실습에서 사용), Cassandra, Redis 등
MongoDB
(c++로 작성된 오픈소스 문서지향(Document Oriented) Cross-platform DB)
NoSQL로 분류되는 Cross Flatform Document 지향 데이터베이스 시스템
전통적인 테이블 - 관계 기반의 RDBMS처럼 스키마가 고정된 구조가 아닌 JSON 형태의 동적 스키마형 문서를 사용
*MongoDB 사용 예 - 이베이, 뉴욕 타임즈 등
Collection안에 Document 데이터 저장
Document는 일정한 틀을 가지지 않음
Document 내부의 Field 자료형 형식이 달라도 입력가능하며
각 Document들은 모두 일관된 Field를 가지지 않아도 됨
Table => Collection
Record => Document
지금까지 사용한 RDBMS는 테이블에 정형화된 필드를 만들고 그 형식에 맞게 데이터를 넣었다면
Document는 일정한 틀을 가지지 않으며 모두 일관된 필드를 가지지 않아도 된다.
설치 / 사용
1. http://mongodb.com
Products > MongoDB Server > Download the latest release > Server > MongDB Community Server > MSI(자동 설치) download
>[ Complete ] > Install MongoDB as a Service( PC켜면 자동으로 실행되는 프로그램 ) 체크
> Install MongoDB Compass 체크 해제 > Install
mongod.exe : 서버 실행 파일
mongo.exe : 쉘 프로그램(쉘 스크립트?) //클라이언트 창
2. c:\data\db 디렉토리 생성 ( 몽고DB에서 기본적으로 참조하는 디렉토리 )
(변경하려면 mongod --dbpath "c:\mongodb\data\db")
3. cmd창에서 mongod (서버 실행파일) 실행
1 2 3 4 5 6 | Microsoft Windows [Version 10.0.17134.829] (c) 2018 Microsoft Corporation. All rights reserved. C:\Users\user>cd C:\Program Files\MongoDB\Server\4.0\bin C:\Program Files\MongoDB\Server\4.0\bin>mongod |
....
4. 다른 cmd창 열어서 mongo(쉘 프로그램) 실행
1 2 3 4 5 6 7 8 | Microsoft Windows [Version 10.0.17134.829] (c) 2018 Microsoft Corporation. All rights reserved. C:\Users\user>cd C:\Program Files\MongoDB\Server\4.0\bin C:\Program Files\MongoDB\Server\4.0\bin>mongo MongoDB shell version v4.0.10 connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb |
.... ↓
↓
↓
connecting to: mongodb://127.0.0.1:27017
>local : 127.0.0.1
>port number : 27017
Insert |
SQL |
insert into users ("name", "city") values("terry", "seoul") |
MongDB |
db.users.insert({id:"terry", city:"Seoul"}) |
|
Select |
SQL |
select * from users where id ="terry" |
MongDB |
db.users.find({_id:"terry"}) |
|
Update |
SQL |
update users set city ="busan" where _id ="terry" |
MongDB |
db.users.update( {_id:"terry"}, { $set :{city:"Busan"} } ) |
|
Delete |
SQL |
update users set city="busan" where _id="terry" |
MongDB |
db.users.remove({_id:"terry"}) |
db.users.insert({id:"terry", sity:"seoul"})
>db.users 테이블에서 insert 함수를 호출, json 형식( variable : "value" )으로 데이터 입력
db.users.find({_id:"terry"})
>MongoDB에서는 PK를 언더바( _ )로 표시
MongoDB에서는 DB를 만들때 create 명령어로 생성되지 않고
데이터를 처음으로 저장할 때 생성됨
--DB 목록
show dbs
--DB 생성 // 데이터 입력(save) 전까지는 show dbs를 입력해도 목록에 뜨지 않는다.
use testdb
--현재 사용중인 DB 이름
db
-- 전체 데이터베이스 목록
show dbs
클라이언트 창에서
> db.memo.save({_id:1, writer:"김철수", memo:"첫번째 메모", post_date:new Date() }) //입력 (붙여넣기 안된다..ㅠ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > show dbs admin 0.000GB config 0.000GB local 0.000GB > use testdb switched to db testdb > show dbs admin 0.000GB config 0.000GB local 0.000GB > db testdb > db.memo.save({_id:1, writer:"김철수",memo:"첫번째 메모", post_date: new Date()}) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 1 }) > | cs |
>>> WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 1 })
Collection을 먼저 생성하지 않아도 데이터를 저장하는 순간 생성된다.
"nUpserted" : 1 : update or insert 된 자료
"_id" : 1 : PK
1 2 3 4 5 6 7 8 9 10 11 | > db.memo.save({_id:1, writer:"김철수",memo:"첫번째 메모", post_date: new Date()}) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 1 }) > db.memo.save({_id:2, writer:"김수진",memo:"두번째 메모", post_date: new Date()})}) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 }) > db.memo.save({id:2, writer:"박예진",memo:"세번째 메모", post_date: new Date()})}) WriteResult({ "nInserted" : 1 }) > db.memo.find() { "_id" : 1, "writer" : "김철수", "memo" : "첫번째 메모", "post_date" : ISODate("2019-07-10T09:05:01.171Z") } { "_id" : 2, "writer" : "김수진", "memo" : "두번째 메모", "post_date" : ISODate("2019-07-10T09:10:48.626Z") } { "_id" : ObjectId("5d25abba614e513215470b1d"), "id" : 2, "writer" : "박예진", "memo" : "세번째 메모", "post_date" : ISODate("2019-07-10T09:11:22.344Z") } > | cs |
_id로 save하지 않으면 자동으로 임의의 코드를 입력해준다.
1 2 | > db.memo.find({writer:"김철수"}) { "_id" : 1, "writer" : "김철수", "memo" : "첫번째 메모", "post_date" : ISODate("2019-07-10T09:05:01.171Z") } | cs |
//컬렉션 생성
db.createCollection("customers")
//데이터를 입력하면서 동시에 collection 생성
db.customers.insert( { name:"김철수", age: 22 } )
컬렉션 목록
show collections
[ MongoDB 인증 설정 ]
관리자 계정 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 | > use admin switched to db admin > db .createUser({user:"admin", pwd:"1234", roles:[{ role:"userAdminAnyDatabase", db:"admin"}]}) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } > |
admin 데이터베이스가 생성되고 admin 관리자 계정이 생성된다.
[ Ctrl + C ] : MongoDB Server / Client 모두 종료
1 2 3 4 | > ^C bye C:\Program Files\MongoDB\Server\4.0\bin> |
>mongod --auth : 아이디, 패스워드를 입력해야 접속할 수 있는 MongoDB 서버 인증모드로 재시작
1 | C:\Program Files\MongoDB\Server\4.0\bin>mongod --auth |
Client 접속 방법
1) 서버 인증모드로 시작하고
Client >mongo -port 27017 -u "admin" -p "1234" --authenticationDatabase "admin"
2) mongo 로 접속한 후
>use admin
>db.auth("admin", "1234")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | C:\Program Files\MongoDB\Server\4.0\bin>mongo -port 27017 -u "admin" -p "1234" --authenticationDatabase "admin" MongoDB shell version v4.0.10 connecting to: mongodb://127.0.0.1:27017/?authSource=admin&gssapiServiceName=mongodb ... ... > ^C bye C:\Program Files\MongoDB\Server\4.0\bin>mongo MongoDB shell version v4.0.10 connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb > use admin switched to db admin > db.auth("admin", "1234") 1 > |
사용권한 참조
https://docs.mongodb.com/manual/core/authorization/
일반 사용자 계정 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | --- > use admin switched to db admin > db.auth("admin", "1234") 1 > use web switched to db web > db.createUser( ... { user:"web", pwd:"1234", ... roles: [ { role:"readWrite", db:"web" }, ... { role:"read", db:"reporting"}] ... }) Successfully added user: { "user" : "web", "roles" : [ { "role" : "readWrite", "db" : "web" }, { "role" : "read", "db" : "reporting" } ] } > |
관리자 로그인 상태에서 일반 사용자 계정을 생성한다.
일반사용자 계정 로그인
1) mongo --port 27017 -u "web" -p "1234" --authenticationDatabase "web"
2) mong 로 접속한 후
>use web
>db.auth("web", "1234")
=>1이 출력되면 인증 성공
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | > ^C bye //방법 1 C:\Program Files\MongoDB\Server\4.0\bin>mongo --port 27017 -u "web" -p "1234" --authenticationDatabase "web" MongoDB shell version v4.0.10 connecting to: mongodb://127.0.0.1:27017/?authSource=web&gssapiServiceName=mongodb ... ... //방법 2 --- > use web switched to db web > db.auth("web", "1234") 1 > | cs |