MongoTemplate을 활용한 MongoDB 데이터 관리

주요 애노테이션

@Document
클래스를 MongoDB 컬렉션에 매핑하며 컬렉션 이름을 지정합니다.

@Id / @MongoId
_id 필드 매핑에 사용되며 String 또는 ObjectId 타입을 지원합니다. 미사용 시 'id' 필드가 자동 매핑됩니다.

@Indexed
쿼리 성능 향상을 위한 필드 인덱싱을 선언합니다.

@Field
Java 필드명과 컬렉션 필드명이 상이할 때 매핑 조정에 활용됩니다.

@Transient
해당 필드의 데이터베이스 영속화를 방지합니다.

@DBRef
다른 컬렉션과의 참조 관계를 설정합니다(단, 캐스케이드 저장 미지원).

<code>@Data
@Document("user_data")
public class UserEntity {

    @Id
    private String recordId;
    
    @Indexed
    private Integer accountStatus;
    
    @Field("registration_time")
    private Long regTimestamp;
    
    @Transient
    private String nonPersistentField;
    
    @DBRef
    private List<ExternalService> linkedServices;
}</code>

CRUD 연산 메서드

삽입: insert()는 배치 삽입에 효율적이며 중복 키 예외를 발생시킵니다. save()는 존재하는 데이터를 업데이트합니다.

삭제: remove() 또는 findAndRemove()로 엔티티/조건 기반 삭제

조회: find(), findOne(), findById(), findAll() 활용

갱신: updateFirst() 단일 문서 갱신, update() 다중 문서 갱신

<code>// 삽입
mongoTemplate.insert(UserEntity.class);
mongoTemplate.save(new UserEntity());

// 갱신
mongoTemplate.updateFirst(
  Query.query(Criteria.where("status").is(1)), 
  Update.update("role", "admin"), 
  UserEntity.class
);

// 삭제
mongoTemplate.remove(Query.query(Criteria.where("inactive").is(true)), UserEntity.class);

// 조회
mongoTemplate.find(Query.query(Criteria.where("department").is("IT")), UserEntity.class);</code>

쿼리 구성 기법

Criteria로 조건을 정의하고 Query 객체에 적용합니다:

<code>// 정확한 값 매칭
Criteria condition = Criteria.where("email").is("user@domain.com");

// 정규식 패턴 검색
Pattern emailPattern = Pattern.compile(".*@domain\\.com$");
condition.and("email").regex(emailPattern);

// 날짜 범위 쿼리
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
condition.and("joinDate").gt(dateFormat.parse("2023-01-01"))
          .lte(dateFormat.parse("2023-12-31"));

// OR 조건 구성
Criteria orCondition = new Criteria().orOperator(
    Criteria.where("status").is(1),
    Criteria.where("premium").is(true)
);

// 정렬 및 페이지네이션
Query userQuery = new Query(condition)
    .with(Sort.by(Sort.Direction.DESC, "lastLogin"))
    .limit(50)
    .skip(100);</code>

태그: SpringDataMongoDB MongoTemplate CRUDOperations QueryDSL DataModeling

7월 30일 15:43에 게시됨