개발꿀팁
spring 게시판 기간조회 방법! String -> LocalDateTime 변환
프로젝트 중 게시글을 임의의 기간으로 조회하는 기능이 필요해서 작성해봤습니다! 기간을 직접입력해서 조회할 때, String으로 받은 날짜데이터를 LocalDateTime으로 변환시키는게 핵심!
백엔드 코드로 view쪽은 없습니다~
게시판 기간 조회하기!
Controller
RequestParam으로 시작날짜와 끝나는 날짜를 받아줍니다. 직접입력하는 날짜를 받기 때문에 String으로 받습니다. 저는 페이징처리를위해 Pageable도 사용했어요
@GetMapping("/post")
public PageImpl<PostResponseDto> getPostList(@RequestParam(value = "searchStartDate", required = false) String searchStartDate,
@RequestParam(value = "searchEndDate", required = false) String searchEndDate,
@PageableDefault(sort = "id", direction = Sort.Direction.DESC) Pageable pageable
) {
return postService.getPostList(searchStartDate, searchEndDate, pageable));
}
Service
String으로 받은 데이터가 빈값일 대는 임의의 날짜를 넣어줍니다. 저는 시작날짜에 "00010101", 끝나는 날짜에 "99991231"을 넣어줬어요 LocalDateTime.MAX(MIN)도 사용해봤지만 데이터값이 '+999999999-12-31T23:59:59.999999999', '-999999999-01-01T00:00:00'같이 너무 터무니 없는 값이라그런지 오류가 나더라고요(제가 잘 못 적용했을 수도^^;)
시작날짜와 끝나는 날짜는 LocalDate.parse(String, 입력패턴)으로 String으로 입력된 날짜값을 변환시켜줍니다. 제가 필요한 값은 LocalDateTime이기 때문에 뒤에 atTime()을 통해 시간을 임으로 입력합니다.
저는 QueryDsl을 사용했기 때문에 물고있는 값들을 Repository로 보내주었습니다!
public PageImpl<PostResponseDto> getPostList(String searchStartDate, String searchEndDate, Pageable pageable) {
// 입력된 날짜가 빈값일 때
if (searchStartDate == "") {
searchStartDate = "00010101";
}
if (searchEndDate == "") {
searchEndDate = "99991231";
}
// String으로 들어오는 날짜 데이터 변환
LocalDateTime startDateTime = LocalDate.parse(searchStartDate, DateTimeFormatter.ofPattern("yyyyMMdd")).atTime(0, 0, 0);
LocalDateTime endDateTime = LocalDate.parse(searchEndDate, DateTimeFormatter.ofPattern("yyyyMMdd")).atTime(23, 59, 59);
return postQueryRepository.filter(startDateTime, endDateTime, pageable);
}
Repository
저는 작업중인 프로젝트에서 querydsl을 사용하여서 querydsl을 사용하여 작성해봤습니다. Service에서 String -> LocalDateTime으로 변환된 파라미터를 where절에서 조건으로 사용해줍니다. 조건은 물론 작성날짜를 대상으로 시작날짜와 마지막날짜 사이의 글들을 조회하는 것!
public class PostQueryRepository extends QuerydslRepositorySupport {
private final JPAQueryFactory queryFactory;
public PostQueryRepository(JPAQueryFactory factory) {
super(Post.class);
this.queryFactory = factory;
}
public PageImpl<PostResponseDto> filter(LocalDateTime searchStartDate, LocalDateTime searchEndDate, Pageable pageable) {
JPQLQuery<PostResponseDto> result = queryFactory
.select(Projections.fields(PostResponseDto.class,
post.id, post.title, post.cont, post.created_at))
.from(post)
// 생성날짜 기준으로 시작날짜와 마지막날짜 사이의 데이터 조건
.where(post.created_at.between(searchStartDate, searchEndDate))
.orderBy(post.id.desc());
long totalCnt = result.fetchCount();
List<PostResponseDto> list = getQuerydsl().applyPagination(pageable, result).fetch();
return new PageImpl<PostResponseDto.ListDto>(list, pageable, totalCnt);
}
Postman
RequestParam으로 파라미터를 보냈기 때문에 주소창에 입력데이터가 들어갑니다. 빈값으로 보낼경우 Service에서 입력했던 값이 들어가기 때문에 오류없이 값이 나옵니다
해결하고 보면 어려운느낌은 아니지만 실제 작성할 때 방법을 몰라서 시간이 오래걸렸고 결국엔 다른분의 도움을 받아 해결을 했어서 다시 정리해보고자 적어봤습니다!
'개발 하나둘셋 > Java & Spring' 카테고리의 다른 글
SpringBoot SMTP서버를 활용한 메일 보내기 (0) | 2022.06.07 |
---|---|
spring 게시판 기간조회 동적으로 처리하기 querydsl (0) | 2022.05.18 |
스프링 DI ,IOC, AOP (0) | 2022.04.11 |
Spring에서 Redis Sorted set으로 인기검색어 순위 나타내기 (4) | 2022.01.15 |
SpringBoot기반 Redis Cache (0) | 2022.01.13 |