[MongoDB] Java driver 연동 & quickstart

2021. 3. 27. 18:31실천해본것들

빨리 연동이나 해보자.

설치

image1

확인해보니 4.1 , 4.2가 호환이 되는 것으로 확인 되었다.

4.2 latest 버전으로 깐다. 딱히 안정적인 버전이 필요한 상황이 아니라면 새 버전으로 간다.

maven

        <!-- https://mongodb.github.io/mongo-java-driver/4.2/driver/getting-started/installation/ -->
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-sync</artifactId>
            <version>4.2.2</version>
        </dependency>

이 부분을 미리 만들어둔 maven module project의 pom.xml에 붙였다.

테스트

MongoClient mongoClient = MongoClients.create();

이것으로 다 끝났다고 생각했지만, 테스트 해보니 warning이 잡힌다.

3월 27, 2021 9:58:37 오전 com.mongodb.diagnostics.logging.Loggers shouldUseSLF4J
WARNING: SLF4J not found on the classpath.  Logging is disabled for the 'org.mongodb.driver' component

SLF4J ?

  • SLF4J - 자바용 로그 api다.
    • 지금은 이런게 있다정도만 알아본다.
    • Simple Logging Facade for Java - 단순 로깅 외관?
    • 나중에 삽질할거 지금한다 생각하고 import 해 보았다.

이전의 삽질....

 

더보기

https://stackoverflow.com/questions/9030065/classnotfoundexception-org-slf4j-loggerfactory

여기서 보니까 sl4fj 사이트에서 다운받으라 한다.

공식 다운페이지 -https://repo1.maven.org/maven2/org/slf4j/

에서 slf4j-api-1.7.30.jar 을 받고 프로젝트에 외부 jar 경로 추가하니

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

것도 나오고, 혹시 몰라 slfj-api-xxx-javadocs.jar을 추가했지만

SLF4J: No SLF4J providers were found. SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

이런게 뜬다. 결국 요구하는 것이 없으니 징징대는 것이다.

slf4j-simple-x.x.x.jar 과 slf4j-api-x.x.x.jar를 추가하면 더이상 warning 소리는 들리지 않는다.

링크

입맛대로 버전을 골라서 다운 받고 external jar 등록 하면된다.

참고

XXX-javadocs.jar : html 포맷의 document 생성 툴을 포함한다.

XXX-sources.jar : class file로 compile 되지 않은 java file이 있다. 날고기다.

XXX.jar : 이게 기본이다. 이거 받으면 된다.

mvnrepository.com/artifact/org.slf4j/slf4j-simple/1.7.30

mvnrepository.com/artifact/org.slf4j/slf4j-api/1.7.30

 

다 필요없고, pom.xml 파일에 이것만 추가하면 된다. 괜히 다운받고 jar 추가한다고 들쑤셨다.

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.30</version>
            <scope>test</scope>
        </dependency>
            <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>

이러면 대략적인 준비는 끝났다.

연습

환경 import 할 거 다 했으면 그 다음부터는 쭉 copy & paste 해서 결과만 보면 된다..... 고 생각했지만 그게 아니었다.

MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("restaurants");

document import

다른 것은 자동으로 import 가 되는데 Document 만큼은 import가 안되는 것이었다.

  • Document
    • https://docs.mongodb.com/manual/core/document/
    • MongoDB stores data records as BSON documents
      BSON is a binary representation of JSON documents,
      • bson( json 문서에 대한 이진화된 표현) 문서를 document로 사용한다.
      • import org.bson.Document; 를 사용했더니 무리 없이 된다.

eq(), lt(), gt() ..... set()

이것 이후에 쭈욱 하다가 연산자 쪽에서 빨간 줄이 그인다.

eq(), lt(), gt() 

분명 예제는 이리 써져 있는데 빨간줄이 나오니 어이가 없다.

https://stackoverflow.com/questions/46383277/why-eq-doesnt-exist-for-mongo-java-driver

여기서는

import static com.mongodb.client.model.Filters.eq;

을 추가하면 코드 수정 없이도 괜찮고,

import com.mongodb.client.model.Filters

을 쓰고 각 연산자 앞에 Filters.eq() 이런식으로 Filters 를 붙이면 된다.

그런데 set은 Filters를 붙여도 안되는 것이다.

검색에서 나오는 솔루션들은 기존 코드와는 일관성이 안맞아서 맘에 안들었다.

Filters 처럼 import 한번에 처리할 수 있는 class가 있겠지 하고 찾아보니

https://mongodb.github.io/mongo-java-driver/3.6/javadoc/com/mongodb/client/model/Updates.html#set-java.lang.String-TItem-

