NoSQL_02 MongoDB Java POJO연동

aggapang·2025년 6월 7일

kb IT's Your Life

목록 보기
18/20
  • Document 클래스는 유연하지만 직접 키-값으로 설정해서 꺼내는 작업이 번거롭고 가독성이 떨어져서 POJO를 사용

POJO

  • Plain Old Java Object
  • 순수한 자바 클래스 : 특정 라이브러리, 프레임워크 의존 X
    • 즉, getter, setter, 생성자, toString()을 갖춘 클래스 -> 데이터 구조 표현 최적
  • MongoDB는 BSON(JSON 유사 객체) 저장하는 DB으로 자바 객체와 직접적으로 매핑하려면 POJO 활용이 유리

과정

1. 프로젝트 기본 세팅

프로젝트 생성

  • Name: java_ex
  • Location: C:\KB_Fullstack\06_MongoDB
  • Build System: Gradle
  • DSL: Groovy

Gradle 설정 (build.gradle)

dependencies {
    // 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"
}

2. MongoDB + POJO 연결

  • Codec 등록
  • BSON <-> Java 객체 간 자동 변환을 위해 PojoCodecProvider 설정

MongoDB 연결

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);
}

POJO 클래스 정의

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;
}

3. CRUD

App.java

삽입(insert)

  • insertOne
Todo todo = new Todo(null, "POJO", "POJO 테스트", false);
collection.insertOne(todo);
  • insertMany
List<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);

조회(find)

  • findAll
List<Todo> todos = new ArrayList<>();
collection.find().into(todos);
todos.forEach(System.out::println);
  • findById
Bson query = eq("_id", new ObjectId("666a6296f4fe57189cd03eea"));
Todo result = collection.find(query).first();
System.out.println(result);

수정(update) & 삭제(delete)

  • 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배열 값과 일치하지 않음

POJO 방식 vs Document 방식

항목Document 방식POJO 방식
장점유연성, 자유도 높음타입 안정성, 가독성, 유지보수 용이
단점반복 코드 많음, 실수 발생 가능Codec 등록 필요, 초기 설정 복잡
추천 상황복잡한 구조 없이 임시 실습실제 서비스, 팀 개발, 객체지향 지향 시
  • Document 방식
Document doc = new Document("title", "MongoDB").append("done", false);
collection.insertOne(doc);
  • POJO 방식
new Todo(null, "MongoDB", "공부하기", false);

0개의 댓글