Caused by: org.apache.ibatis.binding.BindingException: Parameter 'sysId' not found. Available parameters are [arg1, arg0, param1, param2]
가끔씩 해당 오류가 발생하곤 했다.
일반적으로는 아래와 같이 Mapper 클래스의 메서드 파라미터의 변수명과 Mapper.xml에서 사용하는 변수명을 실수로 다르게 작성해서 발생하는 문제였어서 간단했다.
Available parameters are [sysId, param1, param2]
하지만 종종 이름이 같음에도 BindingException이 발생하는 경우가 있었다.
이에 대해 좀 더 알아보려고 한다.
문제의 상황은 아래와 같다.
클래스와 매퍼 모두 sysId 이름이 동일함에도 BindingException이 발생하였다.
원래 같으면 아래와 같은 오류 메시지가 나와야할텐데
Available parameters are [sysId, ..]
현재 오류 메시지를 보면 내가 전달한 sysId 파라미터는 보이지 않고 arg0,1과 같은 파라미터들만 보인다.
Available parameters are [arg1, arg0, param1, param2]
컴파일된 class 파일을 디컴파일 해보면 아래와 같다.
이와 관련해서 찾아보면 javac 명령에는 -parameters라는 옵션이 존재한다.
-parametersGenerates metadata for reflection on method parameters.
Stores formal parameter names of constructors and methods in the generated class file so that the method java.lang.reflect.Executable.getParameters from the Reflection API can retrieve them.
-parameters 메서드 매개변수에 대한 반영을 위한 메타데이터를 생성합니다.
Reflection API의 java.lang.reflect.Executable.getParameters 메소드가 검색할 수 있도록
생성자 및 메소드의 형식 매개변수 이름을 생성된 클래스 파일에 저장합니다
인텔리제이에서 javac에 -parameters 옵션을 설정하고 다시 빌드해 보자
아까처럼 class를 디컴파일 해보면 sysId, name이 유지되는 것을 알 수 있다.
이제 테스트를 해보면 정상적으로 동작하는 것을 알 수 있다.
결론
1) 클래스에 정의한 파라미터명과 매퍼에서 사용하는 파라미터명이 맞는지 확인하자
2) 컴파일 시 parameters 옵션이 설정되어 있지 않은 경우 class가 생성될 때 parameter name이 유실된다. javac parameters 옵션을 설정한다.
3) 혹은 @Param 옵션을 통해 지정해 준다.
Q1) 왜 -parameters 옵션을 안 주면 기본적으로는 parameter name을 제거하는 걸까? (예: sysId -> arg0)
A2) 파라미터 네임 또한 보안상 이슈가 될 수 있으므로 제거하는 걸로 알고 있다. 실제 리플렉션 같은 기술이 필요하지 않은 경우 해당 파라미터명, 메서드명, 테이블명 등은 실제 data가 중요한 거지 변수명(alias)들은 사용자가 다룰 때 의미가 있는 것인지, 프로그램(JVM) 입장에서 별다른 의미를 갖진 않을 듯하다.
Q2) 디컴파일시 var1, var2로 표현되는데 에러로그에는 왜 arg0, arg1로 표현되는 걸까?
A2) 디컴파일은 100% 원래대로 돌려놓는 건 아닌 걸로 알고 있다. 크게 중요하진 않을 듯하다.
todo
todo#1
아래 블로그를 참고해서 동작 방식을 디버깅해 보자
todo#2
현재 문제가 발생한 환경은 IntelliJ IDEA로 실행하고 있다.
Gradle로 설정하면 잘 동작한다. Gradle 환경에서는 왜 정상적으로 동작할까?
참고
'개발' 카테고리의 다른 글
자바의 역사, 핫스팟JVM, 자바의 미래 (7) | 2024.09.22 |
---|---|
[클릭하우스 ClickHouse] OS 서비스 계정 및 config, data, log 경로 변경하기 (0) | 2024.07.30 |
자바의 형변환(자동형변환, 명시적형변환) (1) | 2024.06.17 |