MongoDB

MongoDB 의 MongoTemplate 활용하기 - JPA 위에 덧씌우기

최쌈장 2023. 7. 1. 22:55

 

Repository 설정

기본적으로 JPA를 활용해서 DB를 활용하는 경우 CRUDrepository나, JPARepository를 상속받아 사용하는 경우가 많다.

다만 MongoDB는 마치 QueryDsl 마냥 객체지향적으로 ODM를 활용할 수 있는 툴이 있는데, 바로 MongoTemplate이다.

 

사용하는 방법은 간단하다. 기본 Repository에 interface가 될 파일을 상속해주고 Impl 파일을 통해서 구현해주면 된다. 해당 예시는 cafe의 테이블 예약을 구현하는 Reserved Document를 처리하는 repository이다.

 

1) ReservedRepository

public interface ReservedRepository extends MongoRepository<Reserved, String>, ReservedRepositoryTemplate {


}

 

2) ReservedRepositoryTemplate

public interface ReservedRepositoryTemplate {

    List<Reserved> findReservedByIdAndTableIdBetweenTime(String cafeId, String tableId,LocalDateTime time);

}

 

3) ReservedRepositoryTemplateImpl

public class ReservedRepositoryImpl implements ReservedRepositoryTemplate{
    @Autowired private MongoTemplate mongoTemplate;

	@Override
    public List<Reserved> findReservedByIdAndTableIdBetweenTime(String cafeId, String tableId, LocalDateTime time) {
        LocalDateTime startDateTime = LocalDateTime.of(time.toLocalDate(), LocalTime.MIN);
        LocalDateTime endDateTime = LocalDateTime.of(time.toLocalDate(), LocalTime.MAX);

        Criteria criteria = Criteria.where("reservedStartTime").gte(startDateTime).lte(endDateTime)
                .and("tableId").is(tableId);
        Query query = new Query(criteria)
                .with(Sort.by(Sort.Direction.ASC, "reservedStartTime"));

        return mongoTemplate.find(query, Reserved.class);
    }

}

MongoTemplate를 상속하고, 해당 document에 해당하는 where 절과, 해당 부분을 sort하는 방식을 Query문의 방식으로 나타낸 것이다. 이때 MongoTemplate 내재된 함수에 query객체를 매개변수로 넣고, output이 되는 document의 class와 함께 작성해주면 된다.

 

* gte()는 보다 높은 수치를 갖는 것의 filter, lte()는 보다 낮은 수치를 갖는 것의 filter이다. 즉, 하루의 시작과 끝 사이에 있는 요소들을 모두 조회하겠다는 method라고 생각하면 된다.

 

* 주의해야 할 점은, MongoDB는 LocalDatetime에서 설정한 시간과 9시간 차이가 나도록 설정해주어야 한다. MongoDB의 시간대는 UTC이고 한국은 UTC+9로 계산되기 때문이다. 그래서 data를 가져올 때 filter해서 가져오는 것이 필요하다.