관리 메뉴

피터의 개발이야기

[Kotlin] QueryDSL에서 YYYY-MM로 검색하기 본문

Programming/Kotlin

[Kotlin] QueryDSL에서 YYYY-MM로 검색하기

기록하는 백앤드개발자 2024. 7. 16. 10:10
반응형

ㅁ 들어가며

ㅇ 대부분의 일자 데이터들은 YYYY-MM-DD, 년월일의 형태를 띄고 있지만, 오늘 개발했던 데이터는 YYYY-MM의 형태였다.

Kotlin에서 Querydsl을 사용하여 YYYY-MM 형태의 날짜를 between 조건으로 검색하자, 파싱 에러가 발생하였다.

 

ㅁ Querydsl에서  YYYY-MM로 검색하는 방법

ㅇ Kotlin에서 Querydsl을 사용하여 YYYY-MM 형태의 날짜를 between 조건으로 검색하는 방법

  1. 먼저 YYYY-MM 형태의 문자열을 날짜 객체로 변환한다.
  2. 해당 월의 시작일과 종료일을 계산한다.
  3. between 조건을 사용하여 쿼리를 작성한다.

 

ㅁ YYYY-MM 검색 예시

import com.querydsl.jpa.impl.JPAQueryFactory
import java.time.LocalDate
import java.time.YearMonth
import java.time.format.DateTimeFormatter

fun searchBetweenYearMonth(queryFactory: JPAQueryFactory, yearMonth: String) {
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM")
    val ym = YearMonth.parse(yearMonth, formatter)
    
    val startDate = ym.atDay(1)
    val endDate = ym.atEndOfMonth()

    val query = queryFactory
        .selectFrom(qEntity)
        .where(qEntity.date.between(startDate, endDate))
        .fetch()
}

 

YearMonth.parse()를 사용하여 YYYY-MM 문자열을 YearMonth 객체로 변환했다.

ㅇ atDay(1)로 해당 월의 첫 날을, atEndOfMonth()로 해당 월의 마지막 날을 구한다.

ㅇ Querydsl의 between() 메소드를 사용하여 시작일과 종료일 사이의 데이터를 조회한다.

 

ㅁ 

# Test용으로 테이블 생성
[2024-07-11 22:06:59] Connected
> create database test
[2024-07-11 22:06:59] 1 row affected in 67 ms
> use test
[2024-07-11 22:09:14] completed in 29 ms
test> create table monthDataTest(
             id          bigint auto_increment comment 'ID'
              primary key,
          month_date  varchar(7) null comment 'YYYY-MM',
          created_at  datetime(6) null comment '생성 시간',
          updated_at  datetime(6) null comment '수정 시간',
          work_type   varchar(30) null comment '근무형태 타입'
      )
[2024-07-11 22:09:22] completed in 111 ms

# data 생성
test> insert into monthDataTest (month_date, created_at, updated_at, work_type) value ('2024-07', now(), now(), 'workingHard')
[2024-07-11 22:22:54] 1 row affected in 39 ms

 

 

# YYYY-MM 테이터 조회
select *
from monthDataTest
where month_date between '2024-01' and '2024-08';

ㅇ MySQL에서는 YYYY-MM 형태의 String으로 검색을 해도 문제가 없다.

 

ㅇ Querydsl의 between의 from과 end의 자료형은 LocalDateTime이기 때문에 형에 맞추저 변환하지 않으면 Exception이 발생한다.

 

ㅁ 마무리

이 방법을 사용하면 특정 년월에 해당하는 데이터를 효과적으로 조회할 수 있다. 단, 실제 사용 시에는 프로젝트의 엔티티 구조와 날짜 필드의 타입에 따라 약간의 조정이 필요할 수 있다.

반응형
Comments