티스토리 뷰

반응형

 

 

 



 

 

SpringBoot

 

 

 

엔티티의 LocalDateTime 날짜형식 데이터를 년월(YYYY-MM) 로만 비교해줘야 하는 상황이 생겼다.

그 동안은 String 형식으로 넘어온 날짜데이터를 비교할 때,

AttributeConverter 를 사용해서 mapstruct 에서나 querydsl 에서 사용해왔었다.

 

 

 

[Mapstruct] LocalDateTime To String Converter, 엔티티와 DTO간 타입이 다를때 맵핑하기 (feat.AttributeConverter)

보통 날짜값을 사용할 때 db와 뷰와의 관계에서 컨버팅을 자주 하게 된다. DB에는 예쁘게 들어가있지만 사용자 화면에 그대로 뿌리면 보통 우리가 보던 포맷이 아니기 때문에 매우 별로다. 그래

jong-bae.tistory.com

 

 

 

그 동안 비교값을 LocalDateTime 으로 파싱해서 비교해 쿼리를 작성했는데

역으로 하려니 뜻대로 잘 되지 않았다.

 

 

이런 경우 찾아보니 

Expressions 의 stringTemplate 이나 dateTemplate를 사용하여 DB 함수를 이용하여 포맷을 변경하여 비교해주더라

이 방식으로 해도 되긴하지만 문제가 DB 가 변경되었을때 컨버팅 함수를 직접 수정해줘야 했다.

JPA의 이점이 없어지는 순간...

(바꿀일은 거의 없겠지만 만약 먼 훗날에 바꾼다면 에러를 맞이하겠지...)

 

 

 

그러던 중 qClass 를 열어봤는데

LocalDateTime 데이터형을 DateTimePath<> 형으로 받고 있는것을 뒤늦게 발견했다.

 

public final DateTimePath<java.time.LocalDateTime> regDate = createDateTime("regDate", java.time.LocalDateTime.class);
public class DateTimePath<T extends Comparable> extends DateTimeExpression<T> implements Path<T> {
   ...
}

 

 

 

DateTimeExpression 안에 yearMonth() 메소드가 있는 것을 발견!

public NumberExpression<Integer> yearMonth() {
    if (this.yearMonth == null) {
        this.yearMonth = Expressions.numberOperation(Integer.class, DateTimeOps.YEAR_MONTH, new Expression[]{this.mixin});
    }

    return this.yearMonth;
}

 

 

 

 

내가 원하는데로 년월 비교가 가능할 것인가!!!

sampleEntity.regDate.yearMonth().eq(Integer.valueOf(searchParam.getSearchYearMonth()))
 select
        ...
    from
        ... keywordent0_    
where
    	extract(year       
    from
        keywordent0_.REG_DATE)*100+extract(month       
    from
        keywordent0_.REG_DATE)=202401

 

 

 

결과는 오라클의 날짜변환 함수를 사용하여 YYYYMM 형식의 숫자로 비교를 해주는 것을 확인했다.

(MSSQL이나 mysql 에서도 각각의 DB함수를 사용하여 쿼리를 만들어내는지는 테스트를 좀 더 해보긴 해야겠다.)

 

SELECT 
  EXTRACT(YEAR FROM KEYWORD.REG_DATE)*100 + EXTRACT(MONTH FROM KEYWORD.REG_DATE) AS yyyymm,
FROM KEYWORD

 

년도에 100을 곱한 후 월을 더해주는 방식으로 숫자를 만들어 비교한다.

(년도*100) + 월 = 202403  

 

 

 

검색필터 쿼리여서 간단하게 처리는 했으나

이것이 대용량 조회할 때 이점이 있을지는 모르겠다.

 

 

 

 

 



 

 

반응형
댓글
반응형
최근에 올라온 글
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Total
Today
Yesterday