개발 하나둘셋/Java & Spring

spring 게시판 기간조회 방법! String -> LocalDateTime 변환

유리코딩 2022. 4. 25. 22:16
반응형

개발꿀팁

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에서 입력했던 값이 들어가기 때문에 오류없이 값이 나옵니다

 


해결하고 보면 어려운느낌은 아니지만 실제 작성할 때 방법을 몰라서 시간이 오래걸렸고 결국엔 다른분의 도움을 받아 해결을 했어서 다시 정리해보고자 적어봤습니다!

 

 

 

 

 

 

 

 

반응형