Docs Menu
Docs Home
/ / /
Java 동기화

FAQ

이 페이지의 내용

MongoDB deployment 에 연결하는 데 문제가 있는 경우 연결 문제 해결 가이드 에서 가능한 해결 방법을 참조하세요.

MongoClient에는 두 가지 유형이 있습니다. 우리가 여러 CRUD API를 포함하는 데 혼동이 없는 더 깔끔한 신규 사용자용 API를 원했기 때문입니다. 우리는 Java 9에 도입된 Java 모듈 지원과 잘 작동하는 Java 패키지 구조에서 새로운 CRUD API를 사용할 수 있는지 확인하고 싶었습니다.

새 애플리케이션은 일반적으로 다음을 지원하는 com.mongodb.client.MongoClient 인터페이스를 사용해야 합니다.

  • MongoClientSettingsConnectionString 을 사용한 구성. com.mongodb.client.MongoClients 클래스에 정의된 팩토리 메서드를 통해 이 인터페이스의 인스턴스를 만들 수 있습니다.

  • MongoDatabase 을(를) 사용하는 CRUD API와 여기에서 MongoCollection

다음을 지원하는 레거시 API에 대한 지원이 필요한 경우 com.mongodb.MongoClient 클래스를 사용해야 합니다.

  • MongoClientOptionsMongoClientURI을 사용한 구성

  • DB 을 사용하는 CRUD API와 여기에서 DBCollection. getDB() 메서드를 통해 이 API에 액세스할 수 있습니다.

새 API와 레거시 API가 혼합되어 필요한 애플리케이션의 경우 com.mongodb.MongoClient 는 다음도 지원합니다.

  • MongoClientSettingsConnectionString 을 사용한 구성의 유일한 차이점은 팩토리 클래스 대신 생성자를 통해 인스턴스를 생성한다는 점입니다.

  • MongoDatabase 을 사용하는 CRUD API와 여기에서 MongoCollection. getDatabase() 메서드를 통해 이 API에 액세스할 수 있습니다.

MongoClientSettings 클래스를 사용하여 MongoClient 인스턴스에 대한 구성을 지정할 수 있습니다. MongoClientSettings 인스턴스를 구성하려면 MongoClientSettings.Builder 클래스를 사용합니다.

다음은 MongoClientSettings 클래스를 사용하여 다양한 작업을 수행하는 방법을 보여주는 문서 섹션입니다.

클래스에 대한 자세한 MongoClientSettings 내용은 MongoClientSettings에 대한 API 설명서를 참조하세요.

모든 MongoClient 인스턴스에는 MongoDB 토폴로지의 각 서버에 대한 내장 연결 풀이 있습니다. 연결 풀은 필요에 따라 소켓을 열어 멀티스레드 애플리케이션에서 동시 MongoDB 작업을 지원합니다.

각 연결 풀의 최대 크기는 maxPoolSize 옵션으로 설정되며 기본값은 100입니다. 서버에 대한 사용 중인 연결 수가 maxPoolSize 값에 도달하면 해당 서버에 대한 다음 요청은 연결이 가능해질 때까지 대기합니다.

MongoClient 인스턴스는 MongoDB 토폴로지에서 서버당 두 개의 추가 소켓을 열어 서버 상태를 모니터링합니다.

예를 들어, 3노드 복제본 세트에 연결된 클라이언트는 6개의 모니터링 소켓을 엽니다. 또한 각 서버에서 애플리케이션의 스레드를 지원하는 데 필요한 만큼의 소켓을 maxPoolSize 값까지 엽니다. maxPoolSize100 이고 애플리케이션이 기본 연결 풀만 사용하는 경우(기본값), 기본 연결 풀만 커져서 총 연결 풀이 최대 106 개가 될 수 있습니다. 애플리케이션이 읽기 설정 (read preference) 을 사용하여 세컨더리 노드를 쿼리하는 경우 해당 풀도 커지고 총 연결 수가 306 개가 될 수 있습니다.

