Document 클래스는 유연하지만 직접 키-값으로 설정해서 꺼내는 작업이 번거롭고 가독성이 떨어져서 POJO를 사용
- Plain Old Java Object
- 순수한 자바 클래스 : 특정 라이브러리, 프레임워크 의존 X
- 즉,
getter,setter,생성자,toString()을 갖춘 클래스 -> 데이터 구조 표현 최적- MongoDB는 BSON(JSON 유사 객체) 저장하는 DB으로 자바 객체와 직접적으로 매핑하려면 POJO 활용이 유리
java_exC:\KB_Fullstack\06_MongoDBdependencies {
// log 기록 용
// implementation 'ch.qos.logback:logback-classic:1.2.11'
// MongoDB Driver
implementation 'org.mongodb:mongodb-driver-sync:5.0.0'
// lombok
compileOnly "org.projectlombok:lombok:1.18.32"
annotationProcessor "org.projectlombok:lombok:1.18.32"
testCompileOnly "org.projectlombok:lombok:1.18.32"
testAnnotationProcessor "org.projectlombok:lombok:1.18.32"
}
PojoCodecProvider 설정Database.java
// POJO 사용을 위해 PojoCodecProvider 등록
static {
CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry pojoCodecRegistry = fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(pojoCodecProvider)
);
ConnectionString connectionString = new ConnectionString("mongodb://127.0.0.1:27017");
client = MongoClients.create(connectionString);
database = client.getDatabase("todo_db").withCodecRegistry(pojoCodecRegistry);
}
// 컬렉션을 반환하는 메서드
public static <T> MongoCollection<T> getCollection(String name, Class<T> clazz) {
return database.getCollection(name, clazz);
}
Todo.java
package app.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Todo {
private ObjectId id; // 기본 _id 타입
private String title;
private String desc;
private boolean done;
}
App.java
insertOneTodo todo = new Todo(null, "POJO", "POJO 테스트", false);
collection.insertOne(todo);
insertManyList<Todo> list = Arrays.asList(
new Todo(null, "POJO2", "POJO2 테스트", false),
new Todo(null, "POJO3", "POJO3 테스트", true)
);
collection.insertMany(list);
-> 반복문으로 데이터 다량으로 insert 가능
List<Document> insertList = new ArrayList<>();
for (int i = 10; i < 21; i++) {
Document d = new Document().append("name", "user_" + i).append("age", i).append("created", new Date());
insertList.add(d);
}
collection.insertMany(insertList);
findAllList<Todo> todos = new ArrayList<>();
collection.find().into(todos);
todos.forEach(System.out::println);
findByIdBson query = eq("_id", new ObjectId("666a6296f4fe57189cd03eea"));
Todo result = collection.find(query).first();
System.out.println(result);
Document 방식과 동일한 API를 사용
updateOne
Bson query = eq("_id", new ObjectId("..."));
Bson updates = Updates.combine(
Updates.set("name", "modify name"),
Updates.currentTimestamp("lastUpdated")
);
collection.updateOne(query, updates);
deleteOne//eq
Bson query = eq("_id", new ObjectId("..."));
collection.deleteOne(query);
//gt
Bson query = gt("age", 15);
collection.deleteMany(query);
| 연산자 | 설명 |
|---|---|
eq | 특정 값과 같은 문서 찾기 |
ne | 특정 값과 같지 않은 문서 찾기 |
lt, lte | 작다, 작거나 같다 |
gt, gte | 크다, 크거나 같다 |
in | 배열 값 중 하나와 일치 |
nin | 배열 값과 일치하지 않음 |
| 항목 | Document 방식 | POJO 방식 |
|---|---|---|
| 장점 | 유연성, 자유도 높음 | 타입 안정성, 가독성, 유지보수 용이 |
| 단점 | 반복 코드 많음, 실수 발생 가능 | Codec 등록 필요, 초기 설정 복잡 |
| 추천 상황 | 복잡한 구조 없이 임시 실습 | 실제 서비스, 팀 개발, 객체지향 지향 시 |
- Document 방식
Document doc = new Document("title", "MongoDB").append("done", false); collection.insertOne(doc);
- POJO 방식
new Todo(null, "MongoDB", "공부하기", false);