본문 바로가기
국비교육

MongoDB 6일차

by Diligejy 2019. 4. 22.

1.

MVC Pattern + MongoDB를 해볼 예정

패키지구조

 

DTO Package

2. 오늘 enum이라는 걸 배워봤다.

이넘!!!

ex) 요일 (7), day (1~31) 등을 관리할 때 사용한다. 

변수는 하나인데 값이 여러개 있을 때!!!!

3. Beans 설정

 

4. MongoDB는 AutoCommit이라 Commit, Rollback이 없다.

beans 설정

5.

DAOBOOK 패키지의 NewMyDAO클래스를 다음과 같이 작성해준다.

 

6. 메인설정을 해준 뒤 실행해주면

이렇게 MongoDB에 Input이 되었음을 알 수 있다.

 

cf. 여기서 실수할 수 있는 부분

componenet-scan이 config안으로 있으면 에러가 발생한다.

왜 그런지 살펴보자.

context:annotation-config는 @Required와 @AutoWired를 읽어들이는 기능을 한다. 

 

반면 Componenet-Scan은 @Componenet, @Repository, @Service, @Controller, ....등등을 읽어들인다.

 

그러므로 각각의 기능이 다른 context이며 하나의 안으로 넣을 수가 없다.

 

 

7. Spring에서 Map-Reduce Operation 연습해보기

 

https://docs.spring.io/spring-data/mongodb/docs/2.1.6.RELEASE/reference/html/#mongo.mapreduce

불러오는 중입니다...

다음의 API문서를 토대로 진행한다.

 

API문서에서는 jmr1이라는 컬렉션으로 했지만, 

 

우리 반의 실습에서는 mrtest라고 해야한다. (여기서 insert할 때 주의해야 한다. 이 점은 뒤에서 언급하겠다)

 

map.js

 

다음과 같이 복붙하고 map.js를 입력해준다.

 

reduce.js

다음과 같이 복붙하고 reduce.js를 입력해준다.

 

메인에서 test()라는 메소드를 만들어준뒤 

ValueObject 클래스에는 다음과 같이 입력해준다.

 

그런데 

Exception in thread "main" com.mongodb.CommandFailureException: 

{ "serverUsed" : "localhost:27017" , "ok" : 0.0 , "errmsg" : "namespace does not exist: test.mrtest" , "code" : 26 , "codeName" : "NamespaceNotFound"}
at com.mongodb.CommandResult.getException(CommandResult.java:76)
at com.mongodb.CommandResult.throwOnError(CommandResult.java:140)
at com.mongodb.DBCollection.mapReduce(DBCollection.java:1727)
at org.springframework.data.mongodb.core.MongoTemplate.mapReduce(MongoTemplate.java:1409)
at org.springframework.data.mongodb.core.MongoTemplate.mapReduce(MongoTemplate.java:1381)
at com.DAOBOOK.NewMyDAO.test(NewMyDAO.java:97)
at com.VIEW.App.main(App.java:25)

 

이런 에러가 발생했다. 이유는 단순했다.

 

데이터를 입력할 때 나는

use mrtest를 한 뒤에 입력을 했다.

그렇기 때문에 mrtest로 들어갔다. 

 

이게 무슨 문제냐고???

 

spring-config.xml에서는 test라고 databaseName을 설정해주고서 자기 마음대로 mrtest를 설정했으니 에러가 나는것이다.

 

두가지 해결방법이 있다.

 

ⓐ constructor-arg name = "databaseName"의 value를 mrtest라고 변경시키고 다시 뒤엎기

cf.

이렇게 하면 기존의 NewMyDAO의 update()메소드에서 NullPointerException이 발생한다.

 

ⓑ MongoDB에서 use test를 한 뒤 거기에 데이터를 입력하여 새로 하는 방법이다.

use test를 한 뒤

mrtest에 데이터를 입력해준다.

 

그렇게 하면 결과가 다음과 같이 출력된다.

API문서가 원하는 것과 똑같다.

 

8.

10.11.2를 들어간다.

https://docs.spring.io/spring-data/mongodb/docs/2.1.6.RELEASE/reference/html/#mongo.aggregation.supported-aggregation-operations

 

Spring Data MongoDB - Reference Documentation

As of version 3.6, MongoDB supports the concept of sessions. The use of sessions enables MongoDB’s Causal Consistency model, which guarantees running operations in an order that respects their causal relationships. Those are split into ServerSession instan

docs.spring.io

연산자에 대해서 다시한번 정리!

 

 

MongoDB의 Project를 JAVA코드로 변환

9.

 

이렇게 한 뒤

 

ⓐ location.txt로 저장한다.

mongoexport --db myloc -c location --out location.txt

 

ⓑ location.json로 저장한다.

mongoexport --db myloc -c location --out location.json

 

ⓒ location.txt를 읽어와서 좌표 내용을 출력한다.

mongoimport --db myloc -c location --file location.txt

 

ⓓ $near 0.75 max까지 추출한다.

db.location.createIndex({position:"2d"}); 

-> 선생님은 ensureIndex를 사용하셨지만, MongoDB in Action이라는 책을 보니 v3.0부터 createIndex를 쓴다고 나와있었다.

별 차이는 없을거 같은데 그래도...

 

db.location.find({position : {$near : [0, 0], $maxDistance : 0.75} })

이렇게 하면 

 

 

'국비교육' 카테고리의 다른 글

Python 1일차  (0) 2019.04.24
MongoDB 7일차  (0) 2019.04.23
MongoDB 5일차  (0) 2019.04.19
MongoDB 수업 4일차  (0) 2019.04.18
MongoDB 수업 3일차  (0) 2019.04.17

댓글