또한 연결 풀에는 속도 제한이 있어 각 연결 풀은 언제든지 최대 maxConnecting 개의 연결 값만 병렬로 생성할 수 있습니다. 모든 추가 스레드는 다음과 같은 경우 대기를 중지합니다.

  • 기존 스레드 중 하나가 연결 생성을 완료하거나, 기존 연결이 풀에 다시 체크인됩니다.

  • 연결 생성에 대한 속도 제한으로 인해 기존 연결을 재사용하는 드라이버의 기능이 향상됩니다.

minPoolSize 옵션(기본값 0)을 사용하여 각 서버에 대한 최소 동시 연결 수를 설정할 수 있습니다. 연결 풀은 이 수의 소켓으로 초기화됩니다. 네트워크 오류로 인해 소켓이 닫혀 총 소켓 수(사용 중인 소켓과 유휴 상태 모두)가 최소값 아래로 떨어지면 최소값에 도달할 때까지 더 많은 소켓이 열립니다.

연결이 제거되기 전에 풀에서 유휴 상태로 유지될 수 있는 최대 시간(밀리초)을 설정하고 maxIdleTimeMS 옵션(기본값은 0 (제한 없음))으로 대체될 수 있습니다.

MongoClient에 대한 다음 기본 구성은 대부분의 애플리케이션에서 작동합니다.

MongoClient client = new MongoClient("<connection string>")

각 프로세스에 대해 한 번씩 클라이언트를 생성하고 모든 작업에 재사용합니다. 각 요청에 대해 새 클라이언트를 생성하는 것은 흔한 실수이며 이는 매우 비효율적입니다.

하나의 프로세스 내에서 많은 수의 동시 MongoDB 작업을 지원하려면 maxPoolSize 을 늘리면 됩니다. 풀이 최대 크기에 도달하면 추가 스레드가 소켓을 사용할 수 있을 때까지 대기합니다.

드라이버는 소켓이 사용 가능해질 때까지 기다릴 수 있는 스레드 수를 제한하지 않으며, 부하 급증 시 해당 풀의 크기를 대기 중인 제한으로 제한하는 것은 애플리케이션의 책임입니다. 스레드는 waitQueueTimeoutMS 옵션에 지정된 시간(기본값 120000 또는 120초) 동안 대기합니다.

소켓에 대해 waitQueueTimeoutMS 에 정의된 시간보다 오래 기다리는 스레드는 연결 오류를 발생시킵니다. 모든 작업을 완료하는 것보다 부하가 급증하는 동안 작업 기간을 제한하는 것이 더 중요한 경우 이 옵션을 사용합니다.

스레드에서 MongoClient.close()를 호출하면 드라이버는 모든 유휴 소켓을 닫고 사용 중인 모든 소켓이 풀로 반환될 때 닫습니다.

Java 런타임 환경이 런타임에 클래스 파일을 찾을 수 없는 경우 java.lang.NoClassDefFoundError 예외가 발생할 수 있습니다. MongoDB Java 드라이버를 사용하는 애플리케이션 코드를 실행하려고 하는 경우 클래스 경로에 적절한 드라이버 JAR 파일을 포함해야 합니다.

클래스 경로에 Java 드라이버 JAR 파일을 추가한 후 이 오류가 발생하면 환경에서 다음 항목을 확인하세요.

  • JAR 파일은 클래스 경로로 지정된 위치에 존재합니다.

  • 클래스 경로 구문이 정확합니다.

  • 환경 변수에 클래스 경로를 정의하면 Java 런타임 환경에서 해당 변수를 사용합니다.

  • 종속성 관리자를 사용하는 경우 해결할 수 없는 충돌은 보고하지 않습니다.

이 오류에는 패키지와 클래스 이름이 포함되어 있으며, 이는 클래스 경로에서 누락되었을 수 있는 JAR 드라이버를 식별하는 데 도움이 될 수 있습니다. 오류가 참조하는 드라이버 JAR을 찾으려면 API 문서에서 각 항목을 확인하세요.

