Pink Spider/H2에서 mysql function 쓰려면

Created Sun, 01 Jun 2025 20:20:45 +0900 Modified Mon, 08 Dec 2025 08:41:47 +0900
193 Words 1 min

배경

  • local, dev, prod 등 프로파일에선 mysql 셋팅
  • test 프로파일은 h2에 schema.sql, data.sql로 데이터 셋팅
  • nativeQuery를 사용하는 경우 DATE_FORMAT 같은 mysql 함수 사용.
spring:
  datasource:
    url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1

DATE_FORMAT 대체

public class H2Functions {
    public static String formatDate(java.sql.Timestamp timestamp, String format) {
        return new java.text.SimpleDateFormat(format).format(timestamp);
    }
}

schema.sql

CREATE ALIAS IF NOT EXISTS DATE_FORMAT FOR "com.example.H2Functions.formatDate";

Repository

@Query(value = "SELECT DATE_FORMAT(order_date, 'yyyy-MM-dd') AS formatted_date, COUNT(*) " +
               "FROM orders GROUP BY formatted_date", nativeQuery = true)
List<Object[]> findOrderCountGroupedByDate();

위의 코드는 예시이며, 실제로는 h2와 mysql에서 format으로 넘겨주는 형태가 다릅니다. mysql에서는 %m%d, %Y 등으로 쓰고 h2에선 ‘MMdd’, ‘yyyy’ 등을 사용합니다.