JPQL과 @Param 어노테이션 그리고 Gradle과 IntelliJ 빌드 방식

크리링·2023년 3월 8일
0

오늘의 문제

목록 보기
4/9
post-thumbnail

나한테는 잘 동작하지만 remote에서 fork 받은 다른 사용자한테는 안되는 코드가 있다?!




문제

오류 내용은 다음과 같았다.

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

JPQL 사용시 파라미터 바인딩에서 나는 에러였다.



해결

해결은 생각보다 간단했다. JPQL을 사용할 때 내가 파라미터에 스프링 데이터가 제공하는 @Param 어노테이션을 타입 앞에 안 붙여주었기에 이런 에러가 났던 것이다.

그렇기에 해결은 @Param 어노테이션을 붙여서 나도 잘 동작하고, 다른 유저에게도 잘 동작하게 할 수 있었다. 그렇다면 또 다른 궁금증으로 왜 나한테만 돌아갔을까?






또 다른 문제

왜 내 로컬에서만 @Param 어노테이션 설정 없이 파라미터를 잘 인식하고 동작했을까?

자바 8 이상의 버전에서 -parameters 컴파일 플래그를 사용하면 파라미터 바인딩시 해당 상황에서 오류가 발생하지 않는다는 것이다. 하지만 이 부분은 다른 유저들 모두 openJDK 11 버전 이상이어서 아니었다.

아무래도 내 컴파일 부분에서 어떤 다른 유저들과 다른 부분이 있는 것 같다.

이 부분을 다른 글 들을 찾아보다가 발견하게되었다.

나의 Intellij 에서 Build and runGradle에서 Intellij IDEA로 바꾸면 아까처럼 파라미터 바인딩을 위해 @Param 어노테이션을 사용하지않으면 오류가 발생하였다. 그렇다면 Build and run에서 GradleIntellij IDEA에서의 차이는 무엇일까?






Build and Run

build and run 과정에서 컴파일과 빌드 두 과정이 모두 일어나고 동시에 IDEA에서는 실행까지 해준다. 둘 중에서 IntelliJ IDEA를 사용하면 더 빠르게 실행 된다고 알고다. 그렇다면 두 과정에서 무슨 차이가 있을까?



Compile

컴파일은 자바와 같은 사람이 이해할 수 있는 프로그래밍 언어로 작성된 코드를 컴퓨터가 이해할 수 있는 더욱 저차원적인 코드 또는 기계어로 변환하는 것을 의미한다. 자바의 경우 JVM(Java Virtual Machine)이 컴파일러 역할을 수행해 주고있다. 이와 같은 컴파일 과정을 거치면서 프로그래밍 언어로 작성된 코드가 문법적으로 이상은 없는지 또는 Checked Exception은 없는지 검사를 하고 그것을 알려준다.

Build

빌드는 컴파일이 포함된 일종의 과정으로, 프로그래밍 된 코드를 컴파일하고 실행 가능한 결과물로 만드는 과정이다. IDEA에서는 보통 실행을 시키면 컴파일을 포함한 빌드 과정을 거쳐 실행 가능한 결과물을 만들고 그것을 실행시킨다.



Gradle Build vs IntelliJ IDEA Build

두 빌드 설정은 실행 가능한 결과물을 만드는 방식의 차이인데, Gradle은 오픈 소스 빌드 자동화 도구이고 IntelliJ IDEA는 인텔리제이 자체 제공하는 빌드 자동화 도구이다.

두 방식의 가장 큰 차이는 증분 빌드이다.

증분 빌드

증분 빌드는 용어 그대로 부분, 변경된 부분만 빌드를 하는 방식으로 변경되지 않은 것에 대해서는 건너뛰고 빌드를 진행해서 빠른 빌드를 원할 경우 선택하는 방법이다. IntelliJ IDEA가 증분 빌드이다. 그래서 속도가 비교했을때 더 빠르다.

하지만 증분 빌드는 건너뛰고 빌드를 진행해 빌드 중 오류가 발생할 수 있다. 따라서 정확한 빌드를 원한다면 IntelliJ IDEA빌드 방식이 아닌 Gradle 빌드 방식을 선택해야 하는 것이다.

추가적으로 Gradlebuild 폴더로 빌드 결과물이 나오고 IntelliJ IDEA에서는 out 폴더로 빌드 결과물이 나오는 차이도 있다.






Gradle Wrapper를 사용하는 목적

이미 존재하는 프로젝트를 새로운 환경에 설치할 때, 별도의 설치 없이 바로 빌드할 수 있게 하기 위한 것이 Gradle Wrapper이다. (JavaGradle 설치 필요 없고, 기존 로컬에 설치된 Gradle 또는 Java의 버전도 신경 쓸 필요가 없음)

gradlew

유닉스용 실행 스크립트

gradle build

위와 같이하면 로컬에 설치된 gradle을 사용.
이 경우에 Java나 Gradle이 설치되어 있어야 하고, 새로 받은 프로젝트의 Gradle 버전과 로컬에 설치된 Gradle 버전이 호환되지 않으면 문제가 발생할 수 있다.



./gradlew build

위와 같이 하면 Gradle Wrapper를 사용해서 위에서 언급한 문제가 발생하지 않는다.


gradle/wrapper/gradle-wrapper.jar

Wrapper 파일
gradlew이 이 파일을 이용해서 gradle task를 실행하기 때문에 로컬 환경의 영향을 받지 않는다.


gradle/wrapper/gradle-wrapper.properties

Wrapper 설정 파일


build.gradle

의존성이나 플로그인 설정 등을 위한 스크립트 파일






위에 GradleIntelliJ IDEA의 빌드 방식 내용을 보았을 때 나의 경우에는 내 설정 파일이 Gradle에서는 들어가는데 IntelliJ IDEA에서는 들어가지 않는 경우인 것으로 보인다. 앞으로는 다른 유저들과 오류를 비슷하게 겪고 속도가 빠른 InteglliJ IDEA 빌드 방식을 사용하고, 정확한 빌드 방식이 필요할 때 Gradle 빌드 방식을 사용할 예정이다. 뿐만 아니라 왜 start.spring.io 에서 프로젝트를 생성시에 gradle/wrapper를 같이 만들어주는 이유와 편리하게 설정을 맞춰 준다는 것을 알게되었다.



출처 및 참고 :
Java 8 Spring Data JPA Parameter binding
JPQL 에러 질문 - 인프런,
안녕하세요 Build and run 질문입니다. - 인프런
Build Gradle vs IntelliJ IDEA
Gradle & Build 그리고 IntelliJ의 Build

0개의 댓글