스프링 부트 2.7.9 native query 에러
spring boot 2.7.9로 올리는거 검토하면서 native query 사용한 repository 주입한 빈 생성 실패해서 추적해보니 이게 내부적으로 counting query인지 판별하는 부분에서 버그가 있네요.아래는 QueryUtils라는 class의 메소드입니다.코드 세그먼트를 보면 countProjection이 null인 경우 variable이 null이 되는 케이스가 분명히 존재하는데 그에 대한 방어가 없이 nativeQuery가 true인 경우 variable.contains를 수행해서 NPE가 발생하면서 빈 생성이 실패하는 경우더라고요.static String createCountQueryFor(String originalQuery, @Nullable String countProjection, boolean nativeQuery) { Assert.hasText(originalQuery, "OriginalQuery must not be null or empty!"); Matcher matcher = COUNT_MATCH.matcher(originalQuery); String countQuery; if (countProjection == null) { String variable = matcher.matches() ? matcher.group(VARIABLE_NAME_GROUP_INDEX) : null; boolean useVariable = StringUtils.hasText(variable) // && !variable.startsWith("new") // select [new com.example.User... && !variable.startsWith(" new") // select distinct[ new com.example.User... && !variable.startsWith("count(") // select [count(... && !variable.contains(","); String complexCountValue = matcher.matches() && StringUtils.hasText(matcher.group(COMPLEX_COUNT_FIRST_INDEX)) ? COMPLEX_COUNT_VALUE : COMPLEX_COUNT_LAST_VALUE; String replacement = useVariable ? SIMPLE_COUNT_VALUE : complexCountValue; if (nativeQuery && (variable.contains(",") || "*".equals(variable))) { replacement = "1"; } else { String alias = QueryUtils.detectAlias(originalQuery); if (("*".equals(variable) && alias != null)) { replacement = alias; } } countQuery = matcher.replaceFirst(String.format(COUNT_REPLACEMENT_TEMPLATE, replacement)); } else { countQuery = matcher.replaceFirst(String.format(COUNT_REPLACEMENT_TEMPLATE, countProjection)); } return countQuery.replaceFirst(ORDER_BY_PART, ""); }