MongoDB deployment에 연결할 때 유효하지 않거나 잘못된 형식의 자격 증명을 지정하면 애플리케이션에서 이 예외가 발생할 수 있습니다.

MongoDB deployment에 연결하려고 할 때 이 오류가 발생하면 코드에서 다음 항목을 확인하세요.

  • 연결 URI가 올바른 MongoDB deployment에 해당합니다. 연결 URI 설정에 대해 자세히 알아보려면 연결 URI를 참조하세요 .

  • 지정한 인증 메커니즘에 대한 자격 증명이 정확합니다. 자격 증명을 지정하는 방법을 알아보려면 인증 메커니즘엔터프라이즈 인증 메커니즘 가이드를 참조하세요.

  • 지정한 인증 데이터베이스의 이름이 정확합니다. MongoDB deployment에 대한 사용자 및 역할을 설정하는 방법을 알아보려면 MongoDB Server 설명서에서 사용자 및 역할 관리 를 참조하세요.

잘못된 형식의 문서를 작업에 전달하고 드라이버 버전 v4.7 이하를 사용하는 경우 애플리케이션에서 이 예외가 발생할 수 있습니다.

참고

드라이버 버전 v4.8 이상에서는 이 오류 메시지가 잘못 포맷된 내용에 대한 보다 구체적인 세부 정보를 포함하는 메시지로 대체되었습니다.

예를 들어 다음 코드 예제와 같이 업데이트 작업을 호출하고 업데이트 연산자를 잘못 생략하면 드라이버에서 이 오류가 발생합니다.

// incorrectly formatted update document
collection.updateOne(
new Document().append("name", "fizz"),
new Document().append("name", "buzz")
);

이 오류를 방지하려면 적절한 작업에 빌더 클래스를 사용하세요. 이 드라이버는 MongoDB 작업에 구문적으로 올바른 BSON을 생성할 수 있는 빌더 클래스를 제공합니다. 앞의 예제는 다음 코드 예제와 같이 빌더 클래스를 사용하여 올바르게 표현할 수 있습니다.

// Builder class imports
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Updates.*;
// ...
collection.updateOne(eq("name", "fizz"), set("name", "buzz"));

사용 가능한 빌더 클래스에 대해 자세히 알아보려면 빌더 설명서를 참조하세요.

MongoDB에 대한 연결을 종료한 인스턴스 MongoClient 에서 작업을 호출하는 경우 이 예외가 발생할 수 있습니다. MongoClient 에서 close() 메서드가 호출되면 해당 인스턴스에서 추가 작업을 호출하면 이 예외가 발생합니다.

이 예외를 방지하려면 close() 를 호출하는 코드가 MongoClient 인스턴스에서 실행된 후 해당 인스턴스에 대한 작업을 호출하지 않도록 합니다.

경우에 따라 MongoClient 인스턴스를 닫는 코드를 찾기 어려울 수 있습니다. 이 예외의 잠재적 원인을 찾으려면 다음 사례를 검색하세요.

  • MongoClient 인스턴스의 close() 호출

  • 가 선언된 try-with-resources 문의 범위를 벗어난 인스턴스에 대한 작업 호출 MongoClient MongoClient

애플리케이션에서 MongoClient 을 managed하기 위해 프레임워크(예: 프레임워크)를 사용하는 경우 프레임워크 문서에서 연결 동작 관리에 대한 권장사항을 찾아보세요.

Spring Boot에서 MongoDB에 액세스하는 방법에 대해 자세히 알아보려면 Spring Boot 및 MongoDB를 참조하세요.

아니요, PojoCodecProvider 는 ObjectId를 자동으로 생성합니다.

네. 이에 대한 예는 다음 구현 을 참조하세요.

예, 판별자를 사용하면 됩니다.

판별자는 특정 문서 스키마를 식별하는 속성입니다. 상속에 사용하고 동일한 collection 또는 상위 문서 (하위 문서를 포함하는 경우) 내에 여러 유형의 문서를 저장할 수 있습니다.

