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해서 가져오는 것이 필요하다.
'MongoDB' 카테고리의 다른 글
MongoDB JPA 처럼 객체로 foreignkey를 사용할 수 없을까? (0) | 2023.07.03 |
---|---|
MongoDB 에서 lookup을 활용해보자! - with spring boot (0) | 2023.07.02 |