반응형
Querydsl를 사용하던 중 Expressions.stringTemplate을 이용해 MySQL에 DATE_FORAMT을 사용했는데,
실제 API는 잘 작동하지만 Test 코드에서는 DATE_FORMAT 함수가 없다고 오류가 발생했다.
실제 API 데이터베이스는 MySQL을 사용하고 테스트는 H2 Database를 사용했다.
...
Expressions.stringTemplate(
"date_format({0}, '%m')",
user.createdDateTime
),
...
검색해보니 H2에는 DATE_FORMAT 함수가 없고 FORMATDATETIME을 사용해야 하는데 요것을 사용하면 실제 API에서 오류가 발생하고... 그래서 H2 Database에 사용자 정의 alias를 등록해 사용하기로 하였다.
먼저 H2 Database에서 사용할 정적 메서드를 생성한다.
package com.devbeekei.example;
public class H2CustomAlias {
public static String date_format(Date date, String mysqlFormatPattern) throws ParseException {
if (date == null) return null;
String dateFormatPattern = mysqlFormatPattern
.replace("%Y", "yyyy")
.replace("%m", "MM")
.replace("%d", "dd");
return date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate().format(DateTimeFormatter.ofPattern(dateFormatPattern));
}
}
MySql에서도 동작해야하기 때문에 MySql 포맷 패턴으로 받아서 LocalDate 포맷 형태로 치환하고 해당 형태로 포맷해 반환하도록 하였다.
그리고 해당 메서드를 사용하는 테스트를 실행하기 전 alias를 등록해주었다.
@BeforeEach
void before() {
entityManager
.createNativeQuery("CREATE ALIAS IF NOT EXISTS date_format FOR \"com.devbeekei.example.H2CustomAlias.date_format\"")
.executeUpdate();
}
테스트를 진행해보면 정상적으로 진행된다!
사실 날짜 데이터는 테스트 코드에서 검증하지 않지만 해결해보고 싶어서 여기저기 찾아보았다.
반응형
'ETC' 카테고리의 다른 글
Jenkins를 이용한 Docker 컨테이너 자동 배포하기(Blue Ocean, Bitbucket, NCP) (8) | 2022.05.06 |
---|---|
Jenkins를 이용한 프로젝트 자동 배포하기(Bitbucket, EC2) (0) | 2022.05.03 |
인텔리제이 TODO 기능 활용하기 (0) | 2022.01.06 |
최근 Log4j2 취약점 설명 및 해결 방안 (0) | 2021.12.13 |
자주 까먹는 기본적인 Git 명령어 모음 (0) | 2021.10.25 |