예를 들어, Java로 확장하는 Event 클래스가 있는 경우(예: MachineEvent 또는 NetworkEvent)인 경우 판별자를 사용하여 PojoCodecProvider 에서 문서를 직렬화/역직렬화하는 데 사용해야 하는 클래스를 식별합니다.

자세한 내용은 POJO 사용자 지정 가이드를 참조하세요.

네, 3.7 Java 드라이버는 JSR-310 Instant, LocalDate, LocalDateTime에 대한 기본 지원을 추가합니다.

예, 이 클래스에 대한 자체 코덱을 빌드하여 레지스트리에 추가할 수 있습니다.

공급자 목록의 첫 번째, 기본 코덱 레지스트리 앞, PojoCodecProvider 앞에 코덱을 추가합니다.

CodecRegistry registry = CodecRegistries.fromRegistries(
CodecRegistries.fromCodecs(
new MyDateAsStringCodec()),
MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(pojoCodecProvider));

공개 setter를 사용할 수 없는 경우 리플렉션을 통해 비공개 필드를 설정하는 SET_PRIVATE_FIELDS_CONVENTION 를 사용하도록 PojoCodecProvider 를 구성할 수 있습니다.

아니요. 네이티브 POJO 코덱은 게터/세터가 각 필드에 대해 동일한 수정자를 가지고 있다고 가정합니다.

예를 들어 다음 메서드는 인코딩 중에 예외를 발생시킵니다.

private String getField();
public String setField(String x);

이 예외는 현재 클래스에 대한 코덱이 없으므로 클래스에 대한 코덱을 등록해야 함을 의미합니다.

주석이 없습니다. 다음과 같이 클래스에 정적 문자열을 추가하는 것이 좋습니다.

public class Person {
public static final String COLLECTION_NAME = "people";
}

다음 스니펫은 특정 POJO 클래스의 collection 이름을 지정합니다.

database.getCollection(Person.COLLECTION_NAME, Person.class);

다음 예제는 레거시 API와 현재 API를 사용하여 MongoDB 인스턴스에 연결하는 방법을 보여줍니다.

이 문서만 포함된 collection에 연결한다고 가정해 보겠습니다.

{"_id": 1, "val": 1}
MongoClient client = new MongoClient(URI);
DB db = client.getDB(DATABASE);
DBCollection col = db.getCollection(COLLECTION);
DBObject doc = col.find().one();
System.out.println(doc.toString());
MongoClient client = MongoClients.create(URI);
MongoDatabase db = client.getDatabase(DATABASE);
MongoCollection<Document> col = db.getCollection(COLLECTION);
// Prints the first document retrieved from the collection as JSON
Document doc = col.find().first();
System.out.println(doc.toJson());

이전 코드 스니펫의 출력은 다음과 같아야 합니다.

{"_id": 1, "val": 1}

앞의 예제에서 사용된 레거시 클래스 및 메서드에 대한 자세한 내용은 다음 API 문서 페이지를 참조하세요.

레거시 API와 현재 API 간의 차이점 목록은 레거시 API에서 마이그레이션 페이지를 참조하세요.

다음은 레거시 MongoClientOptionsMongoClientURI 클래스를 사용하여 쓰기 고려를 설정하는 방법을 보여주는 예입니다.

MongoClientURI mongoURI = new MongoClientURI(URI,
MongoClientOptions.builder()
.writeConcern(WriteConcern.W1));
MongoClient client = new MongoClient(mongoURI);
MongoClientSettings options = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(URI))
.writeConcern(WriteConcern.W1).build();
MongoClient client = MongoClients.create(options);

앞의 예제에서 사용된 레거시 클래스 및 메서드에 대한 자세한 내용은 다음 API 설명서 페이지를 참조하세요.

레거시 API와 현재 API 간의 차이점 목록은 레거시 API에서 마이그레이션 페이지를 참조하세요.

여기에서 질문에 대한 답변을 찾을 수 없는 경우 문제 및 도움말 섹션에 나열된 포럼과 지원 채널을 사용해 보세요.

돌아가기

API 문서

이 페이지의 내용