IntelliJ Build, Gradle Build 차이점

213kky·2024년 10월 26일

개요


org.springframework.dao.InvalidDataAccessApiUsageException: For queries with named parameters you need to provide names for method parameters; Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters

프로젝트를 진행하면서 위와 같은 오류가 발생하였다.

@Param 어노테이션을 사용하거나,
java8버전이상은 @Param 대신에 Additional command line parameters:부분에 -parameters 옵션 사용하라는 것이다.

(표시한 부분에 넣으면 된다.)

하지만 이전과 달라진 것이 없는 코드인데 왜 이런 문제가 발생했는지 생각해 보다가

build and run을 최근에 아래와 같이 바꾼것이 생각났다.

build and run을 Gradle로 변경하면 다시 원래대로 잘 동작했지만 왜 같은 결과가 아닌지 궁금해져서 찾아보기로 했다.

위 사진은 팀원 분이 작성해 놓으신 코드의 일부이다.

천천히 살펴보니 @Param에 설정한 maxId 부분이 쿼리에 존재하지 않았다.
그래서 아래와 같이 수정하고 실행해 보았다.

그러나 여전히 같은 오류가 발생했다.
뭔가 이상해서 한참 찾아본 결과 처음보는 어노테이션과 함께 잘못 설정되어있던걸 알게되었다...

(넌 뭐야....)

import org.springframework.data.repository.query.Param;

해당 코드로 수정해주고 다시 실행하니 정상적으로 동작하였다.

근데 왜 Gradle로 빌드 후 실행을 하면 정상적으로 동작하였는지 살펴봤다.

인텔리제이는 빌드가 되면 /out에 빌드 파일이 생성된다고 한다.
아래는 /out에 있는 해당 소스가 컴파일 된 코드이다.

import org.springframework.data.repository.query.Param;

해당 어노테이션이 정상적으로 위와 같이 설정되어있었다면 메소드 파라미터가 var1, var2 이런식으로 되어있어도 @Param 부분으로 인식하여 동작에 문제가 없는 것으로 보이지만, @Param이 잘못 설정되어 인식하지 못해 발생한 오류로 보인다.


그렇다면 Gradle로 빌드하고 실행을 하면 왜 정상적으로 동작을 했을까?
아래는 코드 수정전 Gradle로 빌드 시 생기는 컴파일 된 코드이다.

잘못된 어노테이션 설정으로 인해 @Param 설정은 무시되고, 메소드 파라미터가 var1, var2가 아닌 원래 메소드 파라미터로 되어있어 정상 동작을 했던것이다.


해결


Gradle을 사용해서 빌드하고 실행(권장)

참고로 이 문제는 Build, Execution, Deployment -> Build Tools -> Gradle에서
Build and run using를 IntelliJ IDEA로 선택한 경우에만 발생한다. Gradle로 선택한 경우에는 Gradle이 컴파일 시점에 해당 옵션을 자동으로 적용해준다.

문제 원인

공식 링크: https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#parameter-name-retention

자바를 컴파일할 때 매개변수 이름을 읽을 수 있도록 남겨두어야 사용할 수 있다. 컴파일 시점에 -parameters 옵션을 사용하면 매개변수 이름을 사용할 수 있게 남겨둔다.
스프링 부트 3.2 전까지는 바이트코드를 파싱해서 매개변수 이름을 추론하려고 시도했다. 하지만 스프링 부트 3.2 부터는 이런 시도를 하지 않는다.


[출처] 인프런 김영한님의 자주 하는 질문
https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.b1yk4ued1pxo

profile
since 2022

0개의 댓글