Updates 라는 class가 set을 지원한다. 역시 이래야지.

  • import static com.mongodb.client.model.Updates.set;
  • import com.mongodb.client.model.Updates; 후 Updates.set() 사용

이러면 끝이다.

다 귀찮으면?

환경 설정한 뒤에 이 코드를 복사하고

main 에서 주석 해제 하나씩 해가면서 테스트 하면 된다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.bson.Document;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;

public class ConnectMongoDbTest {

    public static void main(String[] args) {
        mongoQuickStart();
    }

    public static void mongoQuickStart() {

        MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
        MongoDatabase database = mongoClient.getDatabase("admin");
        MongoCollection<Document> collection = database.getCollection("sample");

//        insertDoc(collection);
//        insertManyDoc(collection);
        // count document
//        findDoc(collection);
//        findEqDoc(collection,0);
//        findGtDoc(collection,70);
//        findRangeDoc(collection,30,50);
//        updateDoc(collection,0,5959);
//        updateManyDoc(collection,120,100);
//        deleteDoc(collection, 5959);
//        findEqDoc(collection,5959);
//        deleteManyDoc(collection, 200);
//        createIndex(collection, true);
        System.out.println(collection.countDocuments());
        findAllDoc(collection);
    }
    // document 추가
    public static void insertDoc(MongoCollection<Document> collection) {
        Document doc = new Document("name", "MongoDB").append("type", "database").append("count", 1)
                .append("versions", Arrays.asList("v3.2", "v3.0", "v2.6"))
                .append("info", new Document("x", 203).append("y", 102));
        collection.insertOne(doc);
    }
    // 많은 document 추가
    public static void insertManyDoc(MongoCollection<Document> collection) {
        List<Document> documents = new ArrayList<Document>();
        for (int i = 0; i < 100; i++) {
            documents.add(new Document("i", i));
        }
        collection.insertMany(documents);
    }
    // 첫번째 document print
    public static void findDoc(MongoCollection<Document> collection) {
        Document myDoc = collection.find().first();
        System.out.println(myDoc.toJson());
    }
    // 값이 일치하는  document print
    public static void findEqDoc(MongoCollection<Document> collection,int val) {
        Document myDoc = collection.find(Filters.eq("i", val)).first();
        if(null != myDoc) {
            System.out.println(myDoc.toJson());            
        }else {
            System.out.println("document not found");
        }
    }
    // 값보다큰 document print
    public static void findGtDoc(MongoCollection<Document> collection,int val) {
        collection.find(Filters.gt("i", val))
        .forEach(doc -> System.out.println(doc.toJson()));
    }
    // 지정한 범위 값의 document print(초과, 이하)
    public static void findRangeDoc(MongoCollection<Document> collection,int start,int end) {
        collection.find(Filters.and(Filters.gt("i", start), Filters.lte("i", end)))
        .forEach(doc -> System.out.println(doc.toJson()));
    }
    // print all document 
    public static void findAllDoc(MongoCollection<Document> collection) {
        MongoCursor<Document> cursor = collection.find().iterator();
        try {
            while (cursor.hasNext()) {
                System.out.println(cursor.next().toJson());
            }
        } finally {
            cursor.close();
        }
    }
    // update document 
    public static void updateDoc(MongoCollection<Document> collection,int target,int value) {
        collection.updateOne(Filters.eq("i", target),Updates.set("i", value));
    }
    // update multiple document 
    public static void updateManyDoc(MongoCollection<Document> collection,int condition,int value) {
        UpdateResult updateResult = collection.updateMany(Filters.lt("i", condition), Updates.inc("i", value));
        System.out.println(updateResult.getModifiedCount());
    }
    // delete document 
    public static void deleteDoc(MongoCollection<Document> collection,int value) {
        collection.deleteOne(Filters.eq("i", value));
    }
    // delete multiple document 
    public static void deleteManyDoc(MongoCollection<Document> collection,int condition) {
        DeleteResult deleteResult = collection.deleteMany(Filters.gte("i", condition));
        System.out.println(deleteResult.getDeletedCount());
    }
    // create index()
    public static void createIndex(MongoCollection<Document> collection,boolean isAscend) {
        int indexOrder = isAscend ? 1 : -1;
        collection.createIndex(new Document("i", indexOrder));
    }    

}

happy 하다.

'실천해본것들' 카테고리의 다른 글

TensorflowTTS 한국어 예제 써보기 (KSS dataset)  (6) 2021.06.15
monday.com 탈퇴하기  (0) 2021.04.21
[JDBC] MySQL(docker) DB replication 적용  (0) 2021.03.18
AWS - 1 - EC2 instance 생성  (0) 2020.08.23
install PyQt designer  (0) 2020.07.24