ETC
H2 Database 사용자 정의 함수 만들기
Beekei
2022. 4. 19. 15:00
반응형
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();
}
테스트를 진행해보면 정상적으로 진행된다!
사실 날짜 데이터는 테스트 코드에서 검증하지 않지만 해결해보고 싶어서 여기저기 찾아보았다.
반응형